qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PULL 00/11] Ui 20200520 patches
@ 2020-05-20  8:43 Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 01/11] ui/win32-kbd-hook: handle AltGr in a hook procedure Gerd Hoffmann
                   ` (11 more replies)
  0 siblings, 12 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Gerd Hoffmann, Paolo Bonzini

The following changes since commit debe78ce14bf8f8940c2bdf3ef387505e9e035a9:

  Merge remote-tracking branch 'remotes/rth/tags/pull-fpu-20200515' into staging (2020-05-15 19:51:16 +0100)

are available in the Git repository at:

  git://git.kraxel.org/qemu tags/ui-20200520-pull-request

for you to fetch changes up to 7b23d121f913709306e678a3289edc813f3a7463:

  ui: increase min required GTK version to 3.22.0 (2020-05-19 09:06:44 +0200)

----------------------------------------------------------------
ui: windows keyboard fixes for gtk & sdl.
ui: require GTK 3.22 or newer.

----------------------------------------------------------------

Volker Rümelin (11):
  ui/win32-kbd-hook: handle AltGr in a hook procedure
  ui/gtk: fix handling of AltGr key on Windows
  ui/gkt: release all keys on grab-broken-event
  ui/gtk: remove unused code
  ui/gtk: remove unused variable ignore_keys
  ui/sdl2: fix handling of AltGr key on Windows
  ui/sdl2: start in full screen with grab enabled
  ui/sdl2-input: use trace-events to debug key events
  ui/gtk: don't pass on win keys without keyboard grab
  ui/gtk: use native keyboard scancodes on Windows
  ui: increase min required GTK version to 3.22.0

 configure                   |   2 +-
 include/ui/win32-kbd-hook.h |  14 +++
 stubs/win32-kbd-hook.c      |  18 ++++
 ui/gtk.c                    | 194 +++++++++++++++++-------------------
 ui/sdl2-input.c             |   3 +
 ui/sdl2.c                   |  33 +++++-
 ui/win32-kbd-hook.c         | 102 +++++++++++++++++++
 stubs/Makefile.objs         |   1 +
 ui/Makefile.objs            |   3 +
 ui/trace-events             |   3 +
 10 files changed, 264 insertions(+), 109 deletions(-)
 create mode 100644 include/ui/win32-kbd-hook.h
 create mode 100644 stubs/win32-kbd-hook.c
 create mode 100644 ui/win32-kbd-hook.c

-- 
2.18.4



^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PULL 01/11] ui/win32-kbd-hook: handle AltGr in a hook procedure
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-22 17:15   ` Philippe Mathieu-Daudé
  2020-05-20  8:43 ` [PULL 02/11] ui/gtk: fix handling of AltGr key on Windows Gerd Hoffmann
                   ` (10 subsequent siblings)
  11 siblings, 1 reply; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

Import win32 keyboard hooking code from project spice-gtk. This
patch removes the extra left control key up/down input events
inserted by Windows for the right alt key up/down input events
with international keyboard layouts. Additionally there's some
code to grab the keyboard.

The next patches will use this code.

Only Windows needs this.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-1-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 include/ui/win32-kbd-hook.h |  14 +++++
 stubs/win32-kbd-hook.c      |  18 +++++++
 ui/win32-kbd-hook.c         | 102 ++++++++++++++++++++++++++++++++++++
 stubs/Makefile.objs         |   1 +
 ui/Makefile.objs            |   3 ++
 5 files changed, 138 insertions(+)
 create mode 100644 include/ui/win32-kbd-hook.h
 create mode 100644 stubs/win32-kbd-hook.c
 create mode 100644 ui/win32-kbd-hook.c

