[PATCH v3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure

Volker Rümelin posted 1 patch 3 months, 1 week ago
ui/meson.build |  4 ----
ui/sdl2.c      | 26 --------------------------
2 files changed, 30 deletions(-)
[PATCH v3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
Posted by Volker Rümelin 3 months, 1 week ago
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.

Since SDL2 2.30.4 the SDL2 keyboard hook procedure also filters
out the special left Control key event for every Alt Gr key event
on keyboards with an international layout. This means the QEMU low
level keyboard hook procedure is no longer needed. Remove the QEMU
Windows keyboard hook procedure.

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---

v2: Remove the QEMU lowlevel keyboard hook procedure from the
SDL2 UI backend.

v3: Rebase to current master because of a merge conflict.

 ui/meson.build |  4 ----
 ui/sdl2.c      | 26 --------------------------
 2 files changed, 30 deletions(-)

diff --git a/ui/meson.build b/ui/meson.build
index 28c7381dd1..35fb04cadf 100644
--- a/ui/meson.build
+++ b/ui/meson.build
@@ -120,10 +120,6 @@ if gtk.found()
 endif
 
 if sdl.found()
-  if host_os == 'windows'
-    system_ss.add(files('win32-kbd-hook.c'))
-  endif
-
   sdl_ss = ss.source_set()
   sdl_ss.add(sdl, sdl_image, pixman, glib, files(
     'sdl2-2d.c',
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 1fb72f67a6..2cb95a6b7c 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -32,7 +32,6 @@
 #include "system/runstate.h"
 #include "system/runstate-action.h"
 #include "system/system.h"
-#include "ui/win32-kbd-hook.h"
 #include "qemu/log.h"
 
 static int sdl2_num_outputs;
@@ -262,7 +261,6 @@ 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);
 }
 
@@ -270,7 +268,6 @@ 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);
 }
@@ -371,19 +368,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;
@@ -608,10 +592,6 @@ 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(scon->dcl.con) || absolute_enabled)) {
@@ -627,9 +607,6 @@ 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);
         }
@@ -869,10 +846,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
-- 
2.43.0


