1 /* 2 * QEMU DBus display 3 * 4 * Copyright (c) 2021 Marc-André Lureau <marcandre.lureau@redhat.com> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to deal 8 * in the Software without restriction, including without limitation the rights 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 * copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in 14 * all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 * THE SOFTWARE. 23 */ 24 #ifndef UI_DBUS_H_ 25 #define UI_DBUS_H_ 26 27 #include "chardev/char-socket.h" 28 #include "qemu/dbus.h" 29 #include "qom/object.h" 30 #include "ui/console.h" 31 #include "ui/clipboard.h" 32 33 #include "dbus-display1.h" 34 35 typedef struct DBusClipboardRequest { 36 GDBusMethodInvocation *invocation; 37 QemuClipboardType type; 38 guint timeout_id; 39 } DBusClipboardRequest; 40 41 struct DBusDisplay { 42 Object parent; 43 44 DisplayGLMode gl_mode; 45 bool p2p; 46 char *dbus_addr; 47 char *audiodev; 48 DisplayGLCtx glctx; 49 50 GDBusConnection *bus; 51 GDBusObjectManagerServer *server; 52 QemuDBusDisplay1VM *iface; 53 GPtrArray *consoles; 54 GCancellable *add_client_cancellable; 55 56 QemuClipboardPeer clipboard_peer; 57 QemuDBusDisplay1Clipboard *clipboard; 58 QemuDBusDisplay1Clipboard *clipboard_proxy; 59 DBusClipboardRequest clipboard_request[QEMU_CLIPBOARD_SELECTION__COUNT]; 60 61 Notifier notifier; 62 }; 63 64 #define TYPE_DBUS_DISPLAY "dbus-display" 65 OBJECT_DECLARE_SIMPLE_TYPE(DBusDisplay, DBUS_DISPLAY) 66 67 void dbus_display_notifier_add(Notifier *notifier); 68 69 #define DBUS_DISPLAY_TYPE_CONSOLE dbus_display_console_get_type() 70 G_DECLARE_FINAL_TYPE(DBusDisplayConsole, 71 dbus_display_console, 72 DBUS_DISPLAY, 73 CONSOLE, 74 GDBusObjectSkeleton) 75 76 DBusDisplayConsole * 77 dbus_display_console_new(DBusDisplay *display, QemuConsole *con); 78 79 int 80 dbus_display_console_get_index(DBusDisplayConsole *ddc); 81 82 #define DBUS_DISPLAY_TYPE_LISTENER dbus_display_listener_get_type() 83 G_DECLARE_FINAL_TYPE(DBusDisplayListener, 84 dbus_display_listener, 85 DBUS_DISPLAY, 86 LISTENER, 87 GObject) 88 89 DBusDisplayListener * 90 dbus_display_listener_new(const char *bus_name, 91 GDBusConnection *conn, 92 DBusDisplayConsole *console); 93 94 DBusDisplayConsole * 95 dbus_display_listener_get_console(DBusDisplayListener *ddl); 96 97 const char * 98 dbus_display_listener_get_bus_name(DBusDisplayListener *ddl); 99 100 extern const DisplayChangeListenerOps dbus_gl_dcl_ops; 101 extern const DisplayChangeListenerOps dbus_dcl_ops; 102 103 #define TYPE_CHARDEV_DBUS "chardev-dbus" 104 105 typedef struct DBusChardevClass { 106 SocketChardevClass parent_class; 107 108 void (*parent_chr_be_event)(Chardev *s, QEMUChrEvent event); 109 } DBusChardevClass; 110 111 DECLARE_CLASS_CHECKERS(DBusChardevClass, DBUS_CHARDEV, 112 TYPE_CHARDEV_DBUS) 113 114 typedef struct DBusChardev { 115 SocketChardev parent; 116 117 bool exported; 118 QemuDBusDisplay1Chardev *iface; 119 } DBusChardev; 120 121 DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS) 122 123 #define CHARDEV_IS_DBUS(chr) \ 124 object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_DBUS) 125 126 typedef enum { 127 DBUS_DISPLAY_CHARDEV_OPEN, 128 DBUS_DISPLAY_CHARDEV_CLOSE, 129 } DBusDisplayEventType; 130 131 typedef struct DBusDisplayEvent { 132 DBusDisplayEventType type; 133 union { 134 DBusChardev *chardev; 135 }; 136 } DBusDisplayEvent; 137 138 void dbus_display_notify(DBusDisplayEvent *event); 139 140 void dbus_chardev_init(DBusDisplay *dpy); 141 142 void dbus_clipboard_init(DBusDisplay *dpy); 143 144 #endif /* UI_DBUS_H_ */ 145