diff --git a/include/ui/win32-kbd-hook.h b/include/ui/win32-kbd-hook.h
new file mode 100644
index 000000000000..4bd9f00f973f
--- /dev/null
+++ b/include/ui/win32-kbd-hook.h
@@ -0,0 +1,14 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef UI_WIN32_KBD_HOOK_H
+#define UI_WIN32_KBD_HOOK_H
+
+void win32_kbd_set_window(void *hwnd);
+void win32_kbd_set_grab(bool grab);
+
+#endif
diff --git a/stubs/win32-kbd-hook.c b/stubs/win32-kbd-hook.c
new file mode 100644
index 000000000000..1a084b081ab6
--- /dev/null
+++ b/stubs/win32-kbd-hook.c
@@ -0,0 +1,18 @@
+/*
+ * Win32 keyboard hook stubs
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "ui/win32-kbd-hook.h"
+
+void win32_kbd_set_window(void *hwnd)
+{
+}
+
+void win32_kbd_set_grab(bool grab)
+{
+}
diff --git a/ui/win32-kbd-hook.c b/ui/win32-kbd-hook.c
new file mode 100644
index 000000000000..1ac237db9e9d
--- /dev/null
+++ b/ui/win32-kbd-hook.c
@@ -0,0 +1,102 @@
+/*
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ *
+ * The win32 keyboard hooking code was imported from project spice-gtk.
+ */
+
+#include "qemu/osdep.h"
+#include "sysemu/sysemu.h"
+#include "ui/win32-kbd-hook.h"
+
+static Notifier win32_unhook_notifier;
+static HHOOK win32_keyboard_hook;
+static HWND win32_window;
+static DWORD win32_grab;
+
+static LRESULT CALLBACK keyboard_hook_cb(int code, WPARAM wparam, LPARAM lparam)
+{
+    if  (win32_window && code == HC_ACTION && win32_window == GetFocus()) {
+        KBDLLHOOKSTRUCT *hooked = (KBDLLHOOKSTRUCT *)lparam;
+
+        if (wparam != WM_KEYUP) {
+            DWORD dwmsg = (hooked->flags << 24) |
+                          ((hooked->scanCode & 0xff) << 16) | 1;
+
+            switch (hooked->vkCode) {
+            case VK_CAPITAL:
+                /* fall through */
+            case VK_SCROLL:
+                /* fall through */
+            case VK_NUMLOCK:
+                /* fall through */
+            case VK_LSHIFT:
+                /* fall through */
+            case VK_RSHIFT:
+                /* fall through */
+            case VK_RCONTROL:
+                /* fall through */
+            case VK_LMENU:
+                /* fall through */
+            case VK_RMENU:
+                break;
+
+            case VK_LCONTROL:
+                /*
+                 * When pressing AltGr, an extra VK_LCONTROL with a special
+                 * scancode with bit 9 set is sent. Let's ignore the extra
+                 * VK_LCONTROL, as that will make AltGr misbehave.
+                 */
+                if (hooked->scanCode & 0x200) {
+                    return 1;
+                }
+                break;
+
+            default:
+                if (win32_grab) {
+                    SendMessage(win32_window, wparam, hooked->vkCode, dwmsg);
+                    return 1;
+                }
+                break;
+            }
+
+        } else {
+            switch (hooked->vkCode) {
+            case VK_LCONTROL:
+                if (hooked->scanCode & 0x200) {
+                    return 1;
+                }
+                break;
+            }
+        }
+    }
+
+    return CallNextHookEx(NULL, code, wparam, lparam);
+}
+
+static void keyboard_hook_unhook(Notifier *n, void *data)
+{
+    UnhookWindowsHookEx(win32_keyboard_hook);
+    win32_keyboard_hook = NULL;
+}
+
+void win32_kbd_set_window(void *hwnd)
+{
+    if (hwnd && !win32_keyboard_hook) {
+        /* note: the installing thread must have a message loop */
+        win32_keyboard_hook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboard_hook_cb,
+                                               GetModuleHandle(NULL), 0);
+        if (win32_keyboard_hook) {
+            win32_unhook_notifier.notify = keyboard_hook_unhook;
+            qemu_add_exit_notifier(&win32_unhook_notifier);
+        }
+    }
+
+    win32_window = hwnd;
+}
+
+void win32_kbd_set_grab(bool grab)
+{
+    win32_grab = grab;
+}
diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
index 45be5dc0ed78..6a9e3135e8f9 100644
--- a/stubs/Makefile.objs
+++ b/stubs/Makefile.objs
@@ -32,6 +32,7 @@ stub-obj-y += trace-control.o
 stub-obj-y += uuid.o
 stub-obj-y += vm-stop.o
 stub-obj-y += vmstate.o
+stub-obj-y += win32-kbd-hook.o
 stub-obj-y += fd-register.o
 stub-obj-y += qmp_memory_device.o
 stub-obj-y += target-monitor-defs.o
diff --git a/ui/Makefile.objs b/ui/Makefile.objs
index e6da6ff047fd..504b19647977 100644
--- a/ui/Makefile.objs
+++ b/ui/Makefile.objs
@@ -15,6 +15,9 @@ common-obj-$(CONFIG_SPICE) += spice-core.o spice-input.o spice-display.o
 common-obj-$(CONFIG_COCOA) += cocoa.o
 common-obj-$(CONFIG_VNC) += $(vnc-obj-y)
 common-obj-$(call lnot,$(CONFIG_VNC)) += vnc-stubs.o
+ifneq (,$(findstring m,$(CONFIG_SDL)$(CONFIG_GTK)))
+common-obj-$(CONFIG_WIN32) += win32-kbd-hook.o
+endif
 
 # ui-sdl module
 common-obj-$(CONFIG_SDL) += sdl.mo
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 02/11] ui/gtk: fix handling of AltGr key on Windows
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 01/11] ui/win32-kbd-hook: handle AltGr in a hook procedure Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 03/11] ui/gkt: release all keys on grab-broken-event Gerd Hoffmann
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

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-2-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/gtk.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/ui/gtk.c b/ui/gtk.c
index 83f2f5d49b2a..a0b10a140330 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -38,6 +38,10 @@
 
 #include "ui/console.h"
 #include "ui/gtk.h"
+#ifdef G_OS_WIN32
+#include <gdk/gdkwin32.h>
+#endif
+#include "ui/win32-kbd-hook.h"
 
 #include <glib/gi18n.h>
 #include <locale.h>
@@ -428,6 +432,16 @@ static void gd_widget_reparent(GtkWidget *from, GtkWidget *to,
     g_object_unref(G_OBJECT(widget));
 }
 
+static void *gd_win32_get_hwnd(VirtualConsole *vc)
+{
+#ifdef G_OS_WIN32
+    return gdk_win32_window_get_impl_hwnd(
+        gtk_widget_get_window(vc->window ? vc->window : vc->s->window));
+#else
+    return NULL;
+#endif
+}
+
 /** DisplayState Callbacks **/
 
 static void gd_update(DisplayChangeListener *dcl,
@@ -1451,6 +1465,7 @@ static void gd_grab_keyboard(VirtualConsole *vc, const char *reason)
         }
     }
 
