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:
parent
fd7c1bea17
commit
830473455f
24
ui/sdl2.c
24
ui/sdl2.c
@ -30,6 +30,7 @@
|
||||
#include "ui/sdl2.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "ui/win32-kbd-hook.h"
|
||||
|
||||
static int sdl2_num_outputs;
|
||||
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);
|
||||
gui_grab = 1;
|
||||
win32_kbd_set_grab(true);
|
||||
sdl_update_caption(scon);
|
||||
}
|
||||
|
||||
@ -227,6 +229,7 @@ static void sdl_grab_end(struct sdl2_console *scon)
|
||||
{
|
||||
SDL_SetWindowGrab(scon->real_window, SDL_FALSE);
|
||||
gui_grab = 0;
|
||||
win32_kbd_set_grab(false);
|
||||
sdl_show_cursor(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)
|
||||
{
|
||||
int win;
|
||||
@ -544,6 +560,11 @@ static void handle_windowevent(SDL_Event *ev)
|
||||
sdl2_redraw(scon);
|
||||
break;
|
||||
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:
|
||||
if (!gui_grab && (qemu_input_is_absolute() || absolute_enabled)) {
|
||||
absolute_mouse_grab(scon);
|
||||
@ -558,6 +579,9 @@ static void handle_windowevent(SDL_Event *ev)
|
||||
scon->ignore_hotkeys = get_mod_state();
|
||||
break;
|
||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||
if (qemu_console_is_graphic(scon->dcl.con)) {
|
||||
win32_kbd_set_window(NULL);
|
||||
}
|
||||
if (gui_grab && !gui_fullscreen) {
|
||||
sdl_grab_end(scon);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user