|
@@ -312,22 +312,28 @@ static void toggle_full_screen(struct sdl2_console *scon)
|
|
sdl2_redraw(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);
|
|
|
|
|
|
+ SDL_Keymod mod = SDL_GetModState();
|
|
|
|
|
|
if (alt_grab) {
|
|
if (alt_grab) {
|
|
- mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==
|
|
|
|
|
|
+ return (mod & (gui_grab_code | KMOD_LSHIFT)) ==
|
|
(gui_grab_code | KMOD_LSHIFT);
|
|
(gui_grab_code | KMOD_LSHIFT);
|
|
} else if (ctrl_grab) {
|
|
} else if (ctrl_grab) {
|
|
- mod_state = (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL;
|
|
|
|
|
|
+ return (mod & KMOD_RCTRL) == KMOD_RCTRL;
|
|
} else {
|
|
} else {
|
|
- mod_state = (SDL_GetModState() & gui_grab_code) == gui_grab_code;
|
|
|
|
|
|
+ return (mod & gui_grab_code) == gui_grab_code;
|
|
}
|
|
}
|
|
- gui_key_modifier_pressed = mod_state;
|
|
|
|
|
|
+}
|
|
|
|
|
|
- if (gui_key_modifier_pressed) {
|
|
|
|
|
|
+static void handle_keydown(SDL_Event *ev)
|
|
|
|
+{
|
|
|
|
+ int win;
|
|
|
|
+ struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
|
|
|
|
+
|
|
|
|
+ gui_key_modifier_pressed = get_mod_state();
|
|
|
|
+
|
|
|
|
+ if (!scon->ignore_hotkeys && gui_key_modifier_pressed && !ev->key.repeat) {
|
|
switch (ev->key.keysym.scancode) {
|
|
switch (ev->key.keysym.scancode) {
|
|
case SDL_SCANCODE_2:
|
|
case SDL_SCANCODE_2:
|
|
case SDL_SCANCODE_3:
|
|
case SDL_SCANCODE_3:
|
|
@@ -401,6 +407,8 @@ static void handle_keyup(SDL_Event *ev)
|
|
int mod_state;
|
|
int mod_state;
|
|
struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
|
|
struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
|
|
|
|
|
|
|
|
+ scon->ignore_hotkeys = false;
|
|
|
|
+
|
|
if (!alt_grab) {
|
|
if (!alt_grab) {
|
|
mod_state = (ev->key.keysym.mod & gui_grab_code);
|
|
mod_state = (ev->key.keysym.mod & gui_grab_code);
|
|
} else {
|
|
} else {
|
|
@@ -547,6 +555,14 @@ static void handle_windowevent(SDL_Event *ev)
|
|
if (!gui_grab && (qemu_input_is_absolute() || absolute_enabled)) {
|
|
if (!gui_grab && (qemu_input_is_absolute() || absolute_enabled)) {
|
|
absolute_mouse_grab(scon);
|
|
absolute_mouse_grab(scon);
|
|
}
|
|
}
|
|
|
|
+ /* If a new console window opened using a hotkey receives the
|
|
|
|
+ * focus, SDL sends another KEYDOWN event to the new window,
|
|
|
|
+ * closing the console window immediately after.
|
|
|
|
+ *
|
|
|
|
+ * Work around this by ignoring further hotkey events until a
|
|
|
|
+ * key is released.
|
|
|
|
+ */
|
|
|
|
+ scon->ignore_hotkeys = get_mod_state();
|
|
break;
|
|
break;
|
|
case SDL_WINDOWEVENT_FOCUS_LOST:
|
|
case SDL_WINDOWEVENT_FOCUS_LOST:
|
|
if (gui_grab && !gui_fullscreen) {
|
|
if (gui_grab && !gui_fullscreen) {
|