+    win32_kbd_set_grab(true);
 #if GTK_CHECK_VERSION(3, 20, 0)
     gd_grab_update(vc, true, vc->s->ptr_owner == vc);
 #else
@@ -1472,6 +1487,7 @@ static void gd_ungrab_keyboard(GtkDisplayState *s)
     }
     s->kbd_owner = NULL;
 
+    win32_kbd_set_grab(false);
 #if GTK_CHECK_VERSION(3, 20, 0)
     gd_grab_update(vc, false, vc->s->ptr_owner == vc);
 #else
@@ -1614,12 +1630,22 @@ static gboolean gd_leave_event(GtkWidget *widget, GdkEventCrossing *crossing,
     return TRUE;
 }
 
+static gboolean gd_focus_in_event(GtkWidget *widget,
+                                  GdkEventFocus *event, gpointer opaque)
+{
+    VirtualConsole *vc = opaque;
+
+    win32_kbd_set_window(gd_win32_get_hwnd(vc));
+    return TRUE;
+}
+
 static gboolean gd_focus_out_event(GtkWidget *widget,
-                                   GdkEventCrossing *crossing, gpointer opaque)
+                                   GdkEventFocus *event, gpointer opaque)
 {
     VirtualConsole *vc = opaque;
     GtkDisplayState *s = vc->s;
 
+    win32_kbd_set_window(NULL);
     gtk_release_modifiers(s);
     return TRUE;
 }
@@ -1878,6 +1904,8 @@ static void gd_connect_vc_gfx_signals(VirtualConsole *vc)
                          G_CALLBACK(gd_enter_event), vc);
         g_signal_connect(vc->gfx.drawing_area, "leave-notify-event",
                          G_CALLBACK(gd_leave_event), vc);
+        g_signal_connect(vc->gfx.drawing_area, "focus-in-event",
+                         G_CALLBACK(gd_focus_in_event), vc);
         g_signal_connect(vc->gfx.drawing_area, "focus-out-event",
                          G_CALLBACK(gd_focus_out_event), vc);
         g_signal_connect(vc->gfx.drawing_area, "configure-event",
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 03/11] ui/gkt: release all keys on grab-broken-event
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 01/11] ui/win32-kbd-hook: handle AltGr in a hook procedure Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 02/11] ui/gtk: fix handling of AltGr key on Windows Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 04/11] ui/gtk: remove unused code Gerd Hoffmann
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

There is no way to grab the Ctrl-Alt-Del key combination on
Windows. This key combination will leave all three keys in a
stuck condition. This patch uses the grab-broken-event to
release the keys.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-3-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/gtk.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/ui/gtk.c b/ui/gtk.c
index a0b10a140330..655b26de384e 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1142,6 +1142,25 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
     return TRUE;
 }
 
+static gboolean gd_grab_broken_event(GtkWidget *widget,
+                                     GdkEventGrabBroken *event, void *opaque)
+{
+#ifdef CONFIG_WIN32
+    /*
+     * On Windows the Ctrl-Alt-Del key combination can't be grabbed. This
+     * key combination leaves all three keys in a stuck condition. We use
+     * the grab-broken-event to release all keys.
+     */
+    if (event->keyboard) {
+        VirtualConsole *vc = opaque;
+        GtkDisplayState *s = vc->s;
+
+        gtk_release_modifiers(s);
+    }
+#endif
+    return TRUE;
+}
+
 static gboolean gd_event(GtkWidget *widget, GdkEvent *event, void *opaque)
 {
     if (event->type == GDK_MOTION_NOTIFY) {
@@ -1910,6 +1929,8 @@ static void gd_connect_vc_gfx_signals(VirtualConsole *vc)
                          G_CALLBACK(gd_focus_out_event), vc);
         g_signal_connect(vc->gfx.drawing_area, "configure-event",
                          G_CALLBACK(gd_configure), vc);
+        g_signal_connect(vc->gfx.drawing_area, "grab-broken-event",
+                         G_CALLBACK(gd_grab_broken_event), vc);
     } else {
         g_signal_connect(vc->gfx.drawing_area, "key-press-event",
                          G_CALLBACK(gd_text_key_down), vc);
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 04/11] ui/gtk: remove unused code
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (2 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 03/11] ui/gkt: release all keys on grab-broken-event Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 05/11] ui/gtk: remove unused variable ignore_keys Gerd Hoffmann
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

This code was last used before commit 2ec78706d1 "ui: convert
GTK and SDL1 frontends to keycodemapdb".

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-4-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/gtk.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/ui/gtk.c b/ui/gtk.c
index 655b26de384e..0e9503a0d1d9 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -112,15 +112,6 @@
 # define VTE_CHECK_VERSION(a, b, c) 0
 #endif
 
-/* Some older mingw versions lack this constant or have
- * it conditionally defined */
-#ifdef _WIN32
-# ifndef MAPVK_VK_TO_VSC
-#  define MAPVK_VK_TO_VSC 0
-# endif
-#endif
-
-
 #define HOTKEY_MODIFIERS        (GDK_CONTROL_MASK | GDK_MOD1_MASK)
 
 static const guint16 *keycode_map;
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 05/11] ui/gtk: remove unused variable ignore_keys
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (3 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 04/11] ui/gtk: remove unused code Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 06/11] ui/sdl2: fix handling of AltGr key on Windows Gerd Hoffmann
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

