* [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-09 6:12 SDL2 keyboard fixes on Windows Volker Rümelin
@ 2024-09-09 6:15 ` Volker Rümelin
2024-09-09 7:26 ` Marc-André Lureau
2024-09-09 6:15 ` [PATCH 2/3] ui/sdl2: release all modifiers Volker Rümelin
` (2 subsequent siblings)
3 siblings, 1 reply; 12+ messages in thread
From: Volker Rümelin @ 2024-09-09 6:15 UTC (permalink / raw)
To: Marc-André Lureau, Stefan Weil
Cc: Howard Spoelstra, Bernhard Beschow, qemu-devel
Windows only:
The libSDL2 Windows message loop needs the libSDL2 Windows low
level keyboard hook procedure to grab the left and right Windows
keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
Because the QEMU Windows keyboard hook procedure is still needed
to filter out the special left Control key event for every Alt Gr
key event, it's important to install the two keyboard hook
procedures in the following order. First the SDL2 procedure, then
the QEMU procedure.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---
ui/sdl2.c | 53 ++++++++++++++++++++++++++++++---------------
ui/win32-kbd-hook.c | 3 +++
2 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 98ed974371..ac37c173a1 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -42,6 +42,7 @@ static SDL_Surface *guest_sprite_surface;
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
static bool alt_grab;
static bool ctrl_grab;
+static bool win32_kbd_grab;
static int gui_saved_grab;
static int gui_fullscreen;
@@ -202,6 +203,19 @@ static void sdl_update_caption(struct sdl2_console *scon)
}
}
+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 sdl_hide_cursor(struct sdl2_console *scon)
{
if (scon->opts->has_show_cursor && scon->opts->show_cursor) {
@@ -259,9 +273,16 @@ static void sdl_grab_start(struct sdl2_console *scon)
} else {
sdl_hide_cursor(scon);
}
+ /*
+ * Windows: To ensure that QEMU's low level keyboard hook procedure is
+ * called before SDL2's, the QEMU procedure must first be removed and
+ * then the SDL2 and QEMU procedures must be installed in this order.
+ */
+ win32_kbd_set_window(NULL);
SDL_SetWindowGrab(scon->real_window, SDL_TRUE);
+ win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
gui_grab = 1;
- win32_kbd_set_grab(true);
+ win32_kbd_set_grab(win32_kbd_grab);
sdl_update_caption(scon);
}
@@ -370,19 +391,6 @@ 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;
@@ -605,7 +613,7 @@ static void handle_windowevent(SDL_Event *ev)
sdl2_redraw(scon);
break;
case SDL_WINDOWEVENT_FOCUS_GAINED:
- win32_kbd_set_grab(gui_grab);
+ win32_kbd_set_grab(win32_kbd_grab && gui_grab);
if (qemu_console_is_graphic(scon->dcl.con)) {
win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
}
@@ -849,6 +857,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
uint8_t data = 0;
int i;
SDL_SysWMinfo info;
+ SDL_version ver;
SDL_Surface *icon = NULL;
char *dir;
@@ -866,10 +875,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
#ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR /* only available since SDL 2.0.8 */
SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0");
#endif
-#ifndef CONFIG_WIN32
- /* QEMU uses its own low level keyboard hook procedure on Windows */
SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "1");
-#endif
#ifdef SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED
SDL_SetHint(SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED, "0");
#endif
@@ -877,6 +883,17 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
SDL_EnableScreenSaver();
memset(&info, 0, sizeof(info));
SDL_VERSION(&info.version);
+ /*
+ * Since version 2.16.0 under Windows, SDL2 has its own low level
+ * keyboard hook procedure to grab the keyboard. The remaining task of
+ * QEMU's low level keyboard hook procedure is to filter out the special
+ * left Control up/down key event for every Alt Gr key event on keyboards
+ * with an international layout.
+ */
+ SDL_GetVersion(&ver);
+ if (ver.major == 2 && ver.minor < 16) {
+ win32_kbd_grab = true;
+ }
gui_fullscreen = o->has_full_screen && o->full_screen;
diff --git a/ui/win32-kbd-hook.c b/ui/win32-kbd-hook.c
index 1ac237db9e..39d42134a2 100644
--- a/ui/win32-kbd-hook.c
+++ b/ui/win32-kbd-hook.c
@@ -91,6 +91,9 @@ void win32_kbd_set_window(void *hwnd)
win32_unhook_notifier.notify = keyboard_hook_unhook;
qemu_add_exit_notifier(&win32_unhook_notifier);
}
+ } else if (!hwnd && win32_keyboard_hook) {
+ keyboard_hook_unhook(&win32_unhook_notifier, NULL);
+ qemu_remove_exit_notifier(&win32_unhook_notifier);
}
win32_window = hwnd;
--
2.35.3
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-09 6:15 ` [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure Volker Rümelin
@ 2024-09-09 7:26 ` Marc-André Lureau
2024-09-09 8:02 ` Stefan Weil via
2024-09-09 19:38 ` Volker Rümelin
0 siblings, 2 replies; 12+ messages in thread
From: Marc-André Lureau @ 2024-09-09 7:26 UTC (permalink / raw)
To: Volker Rümelin
Cc: Stefan Weil, Howard Spoelstra, Bernhard Beschow, qemu-devel
Hi
On Mon, Sep 9, 2024 at 10:22 AM Volker Rümelin <vr_qemu@t-online.de> wrote:
>
> Windows only:
>
> The libSDL2 Windows message loop needs the libSDL2 Windows low
> level keyboard hook procedure to grab the left and right Windows
> keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
>
> Because the QEMU Windows keyboard hook procedure is still needed
> to filter out the special left Control key event for every Alt Gr
> key event, it's important to install the two keyboard hook
> procedures in the following order. First the SDL2 procedure, then
> the QEMU procedure.
>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
> Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
> ---
> ui/sdl2.c | 53 ++++++++++++++++++++++++++++++---------------
> ui/win32-kbd-hook.c | 3 +++
> 2 files changed, 38 insertions(+), 18 deletions(-)
>
> diff --git a/ui/sdl2.c b/ui/sdl2.c
> index 98ed974371..ac37c173a1 100644
> --- a/ui/sdl2.c
> +++ b/ui/sdl2.c
> @@ -42,6 +42,7 @@ static SDL_Surface *guest_sprite_surface;
> static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
> static bool alt_grab;
> static bool ctrl_grab;
> +static bool win32_kbd_grab;
>
> static int gui_saved_grab;
> static int gui_fullscreen;
> @@ -202,6 +203,19 @@ static void sdl_update_caption(struct sdl2_console *scon)
> }
> }
>
> +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 sdl_hide_cursor(struct sdl2_console *scon)
> {
> if (scon->opts->has_show_cursor && scon->opts->show_cursor) {
> @@ -259,9 +273,16 @@ static void sdl_grab_start(struct sdl2_console *scon)
> } else {
> sdl_hide_cursor(scon);
> }
> + /*
> + * Windows: To ensure that QEMU's low level keyboard hook procedure is
> + * called before SDL2's, the QEMU procedure must first be removed and
> + * then the SDL2 and QEMU procedures must be installed in this order.
> + */
> + win32_kbd_set_window(NULL);
> SDL_SetWindowGrab(scon->real_window, SDL_TRUE);
> + win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
> gui_grab = 1;
> - win32_kbd_set_grab(true);
> + win32_kbd_set_grab(win32_kbd_grab);
> sdl_update_caption(scon);
> }
>
> @@ -370,19 +391,6 @@ 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;
> @@ -605,7 +613,7 @@ static void handle_windowevent(SDL_Event *ev)
> sdl2_redraw(scon);
> break;
> case SDL_WINDOWEVENT_FOCUS_GAINED:
> - win32_kbd_set_grab(gui_grab);
> + win32_kbd_set_grab(win32_kbd_grab && gui_grab);
> if (qemu_console_is_graphic(scon->dcl.con)) {
> win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
> }
> @@ -849,6 +857,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
> uint8_t data = 0;
> int i;
> SDL_SysWMinfo info;
> + SDL_version ver;
> SDL_Surface *icon = NULL;
> char *dir;
>
> @@ -866,10 +875,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
> #ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR /* only available since SDL 2.0.8 */
> SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0");
> #endif
> -#ifndef CONFIG_WIN32
> - /* QEMU uses its own low level keyboard hook procedure on Windows */
> SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "1");
> -#endif
> #ifdef SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED
> SDL_SetHint(SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED, "0");
> #endif
> @@ -877,6 +883,17 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
> SDL_EnableScreenSaver();
> memset(&info, 0, sizeof(info));
> SDL_VERSION(&info.version);
> + /*
> + * Since version 2.16.0 under Windows, SDL2 has its own low level
> + * keyboard hook procedure to grab the keyboard. The remaining task of
> + * QEMU's low level keyboard hook procedure is to filter out the special
> + * left Control up/down key event for every Alt Gr key event on keyboards
> + * with an international layout.
> + */
> + SDL_GetVersion(&ver);
> + if (ver.major == 2 && ver.minor < 16) {
> + win32_kbd_grab = true;
> + }
>
Note: there is no 2.16 release. They jumped from 2.0.22 to 2.24 (see
https://github.com/libsdl-org/SDL/releases/tag/release-2.24.0)
The windows hook was indeed added in 2.0.16, released on Aug 10, 2021.
Given the distribution nature of the Windows binaries, I think we
could simply depend on a much recent version without worrying about
compatibility with < 2.0.16. This would help reduce the potential
combinations of versions and bugs reports.
> gui_fullscreen = o->has_full_screen && o->full_screen;
>
> diff --git a/ui/win32-kbd-hook.c b/ui/win32-kbd-hook.c
> index 1ac237db9e..39d42134a2 100644
> --- a/ui/win32-kbd-hook.c
> +++ b/ui/win32-kbd-hook.c
> @@ -91,6 +91,9 @@ void win32_kbd_set_window(void *hwnd)
> win32_unhook_notifier.notify = keyboard_hook_unhook;
> qemu_add_exit_notifier(&win32_unhook_notifier);
> }
> + } else if (!hwnd && win32_keyboard_hook) {
> + keyboard_hook_unhook(&win32_unhook_notifier, NULL);
> + qemu_remove_exit_notifier(&win32_unhook_notifier);
> }
>
> win32_window = hwnd;
> --
> 2.35.3
>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-09 7:26 ` Marc-André Lureau
@ 2024-09-09 8:02 ` Stefan Weil via
2024-09-09 19:38 ` Volker Rümelin
1 sibling, 0 replies; 12+ messages in thread
From: Stefan Weil via @ 2024-09-09 8:02 UTC (permalink / raw)
To: Marc-André Lureau, Volker Rümelin
Cc: Howard Spoelstra, Bernhard Beschow, qemu-devel
Am 09.09.24 um 09:26 schrieb Marc-André Lureau:
> Hi
>
> On Mon, Sep 9, 2024 at 10:22 AM Volker Rümelin <vr_qemu@t-online.de> wrote:
>> Windows only:
>>
>> The libSDL2 Windows message loop needs the libSDL2 Windows low
>> level keyboard hook procedure to grab the left and right Windows
>> keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
>>
>> Because the QEMU Windows keyboard hook procedure is still needed
>> to filter out the special left Control key event for every Alt Gr
>> key event, it's important to install the two keyboard hook
>> procedures in the following order. First the SDL2 procedure, then
>> the QEMU procedure.
>>
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>> Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>> ---
>> ui/sdl2.c | 53 ++++++++++++++++++++++++++++++---------------
>> ui/win32-kbd-hook.c | 3 +++
>> 2 files changed, 38 insertions(+), 18 deletions(-)
>>
>> diff --git a/ui/sdl2.c b/ui/sdl2.c
>> index 98ed974371..ac37c173a1 100644
>> --- a/ui/sdl2.c
>> +++ b/ui/sdl2.c
[...]
>> @@ -877,6 +883,17 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>> SDL_EnableScreenSaver();
>> memset(&info, 0, sizeof(info));
>> SDL_VERSION(&info.version);
>> + /*
>> + * Since version 2.16.0 under Windows, SDL2 has its own low level
>> + * keyboard hook procedure to grab the keyboard. The remaining task of
>> + * QEMU's low level keyboard hook procedure is to filter out the special
>> + * left Control up/down key event for every Alt Gr key event on keyboards
>> + * with an international layout.
>> + */
>> + SDL_GetVersion(&ver);
>> + if (ver.major == 2 && ver.minor < 16) {
>> + win32_kbd_grab = true;
>> + }
>>
> Note: there is no 2.16 release. They jumped from 2.0.22 to 2.24 (see
> https://github.com/libsdl-org/SDL/releases/tag/release-2.24.0)
>
> The windows hook was indeed added in 2.0.16, released on Aug 10, 2021.
>
> Given the distribution nature of the Windows binaries, I think we
> could simply depend on a much recent version without worrying about
> compatibility with < 2.0.16. This would help reduce the potential
> combinations of versions and bugs reports.
[...]
I agree. My builds for Windows typically use the very latest versions,
for example mingw-w64-i686-SDL2-2.30.7-1-any for the next build. So
depending on a recent SDL version would be fine for me.
Stefan W.
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-09 7:26 ` Marc-André Lureau
2024-09-09 8:02 ` Stefan Weil via
@ 2024-09-09 19:38 ` Volker Rümelin
2024-09-11 11:57 ` Philippe Mathieu-Daudé
2024-12-07 12:46 ` Bernhard Beschow
1 sibling, 2 replies; 12+ messages in thread
From: Volker Rümelin @ 2024-09-09 19:38 UTC (permalink / raw)
To: Marc-André Lureau
Cc: Stefan Weil, Howard Spoelstra, Bernhard Beschow, qemu-devel
Am 09.09.24 um 09:26 schrieb Marc-André Lureau:
> Hi
>
> On Mon, Sep 9, 2024 at 10:22 AM Volker Rümelin <vr_qemu@t-online.de> wrote:
>> Windows only:
>>
>> The libSDL2 Windows message loop needs the libSDL2 Windows low
>> level keyboard hook procedure to grab the left and right Windows
>> keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
>>
>> Because the QEMU Windows keyboard hook procedure is still needed
>> to filter out the special left Control key event for every Alt Gr
>> key event, it's important to install the two keyboard hook
>> procedures in the following order. First the SDL2 procedure, then
>> the QEMU procedure.
>>
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>> Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>> ---
>> ui/sdl2.c | 53 ++++++++++++++++++++++++++++++---------------
>> ui/win32-kbd-hook.c | 3 +++
>> 2 files changed, 38 insertions(+), 18 deletions(-)
>>
>> diff --git a/ui/sdl2.c b/ui/sdl2.c
>> index 98ed974371..ac37c173a1 100644
>> --- a/ui/sdl2.c
>> +++ b/ui/sdl2.c
>> @@ -42,6 +42,7 @@ static SDL_Surface *guest_sprite_surface;
>> static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
>> static bool alt_grab;
>> static bool ctrl_grab;
>> +static bool win32_kbd_grab;
>>
>> static int gui_saved_grab;
>> static int gui_fullscreen;
>> @@ -202,6 +203,19 @@ static void sdl_update_caption(struct sdl2_console *scon)
>> }
>> }
>>
>> +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 sdl_hide_cursor(struct sdl2_console *scon)
>> {
>> if (scon->opts->has_show_cursor && scon->opts->show_cursor) {
>> @@ -259,9 +273,16 @@ static void sdl_grab_start(struct sdl2_console *scon)
>> } else {
>> sdl_hide_cursor(scon);
>> }
>> + /*
>> + * Windows: To ensure that QEMU's low level keyboard hook procedure is
>> + * called before SDL2's, the QEMU procedure must first be removed and
>> + * then the SDL2 and QEMU procedures must be installed in this order.
>> + */
>> + win32_kbd_set_window(NULL);
>> SDL_SetWindowGrab(scon->real_window, SDL_TRUE);
>> + win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
>> gui_grab = 1;
>> - win32_kbd_set_grab(true);
>> + win32_kbd_set_grab(win32_kbd_grab);
>> sdl_update_caption(scon);
>> }
>>
>> @@ -370,19 +391,6 @@ 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;
>> @@ -605,7 +613,7 @@ static void handle_windowevent(SDL_Event *ev)
>> sdl2_redraw(scon);
>> break;
>> case SDL_WINDOWEVENT_FOCUS_GAINED:
>> - win32_kbd_set_grab(gui_grab);
>> + win32_kbd_set_grab(win32_kbd_grab && gui_grab);
>> if (qemu_console_is_graphic(scon->dcl.con)) {
>> win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
>> }
>> @@ -849,6 +857,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>> uint8_t data = 0;
>> int i;
>> SDL_SysWMinfo info;
>> + SDL_version ver;
>> SDL_Surface *icon = NULL;
>> char *dir;
>>
>> @@ -866,10 +875,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>> #ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR /* only available since SDL 2.0.8 */
>> SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0");
>> #endif
>> -#ifndef CONFIG_WIN32
>> - /* QEMU uses its own low level keyboard hook procedure on Windows */
>> SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "1");
>> -#endif
>> #ifdef SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED
>> SDL_SetHint(SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED, "0");
>> #endif
>> @@ -877,6 +883,17 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>> SDL_EnableScreenSaver();
>> memset(&info, 0, sizeof(info));
>> SDL_VERSION(&info.version);
>> + /*
>> + * Since version 2.16.0 under Windows, SDL2 has its own low level
>> + * keyboard hook procedure to grab the keyboard. The remaining task of
>> + * QEMU's low level keyboard hook procedure is to filter out the special
>> + * left Control up/down key event for every Alt Gr key event on keyboards
>> + * with an international layout.
>> + */
>> + SDL_GetVersion(&ver);
>> + if (ver.major == 2 && ver.minor < 16) {
>> + win32_kbd_grab = true;
>> + }
>>
> Note: there is no 2.16 release. They jumped from 2.0.22 to 2.24 (see
> https://github.com/libsdl-org/SDL/releases/tag/release-2.24.0)
Hi Marc-André
Oh. This means that the comparison I wrote is true for SDL2 versions <
2.24.0.
>
> The windows hook was indeed added in 2.0.16, released on Aug 10, 2021.
>
> Given the distribution nature of the Windows binaries, I think we
> could simply depend on a much recent version without worrying about
> compatibility with < 2.0.16. This would help reduce the potential
> combinations of versions and bugs reports.
Okay, I'll send a version 2 patch series.
With best regards
Volker
>
>> gui_fullscreen = o->has_full_screen && o->full_screen;
>>
>> diff --git a/ui/win32-kbd-hook.c b/ui/win32-kbd-hook.c
>> index 1ac237db9e..39d42134a2 100644
>> --- a/ui/win32-kbd-hook.c
>> +++ b/ui/win32-kbd-hook.c
>> @@ -91,6 +91,9 @@ void win32_kbd_set_window(void *hwnd)
>> win32_unhook_notifier.notify = keyboard_hook_unhook;
>> qemu_add_exit_notifier(&win32_unhook_notifier);
>> }
>> + } else if (!hwnd && win32_keyboard_hook) {
>> + keyboard_hook_unhook(&win32_unhook_notifier, NULL);
>> + qemu_remove_exit_notifier(&win32_unhook_notifier);
>> }
>>
>> win32_window = hwnd;
>> --
>> 2.35.3
>>
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-09 19:38 ` Volker Rümelin
@ 2024-09-11 11:57 ` Philippe Mathieu-Daudé
2024-09-11 11:59 ` Philippe Mathieu-Daudé
2024-12-07 12:46 ` Bernhard Beschow
1 sibling, 1 reply; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-09-11 11:57 UTC (permalink / raw)
To: Volker Rümelin, Marc-André Lureau
Cc: Stefan Weil, Howard Spoelstra, Bernhard Beschow, qemu-devel
Hi Volker,
On 9/9/24 21:38, Volker Rümelin wrote:
> Am 09.09.24 um 09:26 schrieb Marc-André Lureau:
>> Hi
>>
>> On Mon, Sep 9, 2024 at 10:22 AM Volker Rümelin <vr_qemu@t-online.de> wrote:
>>> Windows only:
>>>
>>> The libSDL2 Windows message loop needs the libSDL2 Windows low
>>> level keyboard hook procedure to grab the left and right Windows
>>> keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
>>>
>>> Because the QEMU Windows keyboard hook procedure is still needed
>>> to filter out the special left Control key event for every Alt Gr
>>> key event, it's important to install the two keyboard hook
>>> procedures in the following order. First the SDL2 procedure, then
>>> the QEMU procedure.
>>>
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>>> Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
>>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>>> ---
>>> ui/sdl2.c | 53 ++++++++++++++++++++++++++++++---------------
>>> ui/win32-kbd-hook.c | 3 +++
>>> 2 files changed, 38 insertions(+), 18 deletions(-)
>> Note: there is no 2.16 release. They jumped from 2.0.22 to 2.24 (see
>> https://github.com/libsdl-org/SDL/releases/tag/release-2.24.0)
>
> Hi Marc-André
>
> Oh. This means that the comparison I wrote is true for SDL2 versions <
> 2.24.0.
>
>>
>> The windows hook was indeed added in 2.0.16, released on Aug 10, 2021.
>>
>> Given the distribution nature of the Windows binaries, I think we
>> could simply depend on a much recent version without worrying about
>> compatibility with < 2.0.16. This would help reduce the potential
>> combinations of versions and bugs reports.
>
> Okay, I'll send a version 2 patch series.
Queuing patches 2 & 3 meanwhile. Please do not bury series within
threads, if Bernhard hadn't sent his T-b tag, I'd have missed it.
Regards,
Phil.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-11 11:57 ` Philippe Mathieu-Daudé
@ 2024-09-11 11:59 ` Philippe Mathieu-Daudé
2024-09-11 12:16 ` Bernhard Beschow
0 siblings, 1 reply; 12+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-09-11 11:59 UTC (permalink / raw)
To: Volker Rümelin, Marc-André Lureau
Cc: Stefan Weil, Howard Spoelstra, Bernhard Beschow, qemu-devel
On 11/9/24 13:57, Philippe Mathieu-Daudé wrote:
> Hi Volker,
>
> On 9/9/24 21:38, Volker Rümelin wrote:
>> Am 09.09.24 um 09:26 schrieb Marc-André Lureau:
>>> Hi
>>>
>>> On Mon, Sep 9, 2024 at 10:22 AM Volker Rümelin <vr_qemu@t-online.de>
>>> wrote:
>>>> Windows only:
>>>>
>>>> The libSDL2 Windows message loop needs the libSDL2 Windows low
>>>> level keyboard hook procedure to grab the left and right Windows
>>>> keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
>>>>
>>>> Because the QEMU Windows keyboard hook procedure is still needed
>>>> to filter out the special left Control key event for every Alt Gr
>>>> key event, it's important to install the two keyboard hook
>>>> procedures in the following order. First the SDL2 procedure, then
>>>> the QEMU procedure.
>>>>
>>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>>>> Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
>>>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>>>> ---
>>>> ui/sdl2.c | 53
>>>> ++++++++++++++++++++++++++++++---------------
>>>> ui/win32-kbd-hook.c | 3 +++
>>>> 2 files changed, 38 insertions(+), 18 deletions(-)
>
>
>>> Note: there is no 2.16 release. They jumped from 2.0.22 to 2.24 (see
>>> https://github.com/libsdl-org/SDL/releases/tag/release-2.24.0)
>>
>> Hi Marc-André
>>
>> Oh. This means that the comparison I wrote is true for SDL2 versions <
>> 2.24.0.
>>
>>>
>>> The windows hook was indeed added in 2.0.16, released on Aug 10, 2021.
>>>
>>> Given the distribution nature of the Windows binaries, I think we
>>> could simply depend on a much recent version without worrying about
>>> compatibility with < 2.0.16. This would help reduce the potential
>>> combinations of versions and bugs reports.
>>
>> Okay, I'll send a version 2 patch series.
>
> Queuing patches 2 & 3 meanwhile. Please do not bury series within
> threads, if Bernhard hadn't sent his T-b tag, I'd have missed it.
Oh actually this is a series with a cover, but the cover subject
doesn't contains 'PATCH' which is why my git tool missed it.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-11 11:59 ` Philippe Mathieu-Daudé
@ 2024-09-11 12:16 ` Bernhard Beschow
0 siblings, 0 replies; 12+ messages in thread
From: Bernhard Beschow @ 2024-09-11 12:16 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, Volker Rümelin,
Marc-André Lureau
Cc: Stefan Weil, Howard Spoelstra, qemu-devel
Am 11. September 2024 11:59:25 UTC schrieb "Philippe Mathieu-Daudé" <philmd@linaro.org>:
>On 11/9/24 13:57, Philippe Mathieu-Daudé wrote:
>> Hi Volker,
>>
>> On 9/9/24 21:38, Volker Rümelin wrote:
>>> Am 09.09.24 um 09:26 schrieb Marc-André Lureau:
>>>> Hi
>>>>
>>>> On Mon, Sep 9, 2024 at 10:22 AM Volker Rümelin <vr_qemu@t-online.de> wrote:
>>>>> Windows only:
>>>>>
>>>>> The libSDL2 Windows message loop needs the libSDL2 Windows low
>>>>> level keyboard hook procedure to grab the left and right Windows
>>>>> keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
>>>>>
>>>>> Because the QEMU Windows keyboard hook procedure is still needed
>>>>> to filter out the special left Control key event for every Alt Gr
>>>>> key event, it's important to install the two keyboard hook
>>>>> procedures in the following order. First the SDL2 procedure, then
>>>>> the QEMU procedure.
>>>>>
>>>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>>>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>>>>> Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
>>>>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>>>>> ---
>>>>> ui/sdl2.c | 53 ++++++++++++++++++++++++++++++---------------
>>>>> ui/win32-kbd-hook.c | 3 +++
>>>>> 2 files changed, 38 insertions(+), 18 deletions(-)
>>
>>
>>>> Note: there is no 2.16 release. They jumped from 2.0.22 to 2.24 (see
>>>> https://github.com/libsdl-org/SDL/releases/tag/release-2.24.0)
>>>
>>> Hi Marc-André
>>>
>>> Oh. This means that the comparison I wrote is true for SDL2 versions <
>>> 2.24.0.
>>>
>>>>
>>>> The windows hook was indeed added in 2.0.16, released on Aug 10, 2021.
>>>>
>>>> Given the distribution nature of the Windows binaries, I think we
>>>> could simply depend on a much recent version without worrying about
>>>> compatibility with < 2.0.16. This would help reduce the potential
>>>> combinations of versions and bugs reports.
>>>
>>> Okay, I'll send a version 2 patch series.
>>
>> Queuing patches 2 & 3 meanwhile. Please do not bury series within
>> threads, if Bernhard hadn't sent his T-b tag, I'd have missed it.
>
>Oh actually this is a series with a cover, but the cover subject
>doesn't contains 'PATCH' which is why my git tool missed it.
>
For me, `git am` didn't work after downloading the series' mbox. I had to download each patch mail individually and apply one by one. Then I could test the series.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
2024-09-09 19:38 ` Volker Rümelin
2024-09-11 11:57 ` Philippe Mathieu-Daudé
@ 2024-12-07 12:46 ` Bernhard Beschow
1 sibling, 0 replies; 12+ messages in thread
From: Bernhard Beschow @ 2024-12-07 12:46 UTC (permalink / raw)
To: Volker Rümelin, Marc-André Lureau
Cc: Stefan Weil, Howard Spoelstra, qemu-devel
Am 9. September 2024 19:38:26 UTC schrieb "Volker Rümelin" <vr_qemu@t-online.de>:
>Am 09.09.24 um 09:26 schrieb Marc-André Lureau:
>> Hi
>>
>> On Mon, Sep 9, 2024 at 10:22 AM Volker Rümelin <vr_qemu@t-online.de> wrote:
>>> Windows only:
>>>
>>> The libSDL2 Windows message loop needs the libSDL2 Windows low
>>> level keyboard hook procedure to grab the left and right Windows
>>> keys correctly. Reenable the SDL2 Windows keyboard hook procedure.
>>>
>>> Because the QEMU Windows keyboard hook procedure is still needed
>>> to filter out the special left Control key event for every Alt Gr
>>> key event, it's important to install the two keyboard hook
>>> procedures in the following order. First the SDL2 procedure, then
>>> the QEMU procedure.
>>>
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>>> Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
>>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>>> ---
>>> ui/sdl2.c | 53 ++++++++++++++++++++++++++++++---------------
>>> ui/win32-kbd-hook.c | 3 +++
>>> 2 files changed, 38 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/ui/sdl2.c b/ui/sdl2.c
>>> index 98ed974371..ac37c173a1 100644
>>> --- a/ui/sdl2.c
>>> +++ b/ui/sdl2.c
>>> @@ -42,6 +42,7 @@ static SDL_Surface *guest_sprite_surface;
>>> static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
>>> static bool alt_grab;
>>> static bool ctrl_grab;
>>> +static bool win32_kbd_grab;
>>>
>>> static int gui_saved_grab;
>>> static int gui_fullscreen;
>>> @@ -202,6 +203,19 @@ static void sdl_update_caption(struct sdl2_console *scon)
>>> }
>>> }
>>>
>>> +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 sdl_hide_cursor(struct sdl2_console *scon)
>>> {
>>> if (scon->opts->has_show_cursor && scon->opts->show_cursor) {
>>> @@ -259,9 +273,16 @@ static void sdl_grab_start(struct sdl2_console *scon)
>>> } else {
>>> sdl_hide_cursor(scon);
>>> }
>>> + /*
>>> + * Windows: To ensure that QEMU's low level keyboard hook procedure is
>>> + * called before SDL2's, the QEMU procedure must first be removed and
>>> + * then the SDL2 and QEMU procedures must be installed in this order.
>>> + */
>>> + win32_kbd_set_window(NULL);
>>> SDL_SetWindowGrab(scon->real_window, SDL_TRUE);
>>> + win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
>>> gui_grab = 1;
>>> - win32_kbd_set_grab(true);
>>> + win32_kbd_set_grab(win32_kbd_grab);
>>> sdl_update_caption(scon);
>>> }
>>>
>>> @@ -370,19 +391,6 @@ 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;
>>> @@ -605,7 +613,7 @@ static void handle_windowevent(SDL_Event *ev)
>>> sdl2_redraw(scon);
>>> break;
>>> case SDL_WINDOWEVENT_FOCUS_GAINED:
>>> - win32_kbd_set_grab(gui_grab);
>>> + win32_kbd_set_grab(win32_kbd_grab && gui_grab);
>>> if (qemu_console_is_graphic(scon->dcl.con)) {
>>> win32_kbd_set_window(sdl2_win32_get_hwnd(scon));
>>> }
>>> @@ -849,6 +857,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>>> uint8_t data = 0;
>>> int i;
>>> SDL_SysWMinfo info;
>>> + SDL_version ver;
>>> SDL_Surface *icon = NULL;
>>> char *dir;
>>>
>>> @@ -866,10 +875,7 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>>> #ifdef SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR /* only available since SDL 2.0.8 */
>>> SDL_SetHint(SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR, "0");
>>> #endif
>>> -#ifndef CONFIG_WIN32
>>> - /* QEMU uses its own low level keyboard hook procedure on Windows */
>>> SDL_SetHint(SDL_HINT_GRAB_KEYBOARD, "1");
>>> -#endif
>>> #ifdef SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED
>>> SDL_SetHint(SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED, "0");
>>> #endif
>>> @@ -877,6 +883,17 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
>>> SDL_EnableScreenSaver();
>>> memset(&info, 0, sizeof(info));
>>> SDL_VERSION(&info.version);
>>> + /*
>>> + * Since version 2.16.0 under Windows, SDL2 has its own low level
>>> + * keyboard hook procedure to grab the keyboard. The remaining task of
>>> + * QEMU's low level keyboard hook procedure is to filter out the special
>>> + * left Control up/down key event for every Alt Gr key event on keyboards
>>> + * with an international layout.
>>> + */
>>> + SDL_GetVersion(&ver);
>>> + if (ver.major == 2 && ver.minor < 16) {
>>> + win32_kbd_grab = true;
>>> + }
>>>
>> Note: there is no 2.16 release. They jumped from 2.0.22 to 2.24 (see
>> https://github.com/libsdl-org/SDL/releases/tag/release-2.24.0)
>
>Hi Marc-André
>
>Oh. This means that the comparison I wrote is true for SDL2 versions <
>2.24.0.
>
>>
>> The windows hook was indeed added in 2.0.16, released on Aug 10, 2021.
>>
>> Given the distribution nature of the Windows binaries, I think we
>> could simply depend on a much recent version without worrying about
>> compatibility with < 2.0.16. This would help reduce the potential
>> combinations of versions and bugs reports.
>
>Okay, I'll send a version 2 patch series.
Ping (for this patch, the others were merged)
>
>With best regards
>Volker
>
>>
>>> gui_fullscreen = o->has_full_screen && o->full_screen;
>>>
>>> diff --git a/ui/win32-kbd-hook.c b/ui/win32-kbd-hook.c
>>> index 1ac237db9e..39d42134a2 100644
>>> --- a/ui/win32-kbd-hook.c
>>> +++ b/ui/win32-kbd-hook.c
>>> @@ -91,6 +91,9 @@ void win32_kbd_set_window(void *hwnd)
>>> win32_unhook_notifier.notify = keyboard_hook_unhook;
>>> qemu_add_exit_notifier(&win32_unhook_notifier);
>>> }
>>> + } else if (!hwnd && win32_keyboard_hook) {
>>> + keyboard_hook_unhook(&win32_unhook_notifier, NULL);
>>> + qemu_remove_exit_notifier(&win32_unhook_notifier);
>>> }
>>>
>>> win32_window = hwnd;
>>> --
>>> 2.35.3
>>>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH 2/3] ui/sdl2: release all modifiers
2024-09-09 6:12 SDL2 keyboard fixes on Windows Volker Rümelin
2024-09-09 6:15 ` [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure Volker Rümelin
@ 2024-09-09 6:15 ` Volker Rümelin
2024-09-09 6:15 ` [PATCH 3/3] ui/sdl2: ignore GUI keys in SDL_TEXTINPUT handler Volker Rümelin
2024-09-11 11:19 ` SDL2 keyboard fixes on Windows Bernhard Beschow
3 siblings, 0 replies; 12+ messages in thread
From: Volker Rümelin @ 2024-09-09 6:15 UTC (permalink / raw)
To: Marc-André Lureau, Stefan Weil
Cc: Howard Spoelstra, Bernhard Beschow, qemu-devel
Each virtual console in the SDL2 frontend has a key state map.
When switching windows with GUI keys we have to release all
pressed modifier keys in the currently active window, because
after the switch the now inactive window no longer receives the
key release events.
To reproduce the issue open a text editor in the SDL UI and then
press Ctrl-Alt-2 to open a Compat Monitor Console. Close the
console with the mouse. Try to enter text in the text editor and
notice that the modifier keys Ctrl and Alt are stuck and need to
be pressed once to be released.
Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---
include/ui/sdl2.h | 1 +
ui/sdl2-input.c | 5 +++++
ui/sdl2.c | 1 +
3 files changed, 7 insertions(+)
diff --git a/include/ui/sdl2.h b/include/ui/sdl2.h
index e3acc7c82a..6907115809 100644
--- a/include/ui/sdl2.h
+++ b/include/ui/sdl2.h
@@ -60,6 +60,7 @@ void sdl2_poll_events(struct sdl2_console *scon);
void sdl2_process_key(struct sdl2_console *scon,
SDL_KeyboardEvent *ev);
+void sdl2_release_modifiers(struct sdl2_console *scon);
void sdl2_2d_update(DisplayChangeListener *dcl,
int x, int y, int w, int h);
diff --git a/ui/sdl2-input.c b/ui/sdl2-input.c
index b02a89ee7c..2286df4223 100644
--- a/ui/sdl2-input.c
+++ b/ui/sdl2-input.c
@@ -58,3 +58,8 @@ void sdl2_process_key(struct sdl2_console *scon,
}
}
}
+
+void sdl2_release_modifiers(struct sdl2_console *scon)
+{
+ qkbd_state_lift_all_keys(scon->kbd);
+}
diff --git a/ui/sdl2.c b/ui/sdl2.c
index ac37c173a1..9d9a9362cb 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -426,6 +426,7 @@ static void handle_keydown(SDL_Event *ev)
SDL_ShowWindow(sdl2_console[win].real_window);
}
}
+ sdl2_release_modifiers(scon);
gui_keysym = 1;
}
break;
--
2.35.3
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH 3/3] ui/sdl2: ignore GUI keys in SDL_TEXTINPUT handler
2024-09-09 6:12 SDL2 keyboard fixes on Windows Volker Rümelin
2024-09-09 6:15 ` [PATCH 1/3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure Volker Rümelin
2024-09-09 6:15 ` [PATCH 2/3] ui/sdl2: release all modifiers Volker Rümelin
@ 2024-09-09 6:15 ` Volker Rümelin
2024-09-11 11:19 ` SDL2 keyboard fixes on Windows Bernhard Beschow
3 siblings, 0 replies; 12+ messages in thread
From: Volker Rümelin @ 2024-09-09 6:15 UTC (permalink / raw)
To: Marc-André Lureau, Stefan Weil
Cc: Howard Spoelstra, Bernhard Beschow, qemu-devel
Ignore GUI keys for SDL_TEXTINPUT events, just like GUI keys are
ignored for SDL_KEYDOWN events. This prevents unintended text input
in a text console when hiding the text console with the GUI keys.
The SDL_TEXTINPUT event always comes after the SDL_KEYDOWN event.
See libsdl-org/SDL issue #1659.
Tested-by: Howard Spoelstra <hsp.cat7@gmail.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---
include/ui/sdl2.h | 1 +
ui/sdl2.c | 17 +++++++++--------
2 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/include/ui/sdl2.h b/include/ui/sdl2.h
index 6907115809..dbe6e3d973 100644
--- a/include/ui/sdl2.h
+++ b/include/ui/sdl2.h
@@ -42,6 +42,7 @@ struct sdl2_console {
int updates;
int idle_counter;
int ignore_hotkeys;
+ bool gui_keysym;
SDL_GLContext winctx;
QKbdState *kbd;
#ifdef CONFIG_OPENGL
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 9d9a9362cb..cb1acd4499 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -396,12 +396,13 @@ static void handle_keydown(SDL_Event *ev)
int win;
struct sdl2_console *scon = get_scon_from_window(ev->key.windowID);
int gui_key_modifier_pressed = get_mod_state();
- int gui_keysym = 0;
if (!scon) {
return;
}
+ scon->gui_keysym = false;
+
if (!scon->ignore_hotkeys && gui_key_modifier_pressed && !ev->key.repeat) {
switch (ev->key.keysym.scancode) {
case SDL_SCANCODE_2:
@@ -427,15 +428,15 @@ static void handle_keydown(SDL_Event *ev)
}
}
sdl2_release_modifiers(scon);
- gui_keysym = 1;
+ scon->gui_keysym = true;
}
break;
case SDL_SCANCODE_F:
toggle_full_screen(scon);
- gui_keysym = 1;
+ scon->gui_keysym = true;
break;
case SDL_SCANCODE_G:
- gui_keysym = 1;
+ scon->gui_keysym = true;
if (!gui_grab) {
sdl_grab_start(scon);
} else if (!gui_fullscreen) {
@@ -448,7 +449,7 @@ static void handle_keydown(SDL_Event *ev)
/* re-create scon->texture */
sdl2_2d_switch(&scon->dcl, scon->surface);
}
- gui_keysym = 1;
+ scon->gui_keysym = true;
break;
#if 0
case SDL_SCANCODE_KP_PLUS:
@@ -467,14 +468,14 @@ static void handle_keydown(SDL_Event *ev)
__func__, width, height);
sdl_scale(scon, width, height);
sdl2_redraw(scon);
- gui_keysym = 1;
+ scon->gui_keysym = true;
}
#endif
default:
break;
}
}
- if (!gui_keysym) {
+ if (!scon->gui_keysym) {
sdl2_process_key(scon, &ev->key);
}
}
@@ -500,7 +501,7 @@ static void handle_textinput(SDL_Event *ev)
return;
}
- if (QEMU_IS_TEXT_CONSOLE(con)) {
+ if (!scon->gui_keysym && QEMU_IS_TEXT_CONSOLE(con)) {
qemu_text_console_put_string(QEMU_TEXT_CONSOLE(con), ev->text.text, strlen(ev->text.text));
}
}
--
2.35.3
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: SDL2 keyboard fixes on Windows
2024-09-09 6:12 SDL2 keyboard fixes on Windows Volker Rümelin
` (2 preceding siblings ...)
2024-09-09 6:15 ` [PATCH 3/3] ui/sdl2: ignore GUI keys in SDL_TEXTINPUT handler Volker Rümelin
@ 2024-09-11 11:19 ` Bernhard Beschow
3 siblings, 0 replies; 12+ messages in thread
From: Bernhard Beschow @ 2024-09-11 11:19 UTC (permalink / raw)
To: Volker Rümelin, Marc-André Lureau, Stefan Weil
Cc: Howard Spoelstra, qemu-devel
Am 9. September 2024 06:12:23 UTC schrieb "Volker Rümelin" <vr_qemu@t-online.de>:
>The Windows keys do not work properly with the SDL backend on Windows.
>Patch 1/3 improves the situation. However, it's impossible to solve the
>problem completely, as there is no way to grab the Windows keys. The
>Windows keys are reserved for the operating system. In addition to
>Ctrl-Alt-Del, there are other key combinations such as Win-Space or
>Win-L where it's not possible to prevent the operating system from
>executing the corresponding functions.
>
>The other two patches prevent stuck modifier keys and unexpected text
>input on Windows.
>
>Volker Rümelin (3):
> ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
> ui/sdl2: release all modifiers
> ui/sdl2: ignore GUI keys in SDL_TEXTINPUT handler
>
> include/ui/sdl2.h | 2 ++
> ui/sdl2-input.c | 5 ++++
> ui/sdl2.c | 71 ++++++++++++++++++++++++++++-----------------
> ui/win32-kbd-hook.c | 3 ++
> 4 files changed, 55 insertions(+), 26 deletions(-)
>
Series:
Tested-by: Bernhard Beschow <shentey@gmail.com>
^ permalink raw reply [flat|nested] 12+ messages in thread