gtk.h 6.2 KB

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