Since the removal of GTK2 code in commit 89d85cde75 the code
around ignore_keys is unused. See commit 1a01716a30 "gtk: Avoid
accel key leakage into guest on console switch" why it was only
needed for GTK2.

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-5-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/gtk.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/ui/gtk.c b/ui/gtk.c
index 0e9503a0d1d9..354dd90e1898 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -168,8 +168,6 @@ struct GtkDisplayState {
 
     bool external_pause_update;
 
-    bool ignore_keys;
-
     DisplayOptions *opts;
 };
 
@@ -1095,14 +1093,8 @@ static gboolean gd_text_key_down(GtkWidget *widget,
 static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
 {
     VirtualConsole *vc = opaque;
-    GtkDisplayState *s = vc->s;
     int qcode;
 
-    if (s->ignore_keys) {
-        s->ignore_keys = (key->type == GDK_KEY_PRESS);
-        return TRUE;
-    }
-
 #ifdef WIN32
     /* on windows, we ought to ignore the reserved key event? */
     if (key->hardware_keycode == 0xff)
@@ -1204,7 +1196,6 @@ static void gd_menu_switch_vc(GtkMenuItem *item, void *opaque)
         gtk_notebook_set_current_page(nb, page);
         gtk_widget_grab_focus(vc->focus);
     }
-    s->ignore_keys = false;
 }
 
 static void gd_accel_switch_vc(void *opaque)
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 06/11] ui/sdl2: fix handling of AltGr key on Windows
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (4 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 05/11] ui/gtk: remove unused variable ignore_keys Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 07/11] ui/sdl2: start in full screen with grab enabled Gerd Hoffmann
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

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>
---
 ui/sdl2.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/ui/sdl2.c b/ui/sdl2.c
index 61c7956da334..79c1ea29d223 100644
--- a/ui/sdl2.c
+++ b/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);
         }
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 07/11] ui/sdl2: start in full screen with grab enabled
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (5 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 06/11] ui/sdl2: fix handling of AltGr key on Windows Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 08/11] ui/sdl2-input: use trace-events to debug key events Gerd Hoffmann
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

QEMU with SDL 1.2 display used to enable keyboard and mouse grab-
bing when started in full screen. The SDL 2.0 code tries to do
the same but fails to enable grabbing because sdl_grab_start(0)
returns early. To do it's work the sdl_grab_start() function
needs a pointer to a sdl2_console structure.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-7-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/sdl2.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/ui/sdl2.c b/ui/sdl2.c
index 79c1ea29d223..b23a8f0a8ebf 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -881,17 +881,16 @@ static void sdl2_display_init(DisplayState *ds, DisplayOptions *o)
         SDL_SetWindowIcon(sdl2_console[0].real_window, icon);
     }
 
-    gui_grab = 0;
-    if (gui_fullscreen) {
-        sdl_grab_start(0);
-    }
-
     mouse_mode_notifier.notify = sdl_mouse_mode_change;
     qemu_add_mouse_mode_change_notifier(&mouse_mode_notifier);
 
     sdl_cursor_hidden = SDL_CreateCursor(&data, &data, 8, 1, 0, 0);
     sdl_cursor_normal = SDL_GetCursor();
 
+    if (gui_fullscreen) {
+        sdl_grab_start(&sdl2_console[0]);
+    }
+
     atexit(sdl_cleanup);
 }
 
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 08/11] ui/sdl2-input: use trace-events to debug key events
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (6 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 07/11] ui/sdl2: start in full screen with grab enabled Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 09/11] ui/gtk: don't pass on win keys without keyboard grab Gerd Hoffmann
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-8-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/sdl2-input.c | 3 +++
 ui/trace-events | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/ui/sdl2-input.c b/ui/sdl2-input.c
index 1f9fe831b30d..f068382209cc 100644
--- a/ui/sdl2-input.c
+++ b/ui/sdl2-input.c
@@ -27,6 +27,7 @@
 #include "ui/console.h"
 #include "ui/input.h"
 #include "ui/sdl2.h"
+#include "trace.h"
 
 void sdl2_process_key(struct sdl2_console *scon,
                       SDL_KeyboardEvent *ev)
@@ -38,6 +39,8 @@ void sdl2_process_key(struct sdl2_console *scon,
         return;
     }
     qcode = qemu_input_map_usb_to_qcode[ev->keysym.scancode];
+    trace_sdl2_process_key(ev->keysym.scancode, qcode,
+                           ev->type == SDL_KEYDOWN ? "down" : "up");
     qkbd_state_key_event(scon->kbd, qcode, ev->type == SDL_KEYDOWN);
 
     if (!qemu_console_is_graphic(con)) {
diff --git a/ui/trace-events b/ui/trace-events
index 0dcda393c1d6..5367fd3f1668 100644
--- a/ui/trace-events
+++ b/ui/trace-events
@@ -75,6 +75,9 @@ input_event_abs(int conidx, const char *axis, int value) "con %d, axis %s, value
 input_event_sync(void) ""
 input_mouse_mode(int absolute) "absolute %d"
 
+# sdl2-input.c
+sdl2_process_key(int sdl_scancode, int qcode, const char *action) "translated SDL scancode %d to QKeyCode %d (%s)"
+
 # spice-display.c
 qemu_spice_add_memslot(int qid, uint32_t slot_id, unsigned long virt_start, unsigned long virt_end, int async) "%d %u: host virt 0x%lx - 0x%lx async=%d"
 qemu_spice_del_memslot(int qid, uint32_t gid, uint32_t slot_id) "%d gid=%u sid=%u"
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 09/11] ui/gtk: don't pass on win keys without keyboard grab
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (7 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 08/11] ui/sdl2-input: use trace-events to debug key events Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 10/11] ui/gtk: use native keyboard scancodes on Windows Gerd Hoffmann
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

