xref: /openbmc/qemu/ui/dbus.h (revision 6cc5a615)
1142ca628SMarc-André Lureau /*
2142ca628SMarc-André Lureau  * QEMU DBus display
3142ca628SMarc-André Lureau  *
4142ca628SMarc-André Lureau  * Copyright (c) 2021 Marc-André Lureau <marcandre.lureau@redhat.com>
5142ca628SMarc-André Lureau  *
6142ca628SMarc-André Lureau  * Permission is hereby granted, free of charge, to any person obtaining a copy
7142ca628SMarc-André Lureau  * of this software and associated documentation files (the "Software"), to deal
8142ca628SMarc-André Lureau  * in the Software without restriction, including without limitation the rights
9142ca628SMarc-André Lureau  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10142ca628SMarc-André Lureau  * copies of the Software, and to permit persons to whom the Software is
11142ca628SMarc-André Lureau  * furnished to do so, subject to the following conditions:
12142ca628SMarc-André Lureau  *
13142ca628SMarc-André Lureau  * The above copyright notice and this permission notice shall be included in
14142ca628SMarc-André Lureau  * all copies or substantial portions of the Software.
15142ca628SMarc-André Lureau  *
16142ca628SMarc-André Lureau  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17142ca628SMarc-André Lureau  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18142ca628SMarc-André Lureau  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19142ca628SMarc-André Lureau  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20142ca628SMarc-André Lureau  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21142ca628SMarc-André Lureau  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22142ca628SMarc-André Lureau  * THE SOFTWARE.
23142ca628SMarc-André Lureau  */
249c092804SMarkus Armbruster 
259c092804SMarkus Armbruster #ifndef UI_DBUS_H
269c092804SMarkus Armbruster #define UI_DBUS_H
27142ca628SMarc-André Lureau 
283e301c8dSMarc-André Lureau #include "chardev/char-socket.h"
29142ca628SMarc-André Lureau #include "qemu/dbus.h"
30142ca628SMarc-André Lureau #include "qom/object.h"
31142ca628SMarc-André Lureau #include "ui/console.h"
32ff1a5810SMarc-André Lureau #include "ui/clipboard.h"
33142ca628SMarc-André Lureau 
340e902f59SPaolo Bonzini #include "ui/dbus-display1.h"
35142ca628SMarc-André Lureau 
36ff1a5810SMarc-André Lureau typedef struct DBusClipboardRequest {
37ff1a5810SMarc-André Lureau     GDBusMethodInvocation *invocation;
38ff1a5810SMarc-André Lureau     QemuClipboardType type;
39ff1a5810SMarc-André Lureau     guint timeout_id;
40ff1a5810SMarc-André Lureau } DBusClipboardRequest;
41ff1a5810SMarc-André Lureau 
42142ca628SMarc-André Lureau struct DBusDisplay {
43142ca628SMarc-André Lureau     Object parent;
44142ca628SMarc-André Lureau 
45142ca628SMarc-André Lureau     DisplayGLMode gl_mode;
4699997823SMarc-André Lureau     bool p2p;
47142ca628SMarc-André Lureau     char *dbus_addr;
48739362d4SMarc-André Lureau     char *audiodev;
49142ca628SMarc-André Lureau     DisplayGLCtx glctx;
50142ca628SMarc-André Lureau 
51142ca628SMarc-André Lureau     GDBusConnection *bus;
52142ca628SMarc-André Lureau     GDBusObjectManagerServer *server;
53142ca628SMarc-André Lureau     QemuDBusDisplay1VM *iface;
54142ca628SMarc-André Lureau     GPtrArray *consoles;
5599997823SMarc-André Lureau     GCancellable *add_client_cancellable;
56ff1a5810SMarc-André Lureau 
57ff1a5810SMarc-André Lureau     QemuClipboardPeer clipboard_peer;
58ff1a5810SMarc-André Lureau     QemuDBusDisplay1Clipboard *clipboard;
59ff1a5810SMarc-André Lureau     QemuDBusDisplay1Clipboard *clipboard_proxy;
60ff1a5810SMarc-André Lureau     DBusClipboardRequest clipboard_request[QEMU_CLIPBOARD_SELECTION__COUNT];
613e301c8dSMarc-André Lureau 
623e301c8dSMarc-André Lureau     Notifier notifier;
63142ca628SMarc-André Lureau };
64142ca628SMarc-André Lureau 
65*6cc5a615SMarc-André Lureau #ifdef WIN32
66*6cc5a615SMarc-André Lureau bool
67*6cc5a615SMarc-André Lureau dbus_win32_import_socket(GDBusMethodInvocation *invocation,
68*6cc5a615SMarc-André Lureau                          GVariant *arg_listener, int *socket);
69*6cc5a615SMarc-André Lureau #endif
70*6cc5a615SMarc-André Lureau 
71142ca628SMarc-André Lureau #define TYPE_DBUS_DISPLAY "dbus-display"
72142ca628SMarc-André Lureau OBJECT_DECLARE_SIMPLE_TYPE(DBusDisplay, DBUS_DISPLAY)
73142ca628SMarc-André Lureau 
743e301c8dSMarc-André Lureau void dbus_display_notifier_add(Notifier *notifier);
753e301c8dSMarc-André Lureau 
76142ca628SMarc-André Lureau #define DBUS_DISPLAY_TYPE_CONSOLE dbus_display_console_get_type()
77142ca628SMarc-André Lureau G_DECLARE_FINAL_TYPE(DBusDisplayConsole,
78142ca628SMarc-André Lureau                      dbus_display_console,
79142ca628SMarc-André Lureau                      DBUS_DISPLAY,
80142ca628SMarc-André Lureau                      CONSOLE,
81142ca628SMarc-André Lureau                      GDBusObjectSkeleton)
82142ca628SMarc-André Lureau 
83142ca628SMarc-André Lureau DBusDisplayConsole *
84142ca628SMarc-André Lureau dbus_display_console_new(DBusDisplay *display, QemuConsole *con);
85142ca628SMarc-André Lureau 
86142ca628SMarc-André Lureau int
87142ca628SMarc-André Lureau dbus_display_console_get_index(DBusDisplayConsole *ddc);
88142ca628SMarc-André Lureau 
89417a2319SMarc-André Lureau 
90417a2319SMarc-André Lureau extern const DisplayChangeListenerOps dbus_console_dcl_ops;
91417a2319SMarc-André Lureau 
92142ca628SMarc-André Lureau #define DBUS_DISPLAY_TYPE_LISTENER dbus_display_listener_get_type()
93142ca628SMarc-André Lureau G_DECLARE_FINAL_TYPE(DBusDisplayListener,
94142ca628SMarc-André Lureau                      dbus_display_listener,
95142ca628SMarc-André Lureau                      DBUS_DISPLAY,
96142ca628SMarc-André Lureau                      LISTENER,
97142ca628SMarc-André Lureau                      GObject)
98142ca628SMarc-André Lureau 
99142ca628SMarc-André Lureau DBusDisplayListener *
100142ca628SMarc-André Lureau dbus_display_listener_new(const char *bus_name,
101142ca628SMarc-André Lureau                           GDBusConnection *conn,
102142ca628SMarc-André Lureau                           DBusDisplayConsole *console);
103142ca628SMarc-André Lureau 
104142ca628SMarc-André Lureau DBusDisplayConsole *
105142ca628SMarc-André Lureau dbus_display_listener_get_console(DBusDisplayListener *ddl);
106142ca628SMarc-André Lureau 
107142ca628SMarc-André Lureau const char *
108142ca628SMarc-André Lureau dbus_display_listener_get_bus_name(DBusDisplayListener *ddl);
109142ca628SMarc-André Lureau 
110142ca628SMarc-André Lureau extern const DisplayChangeListenerOps dbus_gl_dcl_ops;
111142ca628SMarc-André Lureau extern const DisplayChangeListenerOps dbus_dcl_ops;
112142ca628SMarc-André Lureau 
1133e301c8dSMarc-André Lureau #define TYPE_CHARDEV_DBUS "chardev-dbus"
1143e301c8dSMarc-André Lureau 
1153e301c8dSMarc-André Lureau typedef struct DBusChardevClass {
1163e301c8dSMarc-André Lureau     SocketChardevClass parent_class;
1173e301c8dSMarc-André Lureau 
1183e301c8dSMarc-André Lureau     void (*parent_chr_be_event)(Chardev *s, QEMUChrEvent event);
1193e301c8dSMarc-André Lureau } DBusChardevClass;
1203e301c8dSMarc-André Lureau 
1213e301c8dSMarc-André Lureau DECLARE_CLASS_CHECKERS(DBusChardevClass, DBUS_CHARDEV,
1223e301c8dSMarc-André Lureau                        TYPE_CHARDEV_DBUS)
1233e301c8dSMarc-André Lureau 
1243e301c8dSMarc-André Lureau typedef struct DBusChardev {
1253e301c8dSMarc-André Lureau     SocketChardev parent;
1263e301c8dSMarc-André Lureau 
1273e301c8dSMarc-André Lureau     bool exported;
1283e301c8dSMarc-André Lureau     QemuDBusDisplay1Chardev *iface;
1293e301c8dSMarc-André Lureau } DBusChardev;
1303e301c8dSMarc-André Lureau 
1313e301c8dSMarc-André Lureau DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS)
1323e301c8dSMarc-André Lureau 
1333e301c8dSMarc-André Lureau #define CHARDEV_IS_DBUS(chr) \
1343e301c8dSMarc-André Lureau     object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_DBUS)
1353e301c8dSMarc-André Lureau 
1363e301c8dSMarc-André Lureau typedef enum {
1373e301c8dSMarc-André Lureau     DBUS_DISPLAY_CHARDEV_OPEN,
1383e301c8dSMarc-André Lureau     DBUS_DISPLAY_CHARDEV_CLOSE,
1393e301c8dSMarc-André Lureau } DBusDisplayEventType;
1403e301c8dSMarc-André Lureau 
1413e301c8dSMarc-André Lureau typedef struct DBusDisplayEvent {
1423e301c8dSMarc-André Lureau     DBusDisplayEventType type;
1433e301c8dSMarc-André Lureau     union {
1443e301c8dSMarc-André Lureau         DBusChardev *chardev;
1453e301c8dSMarc-André Lureau     };
1463e301c8dSMarc-André Lureau } DBusDisplayEvent;
1473e301c8dSMarc-André Lureau 
1483e301c8dSMarc-André Lureau void dbus_display_notify(DBusDisplayEvent *event);
1493e301c8dSMarc-André Lureau 
1503e301c8dSMarc-André Lureau void dbus_chardev_init(DBusDisplay *dpy);
1513e301c8dSMarc-André Lureau 
152ff1a5810SMarc-André Lureau void dbus_clipboard_init(DBusDisplay *dpy);
153ff1a5810SMarc-André Lureau 
1549c092804SMarkus Armbruster #endif /* UI_DBUS_H */
155