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 "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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user