Re: [PATCH v3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
Posted by Bernhard Beschow 2 months, 3 weeks ago
Am 31. Dezember 2024 11:59:50 UTC schrieb "Volker Rümelin" <vr_qemu@t-online.de>:
>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.
>
>Since SDL2 2.30.4 the SDL2 keyboard hook procedure also filters
>out the special left Control key event for every Alt Gr key event
>on keyboards with an international layout. This means the QEMU low
>level keyboard hook procedure is no longer needed. Remove the QEMU
>Windows keyboard hook procedure.
>
>Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>

Resolving bugs strictly by removing code. Nice!

Issuing Meta+E opens a file manager in a guest running on Win11/msys2 host. Thus:

Tested-by: Bernhard Beschow <shentey@gmail.com>
Reviewed-by: Bernhard Beschow <shentey@gmail.com>

>---
>
>v2: Remove the QEMU lowlevel keyboard hook procedure from the
>SDL2 UI backend.
>
>v3: Rebase to current master because of a merge conflict.
>
> ui/meson.build |  4 ----
> ui/sdl2.c      | 26 --------------------------
> 2 files changed, 30 deletions(-)
>
>diff --git a/ui/meson.build b/ui/meson.build
>index 28c7381dd1..35fb04cadf 100644
>--- a/ui/meson.build
>+++ b/ui/meson.build
>@@ -120,10 +120,6 @@ if gtk.found()
> endif
> 
> if sdl.found()
>-  if host_os == 'windows'
>-    system_ss.add(files('win32-kbd-hook.c'))
>-  endif
>-
>   sdl_ss = ss.source_set()
>   sdl_ss.add(sdl, sdl_image, pixman, glib, files(
>     'sdl2-2d.c',
>diff --git a/ui/sdl2.c b/ui/sdl2.c
>index 1fb72f67a6..2cb95a6b7c 100644
>--- a/ui/sdl2.c
>+++ b/ui/sdl2.c
>@@ -32,7 +32,6 @@
> #include "system/runstate.h"
> #include "system/runstate-action.h"
> #include "system/system.h"
>-#include "ui/win32-kbd-hook.h"
> #include "qemu/log.h"
> 
> static int sdl2_num_outputs;
>@@ -262,7 +261,6 @@ 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);
> }
> 
>@@ -270,7 +268,6 @@ 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);
> }
>@@ -371,19 +368,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;
>@@ -608,10 +592,6 @@ 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(scon->dcl.con) || absolute_enabled)) {
>@@ -627,9 +607,6 @@ 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);
>         }
>@@ -869,10 +846,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
Re: [PATCH v3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
Posted by Bernhard Beschow 1 month, 4 weeks ago
Am 12. Januar 2025 13:08:03 UTC schrieb Bernhard Beschow <shentey@gmail.com>:
>
>
>Am 31. Dezember 2024 11:59:50 UTC schrieb "Volker Rümelin" <vr_qemu@t-online.de>:
>>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.
>>
>>Since SDL2 2.30.4 the SDL2 keyboard hook procedure also filters
>>out the special left Control key event for every Alt Gr key event
>>on keyboards with an international layout. This means the QEMU low
>>level keyboard hook procedure is no longer needed. Remove the QEMU
>>Windows keyboard hook procedure.
>>
>>Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>>Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>>Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>
>Resolving bugs strictly by removing code. Nice!
>
>Issuing Meta+E opens a file manager in a guest running on Win11/msys2 host. Thus:
>
>Tested-by: Bernhard Beschow <shentey@gmail.com>
>Reviewed-by: Bernhard Beschow <shentey@gmail.com>

Ping

>
>>---
>>
>>v2: Remove the QEMU lowlevel keyboard hook procedure from the
>>SDL2 UI backend.
>>
>>v3: Rebase to current master because of a merge conflict.
>>
>> ui/meson.build |  4 ----
>> ui/sdl2.c      | 26 --------------------------
>> 2 files changed, 30 deletions(-)
>>
>>diff --git a/ui/meson.build b/ui/meson.build
>>index 28c7381dd1..35fb04cadf 100644
>>--- a/ui/meson.build
>>+++ b/ui/meson.build
>>@@ -120,10 +120,6 @@ if gtk.found()
>> endif
>> 
>> if sdl.found()
>>-  if host_os == 'windows'
>>-    system_ss.add(files('win32-kbd-hook.c'))
>>-  endif
>>-
>>   sdl_ss = ss.source_set()
>>   sdl_ss.add(sdl, sdl_image, pixman, glib, files(
>>     'sdl2-2d.c',
>>diff --git a/ui/sdl2.c b/ui/sdl2.c
>>index 1fb72f67a6..2cb95a6b7c 100644
>>--- a/ui/sdl2.c
>>+++ b/ui/sdl2.c
>>@@ -32,7 +32,6 @@
>> #include "system/runstate.h"
>> #include "system/runstate-action.h"
>> #include "system/system.h"
>>-#include "ui/win32-kbd-hook.h"
>> #include "qemu/log.h"
>> 
>> static int sdl2_num_outputs;
>>@@ -262,7 +261,6 @@ 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);
>> }
>> 
>>@@ -270,7 +268,6 @@ 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);
>> }
>>@@ -371,19 +368,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;
>>@@ -608,10 +592,6 @@ 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(scon->dcl.con) || absolute_enabled)) {
>>@@ -627,9 +607,6 @@ 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);
>>         }
>>@@ -869,10 +846,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
Re: [PATCH v3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
Posted by Philippe Mathieu-Daudé 3 months, 1 week ago
Hi Volker,

On 31/12/24 12:59, Volker Rümelin 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.
> 
> Since SDL2 2.30.4 the SDL2 keyboard hook procedure also filters
> out the special left Control key event for every Alt Gr key event
> on keyboards with an international layout. This means the QEMU low
> level keyboard hook procedure is no longer needed. Remove the QEMU
> Windows keyboard hook procedure.

Cc'ing Alexander & Thomas because I wonder if Haiku isn't using
an older version (SDL 2.0.8).

Should we require a minimum version in meson?

> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
> ---
> 
> v2: Remove the QEMU lowlevel keyboard hook procedure from the
> SDL2 UI backend.
> 
> v3: Rebase to current master because of a merge conflict.
> 
>   ui/meson.build |  4 ----
>   ui/sdl2.c      | 26 --------------------------
>   2 files changed, 30 deletions(-)
> 
> diff --git a/ui/meson.build b/ui/meson.build
> index 28c7381dd1..35fb04cadf 100644
> --- a/ui/meson.build
> +++ b/ui/meson.build
> @@ -120,10 +120,6 @@ if gtk.found()
>   endif
>   
>   if sdl.found()
> -  if host_os == 'windows'
> -    system_ss.add(files('win32-kbd-hook.c'))
> -  endif
> -
>     sdl_ss = ss.source_set()
>     sdl_ss.add(sdl, sdl_image, pixman, glib, files(
>       'sdl2-2d.c',
> diff --git a/ui/sdl2.c b/ui/sdl2.c
> index 1fb72f67a6..2cb95a6b7c 100644
> --- a/ui/sdl2.c
> +++ b/ui/sdl2.c
> @@ -32,7 +32,6 @@
>   #include "system/runstate.h"
>   #include "system/runstate-action.h"
>   #include "system/system.h"
> -#include "ui/win32-kbd-hook.h"
>   #include "qemu/log.h"
>   
>   static int sdl2_num_outputs;
> @@ -262,7 +261,6 @@ 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);
>   }
>   
> @@ -270,7 +268,6 @@ 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);
>   }
> @@ -371,19 +368,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;
> @@ -608,10 +592,6 @@ 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(scon->dcl.con) || absolute_enabled)) {
> @@ -627,9 +607,6 @@ 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);
>           }
> @@ -869,10 +846,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


