2015-03-04 15:37:27 +01:00
|
|
|
#ifndef UI_GTK_H
|
|
|
|
#define UI_GTK_H
|
|
|
|
|
|
|
|
/* Work around an -Wstrict-prototypes warning in GTK headers */
|
|
|
|
#pragma GCC diagnostic push
|
|
|
|
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
|
|
|
|
#include <gtk/gtk.h>
|
|
|
|
#pragma GCC diagnostic pop
|
|
|
|
|
|
|
|
#include <gdk/gdkkeysyms.h>
|
|
|
|
|
|
|
|
#ifdef GDK_WINDOWING_X11
|
|
|
|
#include <gdk/gdkx.h>
|
|
|
|
#include <X11/XKBlib.h>
|
|
|
|
#endif
|
|
|
|
|
2016-12-01 10:41:17 +01:00
|
|
|
#ifdef GDK_WINDOWING_WAYLAND
|
|
|
|
#include <gdk/gdkwayland.h>
|
|
|
|
#endif
|
|
|
|
|
2019-01-22 10:28:11 +01:00
|
|
|
#include "ui/kbd-state.h"
|
2015-01-20 12:43:28 +01:00
|
|
|
#if defined(CONFIG_OPENGL)
|
|
|
|
#include "ui/egl-helpers.h"
|
2015-05-08 11:30:51 +02:00
|
|
|
#include "ui/egl-context.h"
|
2015-01-20 12:43:28 +01:00
|
|
|
#endif
|
|
|
|
|
2020-01-08 13:13:42 +01:00
|
|
|
#define MILLISEC_PER_SEC 1000000
|
|
|
|
|
2015-03-04 15:37:27 +01:00
|
|
|
typedef struct GtkDisplayState GtkDisplayState;
|
|
|
|
|
|
|
|
typedef struct VirtualGfxConsole {
|
|
|
|
GtkWidget *drawing_area;
|
|
|
|
DisplayChangeListener dcl;
|
2019-01-22 10:28:11 +01:00
|
|
|
QKbdState *kbd;
|
2015-03-04 15:37:27 +01:00
|
|
|
DisplaySurface *ds;
|
|
|
|
pixman_image_t *convert;
|
|
|
|
cairo_surface_t *surface;
|
|
|
|
double scale_x;
|
|
|
|
double scale_y;
|
2015-01-20 12:43:28 +01:00
|
|
|
#if defined(CONFIG_OPENGL)
|
2017-10-10 15:54:49 +02:00
|
|
|
QemuGLShader *gls;
|
2015-01-20 12:43:28 +01:00
|
|
|
EGLContext ectx;
|
|
|
|
EGLSurface esurface;
|
|
|
|
int glupdates;
|
2015-05-08 11:30:51 +02:00
|
|
|
int x, y, w, h;
|
2017-06-14 10:41:49 +02:00
|
|
|
egl_fb guest_fb;
|
|
|
|
egl_fb win_fb;
|
2018-03-06 10:09:51 +01:00
|
|
|
egl_fb cursor_fb;
|
|
|
|
int cursor_x;
|
|
|
|
int cursor_y;
|
2015-05-08 11:30:51 +02:00
|
|
|
bool y0_top;
|
|
|
|
bool scanout_mode;
|
2015-01-20 12:43:28 +01:00
|
|
|
#endif
|
2015-03-04 15:37:27 +01:00
|
|
|
} VirtualGfxConsole;
|
|
|
|
|
|
|
|
#if defined(CONFIG_VTE)
|
|
|
|
typedef struct VirtualVteConsole {
|
|
|
|
GtkWidget *box;
|
|
|
|
GtkWidget *scrollbar;
|
|
|
|
GtkWidget *terminal;
|
2016-12-07 14:20:22 +01:00
|
|
|
Chardev *chr;
|
2015-12-17 13:47:02 +01:00
|
|
|
bool echo;
|
2015-03-04 15:37:27 +01:00
|
|
|
} VirtualVteConsole;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
typedef enum VirtualConsoleType {
|
|
|
|
GD_VC_GFX,
|
|
|
|
GD_VC_VTE,
|
|
|
|
} VirtualConsoleType;
|
|
|
|
|
|
|
|
typedef struct VirtualConsole {
|
|
|
|
GtkDisplayState *s;
|
|
|
|
char *label;
|
|
|
|
GtkWidget *window;
|
|
|
|
GtkWidget *menu_item;
|
|
|
|
GtkWidget *tab_item;
|
|
|
|
GtkWidget *focus;
|
|
|
|
VirtualConsoleType type;
|
|
|
|
union {
|
|
|
|
VirtualGfxConsole gfx;
|
|
|
|
#if defined(CONFIG_VTE)
|
|
|
|
VirtualVteConsole vte;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
} VirtualConsole;
|
|
|
|
|
2018-03-06 10:09:46 +01:00
|
|
|
extern bool gtk_use_gl_area;
|
|
|
|
|
2015-01-20 12:43:28 +01:00
|
|
|
/* ui/gtk.c */
|
|
|
|
void gd_update_windowsize(VirtualConsole *vc);
|
|
|
|
|
|
|
|
/* ui/gtk-egl.c */
|
|
|
|
void gd_egl_init(VirtualConsole *vc);
|
|
|
|
void gd_egl_draw(VirtualConsole *vc);
|
|
|
|
void gd_egl_update(DisplayChangeListener *dcl,
|
|
|
|
int x, int y, int w, int h);
|
|
|
|
void gd_egl_refresh(DisplayChangeListener *dcl);
|
|
|
|
void gd_egl_switch(DisplayChangeListener *dcl,
|
|
|
|
DisplaySurface *surface);
|
2015-05-08 11:30:51 +02:00
|
|
|
QEMUGLContext gd_egl_create_context(DisplayChangeListener *dcl,
|
|
|
|
QEMUGLParams *params);
|
2017-02-21 10:37:21 +01:00
|
|
|
void gd_egl_scanout_disable(DisplayChangeListener *dcl);
|
2017-02-21 10:37:16 +01:00
|
|
|
void gd_egl_scanout_texture(DisplayChangeListener *dcl,
|
|
|
|
uint32_t backing_id,
|
|
|
|
bool backing_y_0_top,
|
|
|
|
uint32_t backing_width,
|
|
|
|
uint32_t backing_height,
|
|
|
|
uint32_t x, uint32_t y,
|
|
|
|
uint32_t w, uint32_t h);
|
2018-03-06 10:09:50 +01:00
|
|
|
void gd_egl_scanout_dmabuf(DisplayChangeListener *dcl,
|
|
|
|
QemuDmaBuf *dmabuf);
|
2018-03-06 10:09:51 +01:00
|
|
|
void gd_egl_cursor_dmabuf(DisplayChangeListener *dcl,
|
|
|
|
QemuDmaBuf *dmabuf, bool have_hot,
|
|
|
|
uint32_t hot_x, uint32_t hot_y);
|
|
|
|
void gd_egl_cursor_position(DisplayChangeListener *dcl,
|
|
|
|
uint32_t pos_x, uint32_t pos_y);
|
2018-03-06 10:09:50 +01:00
|
|
|
void gd_egl_release_dmabuf(DisplayChangeListener *dcl,
|
|
|
|
QemuDmaBuf *dmabuf);
|
2015-05-08 11:30:51 +02:00
|
|
|
void gd_egl_scanout_flush(DisplayChangeListener *dcl,
|
|
|
|
uint32_t x, uint32_t y, uint32_t w, uint32_t h);
|
2018-06-18 13:21:41 +02:00
|
|
|
void gtk_egl_init(DisplayGLMode mode);
|
2015-05-08 11:30:51 +02:00
|
|
|
int gd_egl_make_current(DisplayChangeListener *dcl,
|
|
|
|
QEMUGLContext ctx);
|
2015-01-20 12:43:28 +01:00
|
|
|
|
2015-05-26 12:26:21 +02:00
|
|
|
/* ui/gtk-gl-area.c */
|
|
|
|
void gd_gl_area_init(VirtualConsole *vc);
|
|
|
|
void gd_gl_area_draw(VirtualConsole *vc);
|
|
|
|
void gd_gl_area_update(DisplayChangeListener *dcl,
|
|
|
|
int x, int y, int w, int h);
|
|
|
|
void gd_gl_area_refresh(DisplayChangeListener *dcl);
|
|
|
|
void gd_gl_area_switch(DisplayChangeListener *dcl,
|
|
|
|
DisplaySurface *surface);
|
|
|
|
QEMUGLContext gd_gl_area_create_context(DisplayChangeListener *dcl,
|
|
|
|
QEMUGLParams *params);
|
|
|
|
void gd_gl_area_destroy_context(DisplayChangeListener *dcl,
|
|
|
|
QEMUGLContext ctx);
|
2017-02-21 10:37:16 +01:00
|
|
|
void gd_gl_area_scanout_texture(DisplayChangeListener *dcl,
|
|
|
|
uint32_t backing_id,
|
|
|
|
bool backing_y_0_top,
|
|
|
|
uint32_t backing_width,
|
|
|
|
uint32_t backing_height,
|
|
|
|
uint32_t x, uint32_t y,
|
|
|
|
uint32_t w, uint32_t h);
|
2015-05-26 12:26:21 +02:00
|
|
|
void gd_gl_area_scanout_flush(DisplayChangeListener *dcl,
|
|
|
|
uint32_t x, uint32_t y, uint32_t w, uint32_t h);
|
|
|
|
void gtk_gl_area_init(void);
|
|
|
|
QEMUGLContext gd_gl_area_get_current_context(DisplayChangeListener *dcl);
|
|
|
|
int gd_gl_area_make_current(DisplayChangeListener *dcl,
|
|
|
|
QEMUGLContext ctx);
|
|
|
|
|
2015-03-04 15:37:27 +01:00
|
|
|
#endif /* UI_GTK_H */
|