xref: /openbmc/qemu/ui/dbus.h (revision d76aa73fad1f64c192856e1420ad0756f5e3b778)
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 "ui/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