Re: [PATCH v3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
Posted by Thomas Huth 3 months, 1 week ago
On 02/01/2025 08.06, Philippe Mathieu-Daudé wrote:
> Hi Volker,
> 
> On 31/12/24 12:59, Volker Rümelin 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.
>>
>> Since SDL2 2.30.4 the SDL2 keyboard hook procedure also filters
>> out the special left Control key event for every Alt Gr key event
>> on keyboards with an international layout. This means the QEMU low
>> level keyboard hook procedure is no longer needed. Remove the QEMU
>> Windows keyboard hook procedure.
> 
> Cc'ing Alexander & Thomas because I wonder if Haiku isn't using
> an older version (SDL 2.0.8).
> Should we require a minimum version in meson?

AFAICS the hack was for Windows only, and this patch does not make use of 
any new SDL code that has been introduced by a later version, so for 
non-Windows platforms, it should still compile fine with older versions of 
SDL2, right? So I think this patch is fine.

By the way, "make vm-build-haiku.x86_64" does not work anymore ... likely 
because Haiku beta5 has been released a while ago, and we're still on beta4? 
Alexander, could you maybe provide a new image based on beta5 ?

  Thomas


>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>> ---
>>
>> v2: Remove the QEMU lowlevel keyboard hook procedure from the
>> SDL2 UI backend.
>>
>> v3: Rebase to current master because of a merge conflict.
>>
>>   ui/meson.build |  4 ----
>>   ui/sdl2.c      | 26 --------------------------
>>   2 files changed, 30 deletions(-)
>>
>> diff --git a/ui/meson.build b/ui/meson.build
>> index 28c7381dd1..35fb04cadf 100644
>> --- a/ui/meson.build
>> +++ b/ui/meson.build
>> @@ -120,10 +120,6 @@ if gtk.found()
>>   endif
>>   if sdl.found()
>> -  if host_os == 'windows'
>> -    system_ss.add(files('win32-kbd-hook.c'))
>> -  endif
>> -
>>     sdl_ss = ss.source_set()
>>     sdl_ss.add(sdl, sdl_image, pixman, glib, files(
>>       'sdl2-2d.c',
>> diff --git a/ui/sdl2.c b/ui/sdl2.c
>> index 1fb72f67a6..2cb95a6b7c 100644
>> --- a/ui/sdl2.c
>> +++ b/ui/sdl2.c
>> @@ -32,7 +32,6 @@
>>   #include "system/runstate.h"
>>   #include "system/runstate-action.h"
>>   #include "system/system.h"
>> -#include "ui/win32-kbd-hook.h"
>>   #include "qemu/log.h"
>>   static int sdl2_num_outputs;
>> @@ -262,7 +261,6 @@ 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);
>>   }
>> @@ -270,7 +268,6 @@ 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);
>>   }
>> @@ -371,19 +368,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;
>> @@ -608,10 +592,6 @@ 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(scon->dcl.con) || 
>> absolute_enabled)) {
>> @@ -627,9 +607,6 @@ 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);
>>           }
>> @@ -869,10 +846,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
> 


