xref: /openbmc/qemu/include/ui/gtk.h (revision b111569da9f82fdf05df03184836a4564adef599)
1dc7ff344SGerd Hoffmann #ifndef UI_GTK_H
2dc7ff344SGerd Hoffmann #define UI_GTK_H
3dc7ff344SGerd Hoffmann 
4dc7ff344SGerd Hoffmann /* Work around an -Wstrict-prototypes warning in GTK headers */
5dc7ff344SGerd Hoffmann #pragma GCC diagnostic push
6dc7ff344SGerd Hoffmann #pragma GCC diagnostic ignored "-Wstrict-prototypes"
7dc7ff344SGerd Hoffmann #include <gtk/gtk.h>
8dc7ff344SGerd Hoffmann #pragma GCC diagnostic pop
9dc7ff344SGerd Hoffmann 
10dc7ff344SGerd Hoffmann #include <gdk/gdkkeysyms.h>
11dc7ff344SGerd Hoffmann 
12dc7ff344SGerd Hoffmann #ifdef GDK_WINDOWING_X11
13dc7ff344SGerd Hoffmann #include <gdk/gdkx.h>
14dc7ff344SGerd Hoffmann #include <X11/XKBlib.h>
15dc7ff344SGerd Hoffmann #endif
16dc7ff344SGerd Hoffmann 
17a8ffb372SDaniel P. Berrange #ifdef GDK_WINDOWING_WAYLAND
18a8ffb372SDaniel P. Berrange #include <gdk/gdkwayland.h>
19a8ffb372SDaniel P. Berrange #endif
20a8ffb372SDaniel P. Berrange 
21d11ebe2cSGerd Hoffmann #include "ui/clipboard.h"
225f692f57SGerd Hoffmann #include "ui/console.h"
230c0d4273SGerd Hoffmann #include "ui/kbd-state.h"
2497edf3bdSGerd Hoffmann #if defined(CONFIG_OPENGL)
2597edf3bdSGerd Hoffmann #include "ui/egl-helpers.h"
264782aeb7SGerd Hoffmann #include "ui/egl-context.h"
2797edf3bdSGerd Hoffmann #endif
28584af1f1SVolker Rümelin #ifdef CONFIG_VTE
29584af1f1SVolker Rümelin #include "qemu/fifo8.h"
30584af1f1SVolker Rümelin #endif
3197edf3bdSGerd Hoffmann 
325f692f57SGerd Hoffmann #define MAX_VCS 10
335f692f57SGerd Hoffmann 
34dc7ff344SGerd Hoffmann typedef struct GtkDisplayState GtkDisplayState;
35dc7ff344SGerd Hoffmann 
36dc7ff344SGerd Hoffmann typedef struct VirtualGfxConsole {
37dc7ff344SGerd Hoffmann     GtkWidget *drawing_area;
385e79d516SMarc-André Lureau     DisplayGLCtx dgc;
39dc7ff344SGerd Hoffmann     DisplayChangeListener dcl;
400c0d4273SGerd Hoffmann     QKbdState *kbd;
41dc7ff344SGerd Hoffmann     DisplaySurface *ds;
42dc7ff344SGerd Hoffmann     pixman_image_t *convert;
43dc7ff344SGerd Hoffmann     cairo_surface_t *surface;
44dc7ff344SGerd Hoffmann     double scale_x;
45dc7ff344SGerd Hoffmann     double scale_y;
4697edf3bdSGerd Hoffmann #if defined(CONFIG_OPENGL)
4746e19e14SGerd Hoffmann     QemuGLShader *gls;
4897edf3bdSGerd Hoffmann     EGLContext ectx;
4997edf3bdSGerd Hoffmann     EGLSurface esurface;
5097edf3bdSGerd Hoffmann     int glupdates;
514782aeb7SGerd Hoffmann     int x, y, w, h;
52a4f113fdSGerd Hoffmann     egl_fb guest_fb;
53a4f113fdSGerd Hoffmann     egl_fb win_fb;
54f1bd3132SGerd Hoffmann     egl_fb cursor_fb;
55f1bd3132SGerd Hoffmann     int cursor_x;
56f1bd3132SGerd Hoffmann     int cursor_y;
574782aeb7SGerd Hoffmann     bool y0_top;
584782aeb7SGerd Hoffmann     bool scanout_mode;
5952a37e20SMarc-André Lureau     bool has_dmabuf;
6097edf3bdSGerd Hoffmann #endif
61dc7ff344SGerd Hoffmann } VirtualGfxConsole;
62dc7ff344SGerd Hoffmann 
63dc7ff344SGerd Hoffmann #if defined(CONFIG_VTE)
64dc7ff344SGerd Hoffmann typedef struct VirtualVteConsole {
65dc7ff344SGerd Hoffmann     GtkWidget *box;
66dc7ff344SGerd Hoffmann     GtkWidget *scrollbar;
67dc7ff344SGerd Hoffmann     GtkWidget *terminal;
680ec7b3e7SMarc-André Lureau     Chardev *chr;
69584af1f1SVolker Rümelin     Fifo8 out_fifo;
70fba958c6SPaolo Bonzini     bool echo;
71dc7ff344SGerd Hoffmann } VirtualVteConsole;
72dc7ff344SGerd Hoffmann #endif
73dc7ff344SGerd Hoffmann 
74dc7ff344SGerd Hoffmann typedef enum VirtualConsoleType {
75dc7ff344SGerd Hoffmann     GD_VC_GFX,
76dc7ff344SGerd Hoffmann     GD_VC_VTE,
77dc7ff344SGerd Hoffmann } VirtualConsoleType;
78dc7ff344SGerd Hoffmann 
79dc7ff344SGerd Hoffmann typedef struct VirtualConsole {
80dc7ff344SGerd Hoffmann     GtkDisplayState *s;
81dc7ff344SGerd Hoffmann     char *label;
82dc7ff344SGerd Hoffmann     GtkWidget *window;
83dc7ff344SGerd Hoffmann     GtkWidget *menu_item;
84dc7ff344SGerd Hoffmann     GtkWidget *tab_item;
85dc7ff344SGerd Hoffmann     GtkWidget *focus;
86dc7ff344SGerd Hoffmann     VirtualConsoleType type;
87dc7ff344SGerd Hoffmann     union {
88dc7ff344SGerd Hoffmann         VirtualGfxConsole gfx;
89dc7ff344SGerd Hoffmann #if defined(CONFIG_VTE)
90dc7ff344SGerd Hoffmann         VirtualVteConsole vte;
91dc7ff344SGerd Hoffmann #endif
92dc7ff344SGerd Hoffmann     };
93dc7ff344SGerd Hoffmann } VirtualConsole;
94dc7ff344SGerd Hoffmann 
955f692f57SGerd Hoffmann struct GtkDisplayState {
965f692f57SGerd Hoffmann     GtkWidget *window;
975f692f57SGerd Hoffmann 
985f692f57SGerd Hoffmann     GtkWidget *menu_bar;
995f692f57SGerd Hoffmann 
1005f692f57SGerd Hoffmann     GtkAccelGroup *accel_group;
1015f692f57SGerd Hoffmann 
1025f692f57SGerd Hoffmann     GtkWidget *machine_menu_item;
1035f692f57SGerd Hoffmann     GtkWidget *machine_menu;
1045f692f57SGerd Hoffmann     GtkWidget *pause_item;
1055f692f57SGerd Hoffmann     GtkWidget *reset_item;
1065f692f57SGerd Hoffmann     GtkWidget *powerdown_item;
1075f692f57SGerd Hoffmann     GtkWidget *quit_item;
1085f692f57SGerd Hoffmann 
1095f692f57SGerd Hoffmann     GtkWidget *view_menu_item;
1105f692f57SGerd Hoffmann     GtkWidget *view_menu;
1115f692f57SGerd Hoffmann     GtkWidget *full_screen_item;
1125f692f57SGerd Hoffmann     GtkWidget *copy_item;
1135f692f57SGerd Hoffmann     GtkWidget *zoom_in_item;
1145f692f57SGerd Hoffmann     GtkWidget *zoom_out_item;
1155f692f57SGerd Hoffmann     GtkWidget *zoom_fixed_item;
1165f692f57SGerd Hoffmann     GtkWidget *zoom_fit_item;
1175f692f57SGerd Hoffmann     GtkWidget *grab_item;
1185f692f57SGerd Hoffmann     GtkWidget *grab_on_hover_item;
1195f692f57SGerd Hoffmann 
1205f692f57SGerd Hoffmann     int nb_vcs;
1215f692f57SGerd Hoffmann     VirtualConsole vc[MAX_VCS];
1225f692f57SGerd Hoffmann 
1235f692f57SGerd Hoffmann     GtkWidget *show_tabs_item;
1245f692f57SGerd Hoffmann     GtkWidget *untabify_item;
1255f692f57SGerd Hoffmann     GtkWidget *show_menubar_item;
1265f692f57SGerd Hoffmann 
1275f692f57SGerd Hoffmann     GtkWidget *vbox;
1285f692f57SGerd Hoffmann     GtkWidget *notebook;
1295f692f57SGerd Hoffmann     int button_mask;
1305f692f57SGerd Hoffmann     gboolean last_set;
1315f692f57SGerd Hoffmann     int last_x;
1325f692f57SGerd Hoffmann     int last_y;
1335f692f57SGerd Hoffmann     int grab_x_root;
1345f692f57SGerd Hoffmann     int grab_y_root;
1355f692f57SGerd Hoffmann     VirtualConsole *kbd_owner;
1365f692f57SGerd Hoffmann     VirtualConsole *ptr_owner;
1375f692f57SGerd Hoffmann 
1385f692f57SGerd Hoffmann     gboolean full_screen;
1395f692f57SGerd Hoffmann 
1405f692f57SGerd Hoffmann     GdkCursor *null_cursor;
1415f692f57SGerd Hoffmann     Notifier mouse_mode_notifier;
1425f692f57SGerd Hoffmann     gboolean free_scale;
1435f692f57SGerd Hoffmann 
1445f692f57SGerd Hoffmann     bool external_pause_update;
1455f692f57SGerd Hoffmann 
146d11ebe2cSGerd Hoffmann     QemuClipboardPeer cbpeer;
147d11ebe2cSGerd Hoffmann     uint32_t cbpending[QEMU_CLIPBOARD_SELECTION__COUNT];
148d11ebe2cSGerd Hoffmann     GtkClipboard *gtkcb[QEMU_CLIPBOARD_SELECTION__COUNT];
149d11ebe2cSGerd Hoffmann     bool cbowner[QEMU_CLIPBOARD_SELECTION__COUNT];
150d11ebe2cSGerd Hoffmann 
1515f692f57SGerd Hoffmann     DisplayOptions *opts;
1525f692f57SGerd Hoffmann };
1535f692f57SGerd Hoffmann 
15411c82b58SGerd Hoffmann extern bool gtk_use_gl_area;
15511c82b58SGerd Hoffmann 
15697edf3bdSGerd Hoffmann /* ui/gtk.c */
15797edf3bdSGerd Hoffmann void gd_update_windowsize(VirtualConsole *vc);
158aeffd071SAkihiko Odaki void gd_update_monitor_refresh_rate(VirtualConsole *vc, GtkWidget *widget);
15965b847d2SVivek Kasireddy void gd_hw_gl_flushed(void *vc);
16097edf3bdSGerd Hoffmann 
16197edf3bdSGerd Hoffmann /* ui/gtk-egl.c */
16297edf3bdSGerd Hoffmann void gd_egl_init(VirtualConsole *vc);
16397edf3bdSGerd Hoffmann void gd_egl_draw(VirtualConsole *vc);
16497edf3bdSGerd Hoffmann void gd_egl_update(DisplayChangeListener *dcl,
16597edf3bdSGerd Hoffmann                    int x, int y, int w, int h);
16697edf3bdSGerd Hoffmann void gd_egl_refresh(DisplayChangeListener *dcl);
16797edf3bdSGerd Hoffmann void gd_egl_switch(DisplayChangeListener *dcl,
16897edf3bdSGerd Hoffmann                    DisplaySurface *surface);
1695e79d516SMarc-André Lureau QEMUGLContext gd_egl_create_context(DisplayGLCtx *dgc,
1704782aeb7SGerd Hoffmann                                     QEMUGLParams *params);
171543a7a16SGerd Hoffmann void gd_egl_scanout_disable(DisplayChangeListener *dcl);
172f4c36bdaSGerd Hoffmann void gd_egl_scanout_texture(DisplayChangeListener *dcl,
173f4c36bdaSGerd Hoffmann                             uint32_t backing_id,
174f4c36bdaSGerd Hoffmann                             bool backing_y_0_top,
175f4c36bdaSGerd Hoffmann                             uint32_t backing_width,
176f4c36bdaSGerd Hoffmann                             uint32_t backing_height,
1774782aeb7SGerd Hoffmann                             uint32_t x, uint32_t y,
178*bf41ab61SMarc-André Lureau                             uint32_t w, uint32_t h,
179*bf41ab61SMarc-André Lureau                             void *d3d_tex2d);
18070763feaSGerd Hoffmann void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
18170763feaSGerd Hoffmann                            QemuDmaBuf *dmabuf);
182f1bd3132SGerd Hoffmann void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl,
183f1bd3132SGerd Hoffmann                           QemuDmaBuf *dmabuf, bool have_hot,
184f1bd3132SGerd Hoffmann                           uint32_t hot_x, uint32_t hot_y);
185f1bd3132SGerd Hoffmann void gd_egl_cursor_position(DisplayChangeListener *dcl,
186f1bd3132SGerd Hoffmann                             uint32_t pos_x, uint32_t pos_y);
187ab971f8aSVivek Kasireddy void gd_egl_flush(DisplayChangeListener *dcl,
188ab971f8aSVivek Kasireddy                   uint32_t x, uint32_t y, uint32_t w, uint32_t h);
1894782aeb7SGerd Hoffmann void gd_egl_scanout_flush(DisplayChangeListener *dcl,
1904782aeb7SGerd Hoffmann                           uint32_t x, uint32_t y, uint32_t w, uint32_t h);
19154d208ffSGerd Hoffmann void gtk_egl_init(DisplayGLMode mode);
1925e79d516SMarc-André Lureau int gd_egl_make_current(DisplayGLCtx *dgc,
1934782aeb7SGerd Hoffmann                         QEMUGLContext ctx);
19497edf3bdSGerd Hoffmann 
195925a0400SGerd Hoffmann /* ui/gtk-gl-area.c */
196925a0400SGerd Hoffmann void gd_gl_area_init(VirtualConsole *vc);
197925a0400SGerd Hoffmann void gd_gl_area_draw(VirtualConsole *vc);
198925a0400SGerd Hoffmann void gd_gl_area_update(DisplayChangeListener *dcl,
199925a0400SGerd Hoffmann                        int x, int y, int w, int h);
200925a0400SGerd Hoffmann void gd_gl_area_refresh(DisplayChangeListener *dcl);
201925a0400SGerd Hoffmann void gd_gl_area_switch(DisplayChangeListener *dcl,
202925a0400SGerd Hoffmann                        DisplaySurface *surface);
2035e79d516SMarc-André Lureau QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc,
204925a0400SGerd Hoffmann                                         QEMUGLParams *params);
2055e79d516SMarc-André Lureau void gd_gl_area_destroy_context(DisplayGLCtx *dgc,
206925a0400SGerd Hoffmann                                 QEMUGLContext ctx);
2072606519bSMarc-André Lureau void gd_gl_area_scanout_dmabuf(DisplayChangeListener *dcl,
2082606519bSMarc-André Lureau                                QemuDmaBuf *dmabuf);
209f4c36bdaSGerd Hoffmann void gd_gl_area_scanout_texture(DisplayChangeListener *dcl,
210f4c36bdaSGerd Hoffmann                                 uint32_t backing_id,
211f4c36bdaSGerd Hoffmann                                 bool backing_y_0_top,
212f4c36bdaSGerd Hoffmann                                 uint32_t backing_width,
213f4c36bdaSGerd Hoffmann                                 uint32_t backing_height,
214925a0400SGerd Hoffmann                                 uint32_t x, uint32_t y,
215*bf41ab61SMarc-André Lureau                                 uint32_t w, uint32_t h,
216*bf41ab61SMarc-André Lureau                                 void *d3d_tex2d);
217568b12fcSMarc-André Lureau void gd_gl_area_scanout_disable(DisplayChangeListener *dcl);
218925a0400SGerd Hoffmann void gd_gl_area_scanout_flush(DisplayChangeListener *dcl,
219925a0400SGerd Hoffmann                               uint32_t x, uint32_t y, uint32_t w, uint32_t h);
220925a0400SGerd Hoffmann void gtk_gl_area_init(void);
2215e79d516SMarc-André Lureau int gd_gl_area_make_current(DisplayGLCtx *dgc,
222925a0400SGerd Hoffmann                             QEMUGLContext ctx);
223925a0400SGerd Hoffmann 
224d11ebe2cSGerd Hoffmann /* gtk-clipboard.c */
225d11ebe2cSGerd Hoffmann void gd_clipboard_init(GtkDisplayState *gd);
226d11ebe2cSGerd Hoffmann 
227dc7ff344SGerd Hoffmann #endif /* UI_GTK_H */
228