xref: /openbmc/qemu/ui/dbus.h (revision f9bcb2d68496a8fa620443edacb27cad1acc1492)
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  
83  extern const DisplayChangeListenerOps dbus_console_dcl_ops;
84  
85  #define DBUS_DISPLAY_TYPE_LISTENER dbus_display_listener_get_type()
86  G_DECLARE_FINAL_TYPE(DBusDisplayListener,
87                       dbus_display_listener,
88                       DBUS_DISPLAY,
89                       LISTENER,
90                       GObject)
91  
92  DBusDisplayListener *
93  dbus_display_listener_new(const char *bus_name,
94                            GDBusConnection *conn,
95                            DBusDisplayConsole *console);
96  
97  DBusDisplayConsole *
98  dbus_display_listener_get_console(DBusDisplayListener *ddl);
99  
100  const char *
101  dbus_display_listener_get_bus_name(DBusDisplayListener *ddl);
102  
103  extern const DisplayChangeListenerOps dbus_gl_dcl_ops;
104  extern const DisplayChangeListenerOps dbus_dcl_ops;
105  
106  #define TYPE_CHARDEV_DBUS "chardev-dbus"
107  
108  typedef struct DBusChardevClass {
109      SocketChardevClass parent_class;
110  
111      void (*parent_chr_be_event)(Chardev *s, QEMUChrEvent event);
112  } DBusChardevClass;
113  
114  DECLARE_CLASS_CHECKERS(DBusChardevClass, DBUS_CHARDEV,
115                         TYPE_CHARDEV_DBUS)
116  
117  typedef struct DBusChardev {
118      SocketChardev parent;
119  
120      bool exported;
121      QemuDBusDisplay1Chardev *iface;
122  } DBusChardev;
123  
124  DECLARE_INSTANCE_CHECKER(DBusChardev, DBUS_CHARDEV, TYPE_CHARDEV_DBUS)
125  
126  #define CHARDEV_IS_DBUS(chr) \
127      object_dynamic_cast(OBJECT(chr), TYPE_CHARDEV_DBUS)
128  
129  typedef enum {
130      DBUS_DISPLAY_CHARDEV_OPEN,
131      DBUS_DISPLAY_CHARDEV_CLOSE,
132  } DBusDisplayEventType;
133  
134  typedef struct DBusDisplayEvent {
135      DBusDisplayEventType type;
136      union {
137          DBusChardev *chardev;
138      };
139  } DBusDisplayEvent;
140  
141  void dbus_display_notify(DBusDisplayEvent *event);
142  
143  void dbus_chardev_init(DBusDisplay *dpy);
144  
145  void dbus_clipboard_init(DBusDisplay *dpy);
146  
147  #endif /* UI_DBUS_H_ */
148