Hi, attaching a few more fixes for the most annoying regressions I encountered with the SDL2 UI.
On Sat, Oct 14, 2017 at 11:34 AM Jindřich Makovička <[email protected]> wrote: > Hi, > > I had to apply the attached patch to make the SDL2 UI of any use - the > vanilla version (both Debian Sid package and qemu git master) stops > updating after the window is obscured, minimized, or after a virtual > desktop switch. > > It partially reverts the following hack: > > commit d3f3a0f453ea590be529079ae214c200bb5ecc1a > Author: Max Reitz <[email protected]> > Date: Fri Dec 12 10:52:52 2014 +0100 > > sdl2: Work around SDL2 SDL_ShowWindow() bug > > Regards, > -- > Jindřich Makovička > -- Jindřich Makovička
From 2c2f2a5e754a98eaf3ffcccd211ecbe03f0cc688 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka <[email protected]> Date: Sat, 14 Oct 2017 11:27:50 +0200 Subject: [PATCH 1/7] sdl2: Fix broken display updating after the window is hidden With SDL 2.0.6, calling SDL_ShowWindow during SDL_WINDOWEVENT_HIDDEN blocks all subsequent display updates. --- ui/sdl2.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index 53dd447fd2..7f51933234 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -576,11 +576,6 @@ static void handle_windowevent(SDL_Event *ev) SDL_HideWindow(scon->real_window); } break; - case SDL_WINDOWEVENT_HIDDEN: - if (!scon->hidden) { - SDL_ShowWindow(scon->real_window); - } - break; } } -- 2.15.0.rc0
From 259e194d23b5c2b05e1f287bf3e3907d472b33a9 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka <[email protected]> Date: Sat, 14 Oct 2017 16:27:50 +0200 Subject: [PATCH 4/7] sdl2: Only accept the hotkeys on the main window --- ui/sdl2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index 685e4fabec..fa54353430 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -349,7 +349,7 @@ static void handle_keydown(SDL_Event *ev) } gui_key_modifier_pressed = mod_state; - if (gui_key_modifier_pressed) { + if (gui_key_modifier_pressed && !ev->key.repeat && qemu_console_is_graphic(scon->dcl.con)) { switch (ev->key.keysym.scancode) { case SDL_SCANCODE_2: case SDL_SCANCODE_3: -- 2.15.0.rc0
From c2d7e30aecc659b616304836d4e6738f1f1e2029 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka <[email protected]> Date: Sat, 14 Oct 2017 16:26:08 +0200 Subject: [PATCH 2/7] sdl2: Do not quit the emulator when an auxilliary window is closed --- ui/sdl2.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index 7f51933234..aa37b39547 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -566,9 +566,13 @@ static void handle_windowevent(SDL_Event *ev) update_displaychangelistener(&scon->dcl, 500); break; case SDL_WINDOWEVENT_CLOSE: - if (!no_quit) { - no_shutdown = 0; - qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_UI); + if (qemu_console_is_graphic(scon->dcl.con)) { + if (!no_quit) { + no_shutdown = 0; + qemu_system_shutdown_request(SHUTDOWN_CAUSE_HOST_UI); + } + } else { + SDL_HideWindow(scon->real_window); } break; case SDL_WINDOWEVENT_SHOWN: -- 2.15.0.rc0
From 24af2557e8d6841fd316ab3efd4bb1481de578b7 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka <[email protected]> Date: Sat, 14 Oct 2017 17:11:01 +0200 Subject: [PATCH 5/7] sdl2 uses surface relative coordinates --- ui/sdl2.c | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index fa54353430..092eab37dc 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -276,32 +276,8 @@ static void sdl_send_mouse_event(struct sdl2_console *scon, int dx, int dy, } if (qemu_input_is_absolute()) { - int scr_w, scr_h; - int max_w = 0, max_h = 0; - int off_x = 0, off_y = 0; - int cur_off_x = 0, cur_off_y = 0; - int i; - - for (i = 0; i < sdl2_num_outputs; i++) { - struct sdl2_console *thiscon = &sdl2_console[i]; - if (thiscon->real_window && thiscon->surface) { - SDL_GetWindowSize(thiscon->real_window, &scr_w, &scr_h); - cur_off_x = thiscon->x; - cur_off_y = thiscon->y; - if (scr_w + cur_off_x > max_w) { - max_w = scr_w + cur_off_x; - } - if (scr_h + cur_off_y > max_h) { - max_h = scr_h + cur_off_y; - } - if (i == scon->idx) { - off_x = cur_off_x; - off_y = cur_off_y; - } - } - } - qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_X, off_x + x, 0, max_w); - qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_Y, off_y + y, 0, max_h); + qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_X, x, 0, surface_width(scon->surface)); + qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_Y, y, 0, surface_height(scon->surface)); } else { if (guest_cursor) { x -= guest_x; -- 2.15.0.rc0
From bc5d842a151426f0cc64ae489303ea0d5c77eaa8 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka <[email protected]> Date: Sat, 14 Oct 2017 19:27:29 +0200 Subject: [PATCH 6/7] sdl2: Fix dead keyboard after fullsceen --- ui/sdl2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/sdl2.c b/ui/sdl2.c index 092eab37dc..3823f0a834 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -418,6 +418,7 @@ static void handle_keyup(SDL_Event *ev) sdl2_reset_keys(scon); return; } + sdl2_reset_keys(scon); gui_keysym = 0; } if (!gui_keysym) { -- 2.15.0.rc0
From a93ccada2b060dacecfb4070477c6f3ffb252de8 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka <[email protected]> Date: Sat, 14 Oct 2017 16:27:23 +0200 Subject: [PATCH 3/7] sdl2: Do not hide the cursor on auxilliary windows --- ui/sdl2.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index aa37b39547..685e4fabec 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -169,10 +169,10 @@ static void sdl_hide_cursor(void) return; } - if (qemu_input_is_absolute()) { - SDL_ShowCursor(1); - SDL_SetCursor(sdl_cursor_hidden); - } else { + SDL_ShowCursor(SDL_DISABLE); + SDL_SetCursor(sdl_cursor_hidden); + + if (!qemu_input_is_absolute()) { SDL_SetRelativeMouseMode(SDL_TRUE); } } @@ -185,14 +185,16 @@ static void sdl_show_cursor(void) if (!qemu_input_is_absolute()) { SDL_SetRelativeMouseMode(SDL_FALSE); - SDL_ShowCursor(1); - if (guest_cursor && - (gui_grab || qemu_input_is_absolute() || absolute_enabled)) { - SDL_SetCursor(guest_sprite); - } else { - SDL_SetCursor(sdl_cursor_normal); - } } + + if (guest_cursor && + (gui_grab || qemu_input_is_absolute() || absolute_enabled)) { + SDL_SetCursor(guest_sprite); + } else { + SDL_SetCursor(sdl_cursor_normal); + } + + SDL_ShowCursor(SDL_ENABLE); } static void sdl_grab_start(struct sdl2_console *scon) @@ -463,6 +465,10 @@ static void handle_mousemotion(SDL_Event *ev) int max_x, max_y; struct sdl2_console *scon = get_scon_from_window(ev->key.windowID); + if (!qemu_console_is_graphic(scon->dcl.con)) { + return; + } + if (qemu_input_is_absolute() || absolute_enabled) { int scr_w, scr_h; SDL_GetWindowSize(scon->real_window, &scr_w, &scr_h); @@ -490,6 +496,10 @@ static void handle_mousebutton(SDL_Event *ev) SDL_MouseButtonEvent *bev; struct sdl2_console *scon = get_scon_from_window(ev->key.windowID); + if (!qemu_console_is_graphic(scon->dcl.con)) { + return; + } + bev = &ev->button; if (!gui_grab && !qemu_input_is_absolute()) { if (ev->type == SDL_MOUSEBUTTONUP && bev->button == SDL_BUTTON_LEFT) { @@ -512,6 +522,10 @@ static void handle_mousewheel(SDL_Event *ev) SDL_MouseWheelEvent *wev = &ev->wheel; InputButton btn; + if (!qemu_console_is_graphic(scon->dcl.con)) { + return; + } + if (wev->y > 0) { btn = INPUT_BUTTON_WHEEL_UP; } else if (wev->y < 0) { @@ -651,6 +665,11 @@ static void sdl_mouse_warp(DisplayChangeListener *dcl, int x, int y, int on) { struct sdl2_console *scon = container_of(dcl, struct sdl2_console, dcl); + + if (!qemu_console_is_graphic(scon->dcl.con)) { + return; + } + if (on) { if (!guest_cursor) { sdl_show_cursor(); -- 2.15.0.rc0
From e9f4233a7db2d5533a19d098084be8031f1d4a96 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka <[email protected]> Date: Sat, 14 Oct 2017 19:33:44 +0200 Subject: [PATCH 7/7] sdl2: Do not leave grab when fullscreen --- ui/sdl2.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/sdl2.c b/ui/sdl2.c index 3823f0a834..811c21da27 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -451,8 +451,9 @@ static void handle_mousemotion(SDL_Event *ev) SDL_GetWindowSize(scon->real_window, &scr_w, &scr_h); max_x = scr_w - 1; max_y = scr_h - 1; - if (gui_grab && (ev->motion.x == 0 || ev->motion.y == 0 || - ev->motion.x == max_x || ev->motion.y == max_y)) { + if (gui_grab && !gui_fullscreen + && (ev->motion.x == 0 || ev->motion.y == 0 || + ev->motion.x == max_x || ev->motion.y == max_y)) { sdl_grab_end(scon); } if (!gui_grab && -- 2.15.0.rc0

