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