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 25 #ifndef UI_DBUS_H 26 #define UI_DBUS_H 27 28 #include "chardev/char-socket.h" 29 #include "qemu/dbus.h" 30 #include "qom/object.h" 31 #include "ui/console.h" 32 #include "ui/clipboard.h" 33 34 #include "dbus-display1.h" 35 36 typedef struct DBusClipboardRequest { 37 GDBusMethodInvocation *invocation; 38 QemuClipboardType type; 39 guint timeout_id; 40 } DBusClipboardRequest; 41 42 struct DBusDisplay { 43 Object parent; 44 45 DisplayGLMode gl_mode; 46 bool p2p; 47 char *dbus_addr; 48 char *audiodev; 49 DisplayGLCtx glctx; 50 51 GDBusConnection *bus; 52 GDBusObjectManagerServer *server; 53 QemuDBusDisplay1VM *iface; 54 GPtrArray *consoles; 55 GCancellable *add_client_cancellable; 56 57 QemuClipboardPeer clipboard_peer; 58 QemuDBusDisplay1Clipboard *clipboard; 59 QemuDBusDisplay1Clipboard *clipboard_proxy; 60 DBusClipboardRequest clipboard_request[QEMU_CLIPBOARD_SELECTION__COUNT]; 61 62 Notifier notifier; 63 }; 64 65 #define TYPE_DBUS_DISPLAY "dbus-display" 66 OBJECT_DECLARE_SIMPLE_TYPE(DBusDisplay, DBUS_DISPLAY) 67 68 void dbus_display_notifier_add(Notifier *notifier); 69 70 #define DBUS_DISPLAY_TYPE_CONSOLE dbus_display_console_get_type() 71 G_DECLARE_FINAL_TYPE(DBusDisplayConsole, 72 dbus_display_console, 73 DBUS_DISPLAY, 74 CONSOLE, 75 GDBusObjectSkeleton) 76 77 DBusDisplayConsole * 78 dbus_display_console_new(DBusDisplay *display, QemuConsole *con); 79 80 int 81 dbus_display_console_get_index(DBusDisplayConsole *ddc); 82 83 84 extern const DisplayChangeListenerOps dbus_console_dcl_ops; 85 86 #define DBUS_DISPLAY_TYPE_LISTENER dbus_display_listener_get_type() 87 G_DECLARE_FINAL_TYPE(DBusDisplayListener, 88 dbus_display_listener, 89 DBUS_DISPLAY, 90 LISTENER, 91 GObject) 92 93 DBusDisplayListener * 94 dbus_display_listener_new(const char *bus_name, 95 GDBusConnection *conn, 96 DBusDisplayConsole *console); 97 98 DBusDisplayConsole * 99 dbus_display_listener_get_console(DBusDisplayListener *ddl); 100 101 const char * 102 dbus_display_listener_get_bus_name(DBusDisplayListener *ddl); 103 104 extern const DisplayChangeListenerOps dbus_gl_dcl_ops; 105 extern const DisplayChangeListenerOps dbus_dcl_ops; 106 107 #define TYPE_CHARDEV_DBUS "chardev-dbus" 108 109 typedef struct DBusChardevClass { 110 SocketChardevClass parent_class; 111 112 void (*parent_chr_be_event)(Chardev *s, QEMUChrEvent event); 113 } DBusChardevClass; 114 115 DECLARE_CLASS_CHECKERS(DBusChardevClass, DBUS_CHARDEV, 116 TYPE_CHARDEV_DBUS) 117 118 typedef struct DBusChardev { 119 SocketChardev parent; 120 121 bool exported; 122 QemuDBusDisplay1Chardev *iface; 123 } DBusChardev; 124 125 DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS) 126 127 #define CHARDEV_IS_DBUS(chr) \ 128 object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_DBUS) 129 130 typedef enum { 131 DBUS_DISPLAY_CHARDEV_OPEN, 132 DBUS_DISPLAY_CHARDEV_CLOSE, 133 } DBusDisplayEventType; 134 135 typedef struct DBusDisplayEvent { 136 DBusDisplayEventType type; 137 union { 138 DBusChardev *chardev; 139 }; 140 } DBusDisplayEvent; 141 142 void dbus_display_notify(DBusDisplayEvent *event); 143 144 void dbus_chardev_init(DBusDisplay *dpy); 145 146 void dbus_clipboard_init(DBusDisplay *dpy); 147 148 #endif /* UI_DBUS_H */ 149