[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 8/8] sdl2: Ignore UI hotkeys after a focus change wh
From: |
Jindrich Makovicka |
Subject: |
[Qemu-devel] [PATCH 8/8] sdl2: Ignore UI hotkeys after a focus change when GUI modifier is held |
Date: |
Sun, 12 Nov 2017 11:42:46 +0100 |
When SDL2 windows change focus while a key is held, the window that
receives the focus also receives a new KeyDown event, without an
autorepeat flag. This means that if a WM places the qemu console
over the main window after Ctrl-Alt-2, the console closes immediately
after opening. Then, the main window receives the KeyDown event again
and the whole process repeats.
This patch makes the SDL2 UI ignore the KeyDown events on a window that
just received the focus, if the GUI modifier was held. The ignore flag
is reset on a first KeyUp event. This effectively works around the issue
above.
---
include/ui/sdl2.h | 1 +
ui/sdl2.c | 25 ++++++++++++++++---------
2 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/include/ui/sdl2.h b/include/ui/sdl2.h
index b29cf803c9..51084e6320 100644
--- a/include/ui/sdl2.h
+++ b/include/ui/sdl2.h
@@ -24,6 +24,7 @@ struct sdl2_console {
int opengl;
int updates;
int idle_counter;
+ int ignore_hotkeys;
SDL_GLContext winctx;
#ifdef CONFIG_OPENGL
QemuGLShader *gls;
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 6feb637739..2d48686b83 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -310,22 +310,26 @@ static void toggle_full_screen(struct sdl2_console *scon)
sdl2_redraw(scon);
}
-static void handle_keydown(SDL_Event *ev)
+static int get_mod_state(void)
{
- int mod_state, win;
- struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
-
if (alt_grab) {
- mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==
+ return (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==
(gui_grab_code | KMOD_LSHIFT);
} else if (ctrl_grab) {
- mod_state = (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL;
+ return (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL;
} else {
- mod_state = (SDL_GetModState() & gui_grab_code) == gui_grab_code;
+ return (SDL_GetModState() & gui_grab_code) == gui_grab_code;
}
- gui_key_modifier_pressed = mod_state;
+}
+
+static void handle_keydown(SDL_Event *ev)
+{
+ int win;
+ struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
- if (gui_key_modifier_pressed) {
+ gui_key_modifier_pressed = get_mod_state();
+
+ if (!scon->ignore_hotkeys && gui_key_modifier_pressed && !ev->key.repeat) {
switch (ev->key.keysym.scancode) {
case SDL_SCANCODE_2:
case SDL_SCANCODE_3:
@@ -399,6 +403,8 @@ static void handle_keyup(SDL_Event *ev)
int mod_state;
struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
+ scon->ignore_hotkeys = false;
+
if (!alt_grab) {
mod_state = (ev->key.keysym.mod & gui_grab_code);
} else {
@@ -545,6 +551,7 @@ static void handle_windowevent(SDL_Event *ev)
if (!gui_grab && (qemu_input_is_absolute() || absolute_enabled)) {
absolute_mouse_grab(scon);
}
+ scon->ignore_hotkeys = get_mod_state();
break;
case SDL_WINDOWEVENT_FOCUS_LOST:
if (gui_grab && !gui_fullscreen) {
--
2.15.0
- [Qemu-devel] [PATCH] SDL2 various fixes, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 2/8] sdl2: Do not quit the emulator when an auxilliary window is closed, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 3/8] sdl2: Use the same pointer show/hide logic for absolute and relative mode, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 4/8] sdl2: Do not hide the cursor on auxilliary windows, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 6/8] sdl2: Fix dead keyboard after fullsceen, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 5/8] sdl2 uses surface relative coordinates, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 1/8] sdl2: Fix broken display updating after the window is hidden, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 7/8] sdl2: Do not leave grab when fullscreen, Jindrich Makovicka, 2017/11/12
- [Qemu-devel] [PATCH 8/8] sdl2: Ignore UI hotkeys after a focus change when GUI modifier is held,
Jindrich Makovicka <=
- Re: [Qemu-devel] [PATCH] SDL2 various fixes, Philippe Mathieu-Daudé, 2017/11/12
- [Qemu-devel] [PATCH 1/8] sdl2: Fix broken display updating after the window is hidden, Jindrich Makovicka, 2017/11/12
- Re: [Qemu-devel] [PATCH 1/8] sdl2: Fix broken display updating after the window is hidden, Gerd Hoffmann, 2017/11/13
- Re: [Qemu-devel] [PATCH 1/8] sdl2: Fix broken display updating after the window is hidden, Gerd Hoffmann, 2017/11/13