ui/sdl2: fix handling of AltGr key on Windows

Wire up the keyboard hooking code on Windows to fix the AltGr
key and improve keyboard grabbing.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-6-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Volker Rümelin 2020-05-16 09:20:09 +02:00 committed by Gerd Hoffmann
parent fd7c1bea17
commit 830473455f

View File

@ -30,6 +30,7 @@
#include "ui/sdl2.h" #include "ui/sdl2.h"
#include "sysemu/runstate.h" #include "sysemu/runstate.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "ui/win32-kbd-hook.h"
static int sdl2_num_outputs; static int sdl2_num_outputs;
static struct sdl2_console *sdl2_console; static struct sdl2_console *sdl2_console;
@ -220,6 +221,7 @@ static void sdl_grab_start(struct sdl2_console *scon)
} }
SDL_SetWindowGrab(scon->real_window, SDL_TRUE); SDL_SetWindowGrab(scon->real_window, SDL_TRUE);
gui_grab = 1; gui_grab = 1;
win32_kbd_set_grab(true);
sdl_update_caption(scon); sdl_update_caption(scon);
} }
@ -227,6 +229,7 @@ static void sdl_grab_end(struct sdl2_console *scon)
{ {
SDL_SetWindowGrab(scon->real_window, SDL_FALSE); SDL_SetWindowGrab(scon->real_window, SDL_FALSE);
gui_grab = 0; gui_grab = 0;
win32_kbd_set_grab(false);
sdl_show_cursor(scon); sdl_show_cursor(scon);
sdl_update_caption(scon); sdl_update_caption(scon);
} }
@ -325,6 +328,19 @@ static int get_mod_state(void)
} }
} }
static void *sdl2_win32_get_hwnd(struct sdl2_console *scon)
{
#ifdef CONFIG_WIN32
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
if (SDL_GetWindowWMInfo(scon->real_window, &info)) {
return info.info.win.window;
}
#endif
return NULL;
}
static void handle_keydown(SDL_Event *ev) static void handle_keydown(SDL_Event *ev)
{ {
int win; int win;
@ -544,6 +560,11 @@ static void handle_windowevent(SDL_Event *ev)
sdl2_redraw(scon); sdl2_redraw(scon);
break; break;
case SDL_WINDOWEVENT_FOCUS_GAINED: case SDL_WINDOWEVENT_FOCUS_GAINED:
win32_kbd_set_grab(gui_grab);
if (qemu_console_is_graphic(scon->dcl.con)) {
win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
}
/* fall through */
case SDL_WINDOWEVENT_ENTER: case SDL_WINDOWEVENT_ENTER:
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);
@ -558,6 +579,9 @@ static void handle_windowevent(SDL_Event *ev)
scon->ignore_hotkeys = get_mod_state(); scon->ignore_hotkeys = get_mod_state();
break; break;
case SDL_WINDOWEVENT_FOCUS_LOST: case SDL_WINDOWEVENT_FOCUS_LOST:
if (qemu_console_is_graphic(scon->dcl.con)) {
win32_kbd_set_window(NULL);
}
if (gui_grab && !gui_fullscreen) { if (gui_grab && !gui_fullscreen) {
sdl_grab_end(scon); sdl_grab_end(scon);
} }