1 #ifndef UI_GTK_H 2 #define UI_GTK_H 3 4 /* Work around an -Wstrict-prototypes warning in GTK headers */ 5 #pragma GCC diagnostic push 6 #pragma GCC diagnostic ignored "-Wstrict-prototypes" 7 #include <gtk/gtk.h> 8 #pragma GCC diagnostic pop 9 10 #include <gdk/gdkkeysyms.h> 11 12 #ifdef GDK_WINDOWING_X11 13 #include <gdk/gdkx.h> 14 #include <X11/XKBlib.h> 15 #endif 16 17 #ifdef GDK_WINDOWING_WAYLAND 18 #include <gdk/gdkwayland.h> 19 #endif 20 21 #include "ui/clipboard.h" 22 #include "ui/console.h" 23 #include "ui/kbd-state.h" 24 #if defined(CONFIG_OPENGL) 25 #include "ui/egl-helpers.h" 26 #include "ui/egl-context.h" 27 #endif 28 #ifdef CONFIG_VTE 29 #include "qemu/fifo8.h" 30 #endif 31 32 #define MAX_VCS 10 33 34 typedef struct GtkDisplayState GtkDisplayState; 35 36 typedef struct VirtualGfxConsole { 37 GtkWidget *drawing_area; 38 DisplayGLCtx dgc; 39 DisplayChangeListener dcl; 40 QKbdState *kbd; 41 DisplaySurface *ds; 42 pixman_image_t *convert; 43 cairo_surface_t *surface; 44 double preferred_scale; 45 double scale_x; 46 double scale_y; 47 #if defined(CONFIG_OPENGL) 48 QemuGLShader *gls; 49 EGLContext ectx; 50 EGLSurface esurface; 51 int glupdates; 52 int x, y, w, h; 53 egl_fb guest_fb; 54 egl_fb win_fb; 55 egl_fb cursor_fb; 56 int cursor_x; 57 int cursor_y; 58 bool y0_top; 59 bool scanout_mode; 60 bool has_dmabuf; 61 #endif 62 } VirtualGfxConsole; 63 64 #if defined(CONFIG_VTE) 65 typedef struct VirtualVteConsole { 66 GtkWidget *box; 67 GtkWidget *scrollbar; 68 GtkWidget *terminal; 69 Chardev *chr; 70 Fifo8 out_fifo; 71 bool echo; 72 } VirtualVteConsole; 73 #endif 74 75 typedef enum VirtualConsoleType { 76 GD_VC_GFX, 77 GD_VC_VTE, 78 } VirtualConsoleType; 79 80 typedef struct VirtualConsole { 81 GtkDisplayState *s; 82 char *label; 83 GtkWidget *window; 84 GtkWidget *menu_item; 85 GtkWidget *tab_item; 86 GtkWidget *focus; 87 VirtualConsoleType type; 88 union { 89 VirtualGfxConsole gfx; 90 #if defined(CONFIG_VTE) 91 VirtualVteConsole vte; 92 #endif 93 }; 94 } VirtualConsole; 95 96 struct GtkDisplayState { 97 GtkWidget *window; 98 99 GtkWidget *menu_bar; 100 101 GtkAccelGroup *accel_group; 102 103 GtkWidget *machine_menu_item; 104 GtkWidget *machine_menu; 105 GtkWidget *pause_item; 106 GtkWidget *reset_item; 107 GtkWidget *powerdown_item; 108 GtkWidget *quit_item; 109 110 GtkWidget *view_menu_item; 111 GtkWidget *view_menu; 112 GtkWidget *full_screen_item; 113 GtkWidget *copy_item; 114 GtkWidget *zoom_in_item; 115 GtkWidget *zoom_out_item; 116 GtkWidget *zoom_fixed_item; 117 GtkWidget *zoom_fit_item; 118 GtkWidget *grab_item; 119 GtkWidget *grab_on_hover_item; 120 121 int nb_vcs; 122 VirtualConsole vc[MAX_VCS]; 123 124 GtkWidget *show_tabs_item; 125 GtkWidget *untabify_item; 126 GtkWidget *show_menubar_item; 127 128 GtkWidget *vbox; 129 GtkWidget *notebook; 130 int button_mask; 131 gboolean last_set; 132 int last_x; 133 int last_y; 134 int grab_x_root; 135 int grab_y_root; 136 VirtualConsole *kbd_owner; 137 VirtualConsole *ptr_owner; 138 139 gboolean full_screen; 140 141 GdkCursor *null_cursor; 142 Notifier mouse_mode_notifier; 143 gboolean free_scale; 144 gboolean keep_aspect_ratio; 145 146 bool external_pause_update; 147 148 QemuClipboardPeer cbpeer; 149 uint32_t cbpending[QEMU_CLIPBOARD_SELECTION__COUNT]; 150 GtkClipboard *gtkcb[QEMU_CLIPBOARD_SELECTION__COUNT]; 151 bool cbowner[QEMU_CLIPBOARD_SELECTION__COUNT]; 152 153 DisplayOptions *opts; 154 }; 155 156 extern bool gtk_use_gl_area; 157 158 /* ui/gtk.c */ 159 void gd_update_windowsize(VirtualConsole *vc); 160 void gd_update_monitor_refresh_rate(VirtualConsole *vc, GtkWidget *widget); 161 void gd_hw_gl_flushed(void *vc); 162 163 /* ui/gtk-egl.c */ 164 void gd_egl_init(VirtualConsole *vc); 165 void gd_egl_draw(VirtualConsole *vc); 166 void gd_egl_update(DisplayChangeListener *dcl, 167 int x, int y, int w, int h); 168 void gd_egl_refresh(DisplayChangeListener *dcl); 169 void gd_egl_switch(DisplayChangeListener *dcl, 170 DisplaySurface *surface); 171 QEMUGLContext gd_egl_create_context(DisplayGLCtx *dgc, 172 QEMUGLParams *params); 173 void gd_egl_scanout_disable(DisplayChangeListener *dcl); 174 void gd_egl_scanout_texture(DisplayChangeListener *dcl, 175 uint32_t backing_id, 176 bool backing_y_0_top, 177 uint32_t backing_width, 178 uint32_t backing_height, 179 uint32_t x, uint32_t y, 180 uint32_t w, uint32_t h, 181 void *d3d_tex2d); 182 void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl, 183 QemuDmaBuf *dmabuf); 184 void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl, 185 QemuDmaBuf *dmabuf, bool have_hot, 186 uint32_t hot_x, uint32_t hot_y); 187 void gd_egl_cursor_position(DisplayChangeListener *dcl, 188 uint32_t pos_x, uint32_t pos_y); 189 void gd_egl_flush(DisplayChangeListener *dcl, 190 uint32_t x, uint32_t y, uint32_t w, uint32_t h); 191 void gd_egl_scanout_flush(DisplayChangeListener *dcl, 192 uint32_t x, uint32_t y, uint32_t w, uint32_t h); 193 void gtk_egl_init(DisplayGLMode mode); 194 int gd_egl_make_current(DisplayGLCtx *dgc, 195 QEMUGLContext ctx); 196 197 /* ui/gtk-gl-area.c */ 198 void gd_gl_area_init(VirtualConsole *vc); 199 void gd_gl_area_draw(VirtualConsole *vc); 200 void gd_gl_area_update(DisplayChangeListener *dcl, 201 int x, int y, int w, int h); 202 void gd_gl_area_refresh(DisplayChangeListener *dcl); 203 void gd_gl_area_switch(DisplayChangeListener *dcl, 204 DisplaySurface *surface); 205 QEMUGLContext gd_gl_area_create_context(DisplayGLCtx *dgc, 206 QEMUGLParams *params); 207 void gd_gl_area_destroy_context(DisplayGLCtx *dgc, 208 QEMUGLContext ctx); 209 void gd_gl_area_scanout_dmabuf(DisplayChangeListener *dcl, 210 QemuDmaBuf *dmabuf); 211 void gd_gl_area_scanout_texture(DisplayChangeListener *dcl, 212 uint32_t backing_id, 213 bool backing_y_0_top, 214 uint32_t backing_width, 215 uint32_t backing_height, 216 uint32_t x, uint32_t y, 217 uint32_t w, uint32_t h, 218 void *d3d_tex2d); 219 void gd_gl_area_scanout_disable(DisplayChangeListener *dcl); 220 void gd_gl_area_scanout_flush(DisplayChangeListener *dcl, 221 uint32_t x, uint32_t y, uint32_t w, uint32_t h); 222 void gtk_gl_area_init(void); 223 int gd_gl_area_make_current(DisplayGLCtx *dgc, 224 QEMUGLContext ctx); 225 226 /* gtk-clipboard.c */ 227 void gd_clipboard_init(GtkDisplayState *gd); 228 229 void gd_update_scale(VirtualConsole *vc, int ww, int wh, int fbw, int fbh); 230 231 #endif /* UI_GTK_H */ 232