From 6bd84c985150ae4068ca16cae21bd1c82e57d493 Mon Sep 17 00:00:00 2001 From: Matt Borgerson Date: Thu, 12 Mar 2020 02:58:37 -0700 Subject: [PATCH] ui: Add header for xemu display --- include/ui/xemu-display.h | 78 +++++++++++++++++++++++++++++++++++++++ ui/Makefile.objs | 1 - ui/xemu-monitor.c | 1 - ui/xemu.c | 64 +++++++++++++++----------------- 4 files changed, 107 insertions(+), 37 deletions(-) create mode 100644 include/ui/xemu-display.h diff --git a/include/ui/xemu-display.h b/include/ui/xemu-display.h new file mode 100644 index 0000000000..cf531c79fd --- /dev/null +++ b/include/ui/xemu-display.h @@ -0,0 +1,78 @@ +#ifndef SDL2_H +#define SDL2_H + +/* Avoid compiler warning because macro is redefined in SDL_syswm.h. */ +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +#include "ui/kbd-state.h" + +struct sdl2_console { + DisplayChangeListener dcl; + DisplaySurface *surface; + DisplayOptions *opts; + SDL_Texture *texture; + SDL_Window *real_window; + SDL_Renderer *real_renderer; + int idx; + int last_vm_running; /* per console for caption reasons */ + int x, y, w, h; + int hidden; + int opengl; + int updates; + int idle_counter; + int ignore_hotkeys; + SDL_GLContext winctx; + QKbdState *kbd; +// #ifdef CONFIG_OPENGL + QemuGLShader *gls; + bool y0_top; + bool scanout_mode; +// #endif +}; + +void sdl2_window_create(struct sdl2_console *scon); +void sdl2_window_destroy(struct sdl2_console *scon); +void sdl2_window_resize(struct sdl2_console *scon); +void sdl2_poll_events(struct sdl2_console *scon); + +void sdl2_process_key(struct sdl2_console *scon, + SDL_KeyboardEvent *ev); + +void sdl2_2d_update(DisplayChangeListener *dcl, + int x, int y, int w, int h); +void sdl2_2d_switch(DisplayChangeListener *dcl, + DisplaySurface *new_surface); +void sdl2_2d_refresh(DisplayChangeListener *dcl); +void sdl2_2d_redraw(struct sdl2_console *scon); +bool sdl2_2d_check_format(DisplayChangeListener *dcl, + pixman_format_code_t format); + +void sdl2_gl_update(DisplayChangeListener *dcl, + int x, int y, int w, int h); +void sdl2_gl_switch(DisplayChangeListener *dcl, + DisplaySurface *new_surface); +void sdl2_gl_refresh(DisplayChangeListener *dcl); +void sdl2_gl_redraw(struct sdl2_console *scon); + +QEMUGLContext sdl2_gl_create_context(DisplayChangeListener *dcl, + QEMUGLParams *params); +void sdl2_gl_destroy_context(DisplayChangeListener *dcl, QEMUGLContext ctx); +int sdl2_gl_make_context_current(DisplayChangeListener *dcl, + QEMUGLContext ctx); +QEMUGLContext sdl2_gl_get_current_context(DisplayChangeListener *dcl); + +void sdl2_gl_scanout_disable(DisplayChangeListener *dcl); +void sdl2_gl_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); +void sdl2_gl_scanout_flush(DisplayChangeListener *dcl, + uint32_t x, uint32_t y, uint32_t w, uint32_t h); + +#endif /* SDL2_H */ diff --git a/ui/Makefile.objs b/ui/Makefile.objs index ad52d9fc13..12c8271c55 100644 --- a/ui/Makefile.objs +++ b/ui/Makefile.objs @@ -25,7 +25,6 @@ endif # Override with xemu UI sdl.mo-objs := \ - sdl2-input.o \ xemu.o \ xemu-hud.o \ xemu-custom-widgets.o \ diff --git a/ui/xemu-monitor.c b/ui/xemu-monitor.c index 4e137880a4..d6e99cc83c 100644 --- a/ui/xemu-monitor.c +++ b/ui/xemu-monitor.c @@ -26,7 +26,6 @@ #include "qemu-common.h" #include "ui/console.h" #include "ui/input.h" -#include "ui/sdl2.h" #include "sysemu/sysemu.h" #include "monitor/monitor.h" #include "chardev/char.h" diff --git a/ui/xemu.c b/ui/xemu.c index b50e97f275..7b4b8ebebc 100644 --- a/ui/xemu.c +++ b/ui/xemu.c @@ -32,7 +32,7 @@ #include "qemu-version.h" #include "ui/console.h" #include "ui/input.h" -#include "ui/sdl2.h" +#include "ui/xemu-display.h" #include "sysemu/runstate.h" #include "sysemu/sysemu.h" #include "xemu-hud.h" @@ -40,25 +40,6 @@ #include "xemu-settings.h" #include "xemu-shaders.h" -// void sdl2_window_create(struct sdl2_console *scon); -// void sdl2_window_destroy(struct sdl2_console *scon); -// void sdl2_window_resize(struct sdl2_console *scon); -// void sdl2_poll_events(struct sdl2_console *scon); - -// void sdl2_gl_update(DisplayChangeListener *dcl, -// int x, int y, int w, int h); -// void sdl2_gl_switch(DisplayChangeListener *dcl, -// DisplaySurface *new_surface); -// void sdl2_gl_refresh(DisplayChangeListener *dcl); -// void sdl2_gl_redraw(struct sdl2_console *scon); - -// QEMUGLContext sdl2_gl_create_context(DisplayChangeListener *dcl, -// QEMUGLParams *params); -// void sdl2_gl_destroy_context(DisplayChangeListener *dcl, QEMUGLContext ctx); -// int sdl2_gl_make_context_current(DisplayChangeListener *dcl, -// QEMUGLContext ctx); -// QEMUGLContext sdl2_gl_get_current_context(DisplayChangeListener *dcl); - void xb_surface_gl_create_texture(QemuGLShader *gls, DisplaySurface *surface); void xb_surface_gl_update_texture(QemuGLShader *gls, @@ -66,16 +47,6 @@ void xb_surface_gl_update_texture(QemuGLShader *gls, int x, int y, int w, int h); void xb_surface_gl_destroy_texture(QemuGLShader *gls, DisplaySurface *surface); -// void sdl2_gl_scanout_disable(DisplayChangeListener *dcl); -// void sdl2_gl_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); -// void sdl2_gl_scanout_flush(DisplayChangeListener *dcl, -// uint32_t x, uint32_t y, uint32_t w, uint32_t h); // FIXME: Move this to a better location void pre_swap(void); @@ -956,11 +927,6 @@ static void register_sdl1(void) type_init(register_sdl1); -#include "qemu/osdep.h" -#include "ui/console.h" -#include "ui/input.h" -#include "ui/sdl2.h" - void xb_surface_gl_create_texture(QemuGLShader *gls, DisplaySurface *surface) { @@ -1323,3 +1289,31 @@ void sdl2_gl_scanout_flush(DisplayChangeListener *dcl, SDL_GL_SwapWindow(scon->real_window); #endif } + +// sdl2-input.c +void sdl2_process_key(struct sdl2_console *scon, + SDL_KeyboardEvent *ev) +{ + int qcode; + QemuConsole *con = scon->dcl.con; + + if (ev->keysym.scancode >= qemu_input_map_usb_to_qcode_len) { + return; + } + qcode = qemu_input_map_usb_to_qcode[ev->keysym.scancode]; + qkbd_state_key_event(scon->kbd, qcode, ev->type == SDL_KEYDOWN); + + if (!qemu_console_is_graphic(con)) { + bool ctrl = qkbd_state_modifier_get(scon->kbd, QKBD_MOD_CTRL); + if (ev->type == SDL_KEYDOWN) { + switch (qcode) { + case Q_KEY_CODE_RET: + kbd_put_keysym_console(con, '\n'); + break; + default: + kbd_put_qcode_console(con, qcode, ctrl); + break; + } + } + } +}