Re: [PATCH v3] ui/sdl2: reenable the SDL2 Windows keyboard hook procedure
Posted by Volker Rümelin 3 months ago
Am 02.01.25 um 08:23 schrieb Thomas Huth:
> On 02/01/2025 08.06, Philippe Mathieu-Daudé wrote:
>> Hi Volker,
>>
>> On 31/12/24 12:59, Volker Rümelin 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.
>>>
>>> Since SDL2 2.30.4 the SDL2 keyboard hook procedure also filters
>>> out the special left Control key event for every Alt Gr key event
>>> on keyboards with an international layout. This means the QEMU low
>>> level keyboard hook procedure is no longer needed. Remove the QEMU
>>> Windows keyboard hook procedure.
>>
>> Cc'ing Alexander & Thomas because I wonder if Haiku isn't using
>> an older version (SDL 2.0.8).
>> Should we require a minimum version in meson?
>
> AFAICS the hack was for Windows only, and this patch does not make use
> of any new SDL code that has been introduced by a later version, so
> for non-Windows platforms, it should still compile fine with older
> versions of SDL2, right? So I think this patch is fine.

This is correct. Version 2.30.4 or newer is only a runtime requirement
on Windows. Compilation with older SDL2 versions works fine. Only a few
keys may not work as expected if the Windows DLL loader loads an older
SDL2.dll version.

With best regards,
Volker

>
> By the way, "make vm-build-haiku.x86_64" does not work anymore ...
> likely because Haiku beta5 has been released a while ago, and we're
> still on beta4? Alexander, could you maybe provide a new image based
> on beta5 ?
>
>  Thomas
>
>
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2139
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2323
>>> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>>> ---
>>>
>>> v2: Remove the QEMU lowlevel keyboard hook procedure from the
>>> SDL2 UI backend.
>>>
>>> v3: Rebase to current master because of a merge conflict.
>>>
>>>   ui/meson.build |  4 ----
>>>   ui/sdl2.c      | 26 --------------------------
>>>   2 files changed, 30 deletions(-)
>>>
>>> diff --git a/ui/meson.build b/ui/meson.build
>>> index 28c7381dd1..35fb04cadf 100644
>>> --- a/ui/meson.build
>>> +++ b/ui/meson.build
>>> @@ -120,10 +120,6 @@ if gtk.found()
>>>   endif
>>>   if sdl.found()
>>> -  if host_os == 'windows'
>>> -    system_ss.add(files('win32-kbd-hook.c'))
>>> -  endif
>>> -
>>>     sdl_ss = ss.source_set()
>>>     sdl_ss.add(sdl, sdl_image, pixman, glib, files(
>>>       'sdl2-2d.c',
>>> diff --git a/ui/sdl2.c b/ui/sdl2.c
>>> index 1fb72f67a6..2cb95a6b7c 100644
>>> --- a/ui/sdl2.c
>>> +++ b/ui/sdl2.c
>>> @@ -32,7 +32,6 @@
>>>   #include "system/runstate.h"
>>>   #include "system/runstate-action.h"
>>>   #include "system/system.h"
>>> -#include "ui/win32-kbd-hook.h"
>>>   #include "qemu/log.h"
>>>   static int sdl2_num_outputs;
>>> @@ -262,7 +261,6 @@ 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);
>>>   }
>>> @@ -270,7 +268,6 @@ 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);
>>>   }
>>> @@ -371,19 +368,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;
>>> @@ -608,10 +592,6 @@ 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(scon->dcl.con) ||
>>> absolute_enabled)) {
>>> @@ -627,9 +607,6 @@ 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);
>>>           }
>>> @@ -869,10 +846,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
>>
>