@@ -30,6 +30,9 @@
#include "ui/sdl2.h"
#include "sysemu/runstate.h"
#include "sysemu/sysemu.h"
+#ifdef CONFIG_WIN32
+#include "win32-kbd-hook.h"
+#endif
static int sdl2_num_outputs;
static struct sdl2_console *sdl2_console;
@@ -220,6 +223,9 @@ static void sdl_grab_start(struct sdl2_console *scon)
}
SDL_SetWindowGrab(scon->real_window, SDL_TRUE);
gui_grab = 1;
+#ifdef CONFIG_WIN32
+ win32_kbd_set_grab(true);
+#endif
sdl_update_caption(scon);
}
@@ -227,6 +233,9 @@ static void sdl_grab_end(struct sdl2_console *scon)
{
SDL_SetWindowGrab(scon->real_window, SDL_FALSE);
gui_grab = 0;
+#ifdef CONFIG_WIN32
+ win32_kbd_set_grab(false);
+#endif
sdl_show_cursor(scon);
sdl_update_caption(scon);
}
@@ -532,6 +541,18 @@ static void handle_windowevent(SDL_Event *ev)
sdl2_redraw(scon);
break;
case SDL_WINDOWEVENT_FOCUS_GAINED:
+#ifdef CONFIG_WIN32
+ if (qemu_console_is_graphic(scon->dcl.con)) {
+ SDL_SysWMinfo info;
+
+ SDL_VERSION(&info.version);
+ if (SDL_GetWindowWMInfo(scon->real_window, &info)) {
+ win32_kbd_set_grab(gui_grab);
+ win32_kbd_set_window(info.info.win.window);
+ }
+ }
+#endif
+ /* fall through */
case SDL_WINDOWEVENT_ENTER:
if (!gui_grab && (qemu_input_is_absolute() || absolute_enabled)) {
absolute_mouse_grab(scon);
@@ -546,6 +567,11 @@ static void handle_windowevent(SDL_Event *ev)
scon->ignore_hotkeys = get_mod_state();
break;
case SDL_WINDOWEVENT_FOCUS_LOST:
+#ifdef CONFIG_WIN32
+ if (qemu_console_is_graphic(scon->dcl.con)) {
+ win32_kbd_set_window(NULL);
+ }
+#endif
if (gui_grab && !gui_fullscreen) {
sdl_grab_end(scon);
}
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> --- ui/sdl2.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)