1 #ifndef UI_GTK_H 2 #define UI_GTK_H 3 4 #ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE 5 /* Work around an -Wstrict-prototypes warning in GTK headers */ 6 #pragma GCC diagnostic push 7 #pragma GCC diagnostic ignored "-Wstrict-prototypes" 8 #endif 9 #include <gtk/gtk.h> 10 #ifdef CONFIG_PRAGMA_DIAGNOSTIC_AVAILABLE 11 #pragma GCC diagnostic pop 12 #endif 13 14 #include <gdk/gdkkeysyms.h> 15 16 #ifdef GDK_WINDOWING_X11 17 #include <gdk/gdkx.h> 18 #include <X11/XKBlib.h> 19 #endif 20 21 #if defined(CONFIG_OPENGL) 22 #include "ui/egl-helpers.h" 23 #include "ui/egl-context.h" 24 #endif 25 26 /* Compatibility define to let us build on both Gtk2 and Gtk3 */ 27 #if GTK_CHECK_VERSION(3, 0, 0) 28 static inline void gdk_drawable_get_size(GdkWindow *w, gint *ww, gint *wh) 29 { 30 *ww = gdk_window_get_width(w); 31 *wh = gdk_window_get_height(w); 32 } 33 #endif 34 35 typedef struct GtkDisplayState GtkDisplayState; 36 37 typedef struct VirtualGfxConsole { 38 GtkWidget *drawing_area; 39 DisplayChangeListener dcl; 40 DisplaySurface *ds; 41 pixman_image_t *convert; 42 cairo_surface_t *surface; 43 double scale_x; 44 double scale_y; 45 #if defined(CONFIG_OPENGL) 46 ConsoleGLState *gls; 47 EGLContext ectx; 48 EGLSurface esurface; 49 int glupdates; 50 int x, y, w, h; 51 GLuint tex_id; 52 GLuint fbo_id; 53 bool y0_top; 54 bool scanout_mode; 55 #endif 56 } VirtualGfxConsole; 57 58 #if defined(CONFIG_VTE) 59 typedef struct VirtualVteConsole { 60 GtkWidget *box; 61 GtkWidget *scrollbar; 62 GtkWidget *terminal; 63 CharDriverState *chr; 64 bool echo; 65 } VirtualVteConsole; 66 #endif 67 68 typedef enum VirtualConsoleType { 69 GD_VC_GFX, 70 GD_VC_VTE, 71 } VirtualConsoleType; 72 73 typedef struct VirtualConsole { 74 GtkDisplayState *s; 75 char *label; 76 GtkWidget *window; 77 GtkWidget *menu_item; 78 GtkWidget *tab_item; 79 GtkWidget *focus; 80 VirtualConsoleType type; 81 union { 82 VirtualGfxConsole gfx; 83 #if defined(CONFIG_VTE) 84 VirtualVteConsole vte; 85 #endif 86 }; 87 } VirtualConsole; 88 89 /* ui/gtk.c */ 90 void gd_update_windowsize(VirtualConsole *vc); 91 92 /* ui/gtk-egl.c */ 93 void gd_egl_init(VirtualConsole *vc); 94 void gd_egl_draw(VirtualConsole *vc); 95 void gd_egl_update(DisplayChangeListener *dcl, 96 int x, int y, int w, int h); 97 void gd_egl_refresh(DisplayChangeListener *dcl); 98 void gd_egl_switch(DisplayChangeListener *dcl, 99 DisplaySurface *surface); 100 QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl, 101 QEMUGLParams *params); 102 void gd_egl_scanout(DisplayChangeListener *dcl, 103 uint32_t backing_id, bool backing_y_0_top, 104 uint32_t backing_width, uint32_t backing_height, 105 uint32_t x, uint32_t y, 106 uint32_t w, uint32_t h); 107 void gd_egl_scanout_flush(DisplayChangeListener *dcl, 108 uint32_t x, uint32_t y, uint32_t w, uint32_t h); 109 void gtk_egl_init(void); 110 int gd_egl_make_current(DisplayChangeListener *dcl, 111 QEMUGLContext ctx); 112 113 /* ui/gtk-gl-area.c */ 114 void gd_gl_area_init(VirtualConsole *vc); 115 void gd_gl_area_draw(VirtualConsole *vc); 116 void gd_gl_area_update(DisplayChangeListener *dcl, 117 int x, int y, int w, int h); 118 void gd_gl_area_refresh(DisplayChangeListener *dcl); 119 void gd_gl_area_switch(DisplayChangeListener *dcl, 120 DisplaySurface *surface); 121 QEMUGLContext gd_gl_area_create_context(DisplayChangeListener *dcl, 122 QEMUGLParams *params); 123 void gd_gl_area_destroy_context(DisplayChangeListener *dcl, 124 QEMUGLContext ctx); 125 void gd_gl_area_scanout(DisplayChangeListener *dcl, 126 uint32_t backing_id, bool backing_y_0_top, 127 uint32_t backing_width, uint32_t backing_height, 128 uint32_t x, uint32_t y, 129 uint32_t w, uint32_t h); 130 void gd_gl_area_scanout_flush(DisplayChangeListener *dcl, 131 uint32_t x, uint32_t y, uint32_t w, uint32_t h); 132 void gtk_gl_area_init(void); 133 QEMUGLContext gd_gl_area_get_current_context(DisplayChangeListener *dcl); 134 int gd_gl_area_make_current(DisplayChangeListener *dcl, 135 QEMUGLContext ctx); 136 137 #endif /* UI_GTK_H */ 138