Without keyboard grab Windows currently handles the two win keys
and the key events are also sent to the guest. This is undesir-
able. Only one program should handle key events. This patch ap-
plies commit c68f74b02e "win32: do not handle win keys when the
keyboard is not grabbed" from project spice-gtk to ui/gtk.c to
fix this problem.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-9-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/gtk.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/ui/gtk.c b/ui/gtk.c
index 354dd90e1898..1d51e14bb58d 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1095,10 +1095,17 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
     VirtualConsole *vc = opaque;
     int qcode;
 
-#ifdef WIN32
+#ifdef G_OS_WIN32
     /* on windows, we ought to ignore the reserved key event? */
     if (key->hardware_keycode == 0xff)
         return false;
+
+    if (!vc->s->kbd_owner) {
+        if (key->hardware_keycode == VK_LWIN ||
+            key->hardware_keycode == VK_RWIN) {
+            return FALSE;
+        }
+    }
 #endif
 
     if (key->keyval == GDK_KEY_Pause
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 10/11] ui/gtk: use native keyboard scancodes on Windows
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (8 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 09/11] ui/gtk: don't pass on win keys without keyboard grab Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-20  8:43 ` [PULL 11/11] ui: increase min required GTK version to 3.22.0 Gerd Hoffmann
  2020-05-21 15:46 ` [PULL 00/11] Ui 20200520 patches Peter Maydell
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

Since GTK 3.22 the function gdk_event_get_scancode() is
available. On Windows this function returns keyboard scancodes
and some extended flags. These raw keyboard scancodes are much
better suited for this use case than the half-cooked win32
virtual-key codes because scancodes report the key position on
the keyboard and the positions are independent of national
language settings.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-10-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 ui/gtk.c | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/ui/gtk.c b/ui/gtk.c
index 1d51e14bb58d..68a5b901c72d 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1026,8 +1026,13 @@ static const guint16 *gd_get_keymap(size_t *maplen)
 #ifdef GDK_WINDOWING_WIN32
     if (GDK_IS_WIN32_DISPLAY(dpy)) {
         trace_gd_keymap_windowing("win32");
+#if GTK_CHECK_VERSION(3, 22, 0)
+        *maplen = qemu_input_map_atset1_to_qcode_len;
+        return qemu_input_map_atset1_to_qcode;
+#else
         *maplen = qemu_input_map_win32_to_qcode_len;
         return qemu_input_map_win32_to_qcode;
+#endif
     }
 #endif
 
@@ -1073,6 +1078,25 @@ static int gd_map_keycode(int scancode)
     return keycode_map[scancode];
 }
 
+static int gd_get_keycode(GdkEventKey *key)
+{
+#if defined G_OS_WIN32 && GTK_CHECK_VERSION(3, 22, 0)
+    int scancode = gdk_event_get_scancode((GdkEvent *)key);
+
+    /* translate Windows native scancodes to atset1 keycodes */
+    switch (scancode & (KF_EXTENDED | 0xff)) {
+    case 0x145:     /* NUMLOCK */
+        return scancode & 0xff;
+    }
+
+    return scancode & KF_EXTENDED ?
+        0xe000 | (scancode & 0xff) : scancode & 0xff;
+
+#else
+    return key->hardware_keycode;
+#endif
+}
+
 static gboolean gd_text_key_down(GtkWidget *widget,
                                  GdkEventKey *key, void *opaque)
 {
@@ -1084,7 +1108,7 @@ static gboolean gd_text_key_down(GtkWidget *widget,
     } else if (key->length) {
         kbd_put_string_console(con, key->string, key->length);
     } else {
-        int qcode = gd_map_keycode(key->hardware_keycode);
+        int qcode = gd_map_keycode(gd_get_keycode(key));
         kbd_put_qcode_console(con, qcode, false);
     }
     return TRUE;
@@ -1093,7 +1117,7 @@ static gboolean gd_text_key_down(GtkWidget *widget,
 static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
 {
     VirtualConsole *vc = opaque;
-    int qcode;
+    int keycode, qcode;
 
 #ifdef G_OS_WIN32
     /* on windows, we ought to ignore the reserved key event? */
@@ -1121,9 +1145,10 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
         return TRUE;
     }
 
-    qcode = gd_map_keycode(key->hardware_keycode);
+    keycode = gd_get_keycode(key);
+    qcode = gd_map_keycode(keycode);
 
-    trace_gd_key_event(vc->label, key->hardware_keycode, qcode,
+    trace_gd_key_event(vc->label, keycode, qcode,
                        (key->type == GDK_KEY_PRESS) ? "down" : "up");
 
     qkbd_state_key_event(vc->gfx.kbd, qcode,
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PULL 11/11] ui: increase min required GTK version to 3.22.0
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (9 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 10/11] ui/gtk: use native keyboard scancodes on Windows Gerd Hoffmann
@ 2020-05-20  8:43 ` Gerd Hoffmann
  2020-05-21 15:46 ` [PULL 00/11] Ui 20200520 patches Peter Maydell
  11 siblings, 0 replies; 14+ messages in thread
From: Gerd Hoffmann @ 2020-05-20  8:43 UTC (permalink / raw)
  To: qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Gerd Hoffmann, Paolo Bonzini

From: Volker Rümelin <vr_qemu@t-online.de>

Based on a mail on the qemu-devel mailing list at
https://lists.nongnu.org/archive/html/qemu-devel/2020-05/msg02909.html
and some internet research the GTK3 versions on supported
platforms are:

    RHEL-7.4: 3.22.10
    RHEL-7.5: 3.22.26
    Debian (Stretch): 3.22.11
    Debian (Buster): 3.24.5
    OpenBSD (Ports): 3.22.30
    FreeBSD (Ports): 3.22.29
    OpenSUSE Leap 15: 3.22.30
    SLE12-SP2: Unknown
    SLE15: 3.22.30
    Ubuntu (Bionic): 3.22.30
    Ubuntu (Focal): 3.24.18
    macOS (Homebrew): 3.22.30

This justifies increasing the minimum required GTK version in
QEMU to 3.22.0.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Message-id: 20200516072014.7766-11-vr_qemu@t-online.de
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 configure |  2 +-
 ui/gtk.c  | 91 +++++--------------------------------------------------
 2 files changed, 9 insertions(+), 84 deletions(-)

diff --git a/configure b/configure
index 26084fc53ad1..2fc05c4465cb 100755
--- a/configure
+++ b/configure
@@ -2897,7 +2897,7 @@ fi
 if test "$gtk" != "no"; then
     gtkpackage="gtk+-3.0"
     gtkx11package="gtk+-x11-3.0"
-    gtkversion="3.14.0"
+    gtkversion="3.22.0"
     if $pkg_config --exists "$gtkpackage >= $gtkversion"; then
         gtk_cflags=$($pkg_config --cflags $gtkpackage)
         gtk_libs=$($pkg_config --libs $gtkpackage)
diff --git a/ui/gtk.c b/ui/gtk.c
index 68a5b901c72d..d4b49bd7dafe 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -490,12 +490,7 @@ static void gd_refresh(DisplayChangeListener *dcl)
 
 static GdkDevice *gd_get_pointer(GdkDisplay *dpy)
 {
-#if GTK_CHECK_VERSION(3, 20, 0)
     return gdk_seat_get_pointer(gdk_display_get_default_seat(dpy));
-#else
-    return gdk_device_manager_get_client_pointer(
-        gdk_display_get_device_manager(dpy));
-#endif
 }
 
 static void gd_mouse_set(DisplayChangeListener *dcl,
@@ -877,27 +872,18 @@ static gboolean gd_motion_event(GtkWidget *widget, GdkEventMotion *motion,
 
     if (!qemu_input_is_absolute() && s->ptr_owner == vc) {
         GdkScreen *screen = gtk_widget_get_screen(vc->gfx.drawing_area);
+        GdkDisplay *dpy = gtk_widget_get_display(widget);
+        GdkWindow *win = gtk_widget_get_window(widget);
+        GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win);
+        GdkRectangle geometry;
         int screen_width, screen_height;
 
         int x = (int)motion->x_root;
         int y = (int)motion->y_root;
 
-#if GTK_CHECK_VERSION(3, 22, 0)
-        {
-            GdkDisplay *dpy = gtk_widget_get_display(widget);
-            GdkWindow *win = gtk_widget_get_window(widget);
-            GdkMonitor *monitor = gdk_display_get_monitor_at_window(dpy, win);
-            GdkRectangle geometry;
-            gdk_monitor_get_geometry(monitor, &geometry);
-            screen_width = geometry.width;
-            screen_height = geometry.height;
-        }
-#else
-        {
-            screen_width = gdk_screen_get_width(screen);
-            screen_height = gdk_screen_get_height(screen);
-        }
-#endif
+        gdk_monitor_get_geometry(monitor, &geometry);
+        screen_width = geometry.width;
+        screen_height = geometry.height;
 
         /* In relative mode check to see if client pointer hit
          * one of the screen edges, and if so move it back by
@@ -1026,13 +1012,8 @@ static const guint16 *gd_get_keymap(size_t *maplen)
 #ifdef GDK_WINDOWING_WIN32
     if (GDK_IS_WIN32_DISPLAY(dpy)) {
         trace_gd_keymap_windowing("win32");
-#if GTK_CHECK_VERSION(3, 22, 0)
         *maplen = qemu_input_map_atset1_to_qcode_len;
         return qemu_input_map_atset1_to_qcode;
-#else
-        *maplen = qemu_input_map_win32_to_qcode_len;
-        return qemu_input_map_win32_to_qcode;
-#endif
     }
 #endif
 
@@ -1080,7 +1061,7 @@ static int gd_map_keycode(int scancode)
 
 static int gd_get_keycode(GdkEventKey *key)
 {
-#if defined G_OS_WIN32 && GTK_CHECK_VERSION(3, 22, 0)
+#ifdef G_OS_WIN32
     int scancode = gdk_event_get_scancode((GdkEvent *)key);
 
     /* translate Windows native scancodes to atset1 keycodes */
@@ -1437,7 +1418,6 @@ static void gd_menu_zoom_fit(GtkMenuItem *item, void *opaque)
     gd_update_full_redraw(vc);
 }
 
-#if GTK_CHECK_VERSION(3, 20, 0)
 static void gd_grab_update(VirtualConsole *vc, bool kbd, bool ptr)
 {
     GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
@@ -1461,32 +1441,6 @@ static void gd_grab_update(VirtualConsole *vc, bool kbd, bool ptr)
         gdk_seat_ungrab(seat);
     }
 }
-#else
-static void gd_grab_devices(VirtualConsole *vc, bool grab,
-                            GdkInputSource source, GdkEventMask mask,
-                            GdkCursor *cursor)
-{
-    GdkDisplay *display = gtk_widget_get_display(vc->gfx.drawing_area);
-    GdkDeviceManager *mgr = gdk_display_get_device_manager(display);
-    GList *devs = gdk_device_manager_list_devices(mgr, GDK_DEVICE_TYPE_MASTER);
-    GList *tmp = devs;
-
-    for (tmp = devs; tmp; tmp = tmp->next) {
-        GdkDevice *dev = tmp->data;
-        if (gdk_device_get_source(dev) != source) {
-            continue;
-        }
-        if (grab) {
-            GdkWindow *win = gtk_widget_get_window(vc->gfx.drawing_area);
-            gdk_device_grab(dev, win, GDK_OWNERSHIP_NONE, FALSE,
-                            mask, cursor, GDK_CURRENT_TIME);
-        } else {
-            gdk_device_ungrab(dev, GDK_CURRENT_TIME);
-        }
-    }
-    g_list_free(devs);
-}
-#endif
 
 static void gd_grab_keyboard(VirtualConsole *vc, const char *reason)
 {
@@ -1499,13 +1453,7 @@ static void gd_grab_keyboard(VirtualConsole *vc, const char *reason)
     }
 
     win32_kbd_set_grab(true);
-#if GTK_CHECK_VERSION(3, 20, 0)
     gd_grab_update(vc, true, vc->s->ptr_owner == vc);
-#else
-    gd_grab_devices(vc, true, GDK_SOURCE_KEYBOARD,
-                   GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
-                   NULL);
-#endif
     vc->s->kbd_owner = vc;
     gd_update_caption(vc->s);
     trace_gd_grab(vc->label, "kbd", reason);
@@ -1521,11 +1469,7 @@ static void gd_ungrab_keyboard(GtkDisplayState *s)
     s->kbd_owner = NULL;
 
     win32_kbd_set_grab(false);
-#if GTK_CHECK_VERSION(3, 20, 0)
     gd_grab_update(vc, false, vc->s->ptr_owner == vc);
-#else
-    gd_grab_devices(vc, false, GDK_SOURCE_KEYBOARD, 0, NULL);
-#endif
     gd_update_caption(s);
     trace_gd_ungrab(vc->label, "kbd");
 }
@@ -1542,21 +1486,9 @@ static void gd_grab_pointer(VirtualConsole *vc, const char *reason)
         }
     }
 
-#if GTK_CHECK_VERSION(3, 20, 0)
     gd_grab_update(vc, vc->s->kbd_owner == vc, true);
     gdk_device_get_position(gd_get_pointer(display),
                             NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
-#else
-    gd_grab_devices(vc, true, GDK_SOURCE_MOUSE,
-                    GDK_POINTER_MOTION_MASK |
-                    GDK_BUTTON_PRESS_MASK |
-                    GDK_BUTTON_RELEASE_MASK |
-                    GDK_BUTTON_MOTION_MASK |
-                    GDK_SCROLL_MASK,
-                    vc->s->null_cursor);
-    gdk_device_get_position(gd_get_pointer(display),
-                            NULL, &vc->s->grab_x_root, &vc->s->grab_y_root);
-#endif
     vc->s->ptr_owner = vc;
     gd_update_caption(vc->s);
     trace_gd_grab(vc->label, "ptr", reason);
@@ -1573,17 +1505,10 @@ static void gd_ungrab_pointer(GtkDisplayState *s)
     s->ptr_owner = NULL;
 
     display = gtk_widget_get_display(vc->gfx.drawing_area);
-#if GTK_CHECK_VERSION(3, 20, 0)
     gd_grab_update(vc, vc->s->kbd_owner == vc, false);
     gdk_device_warp(gd_get_pointer(display),
                     gtk_widget_get_screen(vc->gfx.drawing_area),
                     vc->s->grab_x_root, vc->s->grab_y_root);
-#else
-    gd_grab_devices(vc, false, GDK_SOURCE_MOUSE, 0, NULL);
-    gdk_device_warp(gd_get_pointer(display),
-                    gtk_widget_get_screen(vc->gfx.drawing_area),
-                    vc->s->grab_x_root, vc->s->grab_y_root);
-#endif
     gd_update_caption(s);
     trace_gd_ungrab(vc->label, "ptr");
 }
-- 
2.18.4



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PULL 00/11] Ui 20200520 patches
  2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
                   ` (10 preceding siblings ...)
  2020-05-20  8:43 ` [PULL 11/11] ui: increase min required GTK version to 3.22.0 Gerd Hoffmann
@ 2020-05-21 15:46 ` Peter Maydell
  11 siblings, 0 replies; 14+ messages in thread
