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