From: Peter Maydell @ 2020-05-21 15:46 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Stefan Weil, QEMU Developers, Paolo Bonzini

On Wed, 20 May 2020 at 09:44, Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> The following changes since commit debe78ce14bf8f8940c2bdf3ef387505e9e035a9:
>
>   Merge remote-tracking branch 'remotes/rth/tags/pull-fpu-20200515' into staging (2020-05-15 19:51:16 +0100)
>
> are available in the Git repository at:
>
>   git://git.kraxel.org/qemu tags/ui-20200520-pull-request
>
> for you to fetch changes up to 7b23d121f913709306e678a3289edc813f3a7463:
>
>   ui: increase min required GTK version to 3.22.0 (2020-05-19 09:06:44 +0200)
>
> ----------------------------------------------------------------
> ui: windows keyboard fixes for gtk & sdl.
> ui: require GTK 3.22 or newer.
>


Applied, thanks.

Please update the changelog at https://wiki.qemu.org/ChangeLog/5.1
for any user-visible changes.

-- PMM


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PULL 01/11] ui/win32-kbd-hook: handle AltGr in a hook procedure
  2020-05-20  8:43 ` [PULL 01/11] ui/win32-kbd-hook: handle AltGr in a hook procedure Gerd Hoffmann
@ 2020-05-22 17:15   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-05-22 17:15 UTC (permalink / raw)
  To: Gerd Hoffmann, qemu-devel; +Cc: Stefan Weil, Volker Rümelin, Paolo Bonzini

On 5/20/20 10:43 AM, Gerd Hoffmann wrote:
> From: Volker Rümelin <vr_qemu@t-online.de>
> 
> Import win32 keyboard hooking code from project spice-gtk. This
> patch removes the extra left control key up/down input events
> inserted by Windows for the right alt key up/down input events
> with international keyboard layouts. Additionally there's some
> code to grab the keyboard.
> 
> The next patches will use this code.
> 
> Only Windows needs this.
> 
> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
> Message-id: 20200516072014.7766-1-vr_qemu@t-online.de

This patch content doesn't match exactly the content of the message-id.

There are some build-sys changes.

> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  include/ui/win32-kbd-hook.h |  14 +++++
>  stubs/win32-kbd-hook.c      |  18 +++++++
>  ui/win32-kbd-hook.c         | 102 ++++++++++++++++++++++++++++++++++++
>  stubs/Makefile.objs         |   1 +
>  ui/Makefile.objs            |   3 ++
>  5 files changed, 138 insertions(+)
>  create mode 100644 include/ui/win32-kbd-hook.h
>  create mode 100644 stubs/win32-kbd-hook.c
>  create mode 100644 ui/win32-kbd-hook.c
[...]
> diff --git a/stubs/Makefile.objs b/stubs/Makefile.objs
> index 45be5dc0ed78..6a9e3135e8f9 100644
> --- a/stubs/Makefile.objs
> +++ b/stubs/Makefile.objs
> @@ -32,6 +32,7 @@ stub-obj-y += trace-control.o
>  stub-obj-y += uuid.o
>  stub-obj-y += vm-stop.o
>  stub-obj-y += vmstate.o
> +stub-obj-y += win32-kbd-hook.o
>  stub-obj-y += fd-register.o
>  stub-obj-y += qmp_memory_device.o
>  stub-obj-y += target-monitor-defs.o
> diff --git a/ui/Makefile.objs b/ui/Makefile.objs
> index e6da6ff047fd..504b19647977 100644
> --- a/ui/Makefile.objs
> +++ b/ui/Makefile.objs
> @@ -15,6 +15,9 @@ common-obj-$(CONFIG_SPICE) += spice-core.o spice-input.o spice-display.o
>  common-obj-$(CONFIG_COCOA) += cocoa.o
>  common-obj-$(CONFIG_VNC) += $(vnc-obj-y)
>  common-obj-$(call lnot,$(CONFIG_VNC)) += vnc-stubs.o
> +ifneq (,$(findstring m,$(CONFIG_SDL)$(CONFIG_GTK)))

If we limit this object compilation, shouldn't we also limit the stub?

> +common-obj-$(CONFIG_WIN32) += win32-kbd-hook.o
> +endif
>  
>  # ui-sdl module
>  common-obj-$(CONFIG_SDL) += sdl.mo
> 



^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2020-05-22 17:16 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-20  8:43 [PULL 00/11] Ui 20200520 patches Gerd Hoffmann
2020-05-20  8:43 ` [PULL 01/11] ui/win32-kbd-hook: handle AltGr in a hook procedure Gerd Hoffmann
2020-05-22 17:15   ` Philippe Mathieu-Daudé
2020-05-20  8:43 ` [PULL 02/11] ui/gtk: fix handling of AltGr key on Windows Gerd Hoffmann
2020-05-20  8:43 ` [PULL 03/11] ui/gkt: release all keys on grab-broken-event Gerd Hoffmann
2020-05-20  8:43 ` [PULL 04/11] ui/gtk: remove unused code Gerd Hoffmann
2020-05-20  8:43 ` [PULL 05/11] ui/gtk: remove unused variable ignore_keys Gerd Hoffmann
2020-05-20  8:43 ` [PULL 06/11] ui/sdl2: fix handling of AltGr key on Windows Gerd Hoffmann
2020-05-20  8:43 ` [PULL 07/11] ui/sdl2: start in full screen with grab enabled Gerd Hoffmann
2020-05-20  8:43 ` [PULL 08/11] ui/sdl2-input: use trace-events to debug key events Gerd Hoffmann
2020-05-20  8:43 ` [PULL 09/11] ui/gtk: don't pass on win keys without keyboard grab Gerd Hoffmann
2020-05-20  8:43 ` [PULL 10/11] ui/gtk: use native keyboard scancodes on Windows Gerd Hoffmann
2020-05-20  8:43 ` [PULL 11/11] ui: increase min required GTK version to 3.22.0 Gerd Hoffmann
2020-05-21 15:46 ` [PULL 00/11] Ui 20200520 patches Peter Maydell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).