All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Volker Rümelin" <vr_qemu@t-online.de>
To: "Gerd Hoffmann" <kraxel@redhat.com>,
	"Stefan Weil" <sw@weilnetz.de>,
	"Daniel P . Berrangé" <berrange@redhat.com>
Cc: QEMU <qemu-devel@nongnu.org>
Subject: [PATCH 10/10] ui/gtk: use native keyboard scancodes on Windows
Date: Sun, 10 May 2020 20:43:04 +0200	[thread overview]
Message-ID: <20200510184304.9267-10-vr_qemu@t-online.de> (raw)
In-Reply-To: <2393388c-86c3-4d7e-178e-2c7e6d14a8de@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>
---
 ui/gtk.c | 33 +++++++++++++++++++++++++++++----
 1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/ui/gtk.c b/ui/gtk.c
index a43fddc57f..242b378bf1 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1016,8 +1016,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
 
@@ -1063,6 +1068,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 scan codes 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)
 {
@@ -1074,7 +1098,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;
@@ -1083,7 +1107,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? */
@@ -1111,9 +1135,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.26.1



  parent reply	other threads:[~2020-05-10 18:52 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-10 18:42 Patches for ui/gtk and ui/sdl Volker Rümelin
2020-05-10 18:42 ` [PATCH 01/10] ui/win32-kbd-hook: handle AltGr in a hook procedure Volker Rümelin
2020-05-12 11:21   ` Gerd Hoffmann
2020-05-10 18:42 ` [PATCH 02/10] ui/gtk: fix handling of AltGr key on Windows Volker Rümelin
2020-05-12 11:23   ` Gerd Hoffmann
2020-05-10 18:42 ` [PATCH 03/10] ui/gkt: release all keys on grab-broken-event Volker Rümelin
2020-05-12 11:28   ` Gerd Hoffmann
2020-05-10 18:42 ` [PATCH 04/10] ui/gtk: remove unused code Volker Rümelin
2020-05-12 11:46   ` Philippe Mathieu-Daudé
2020-05-10 18:42 ` [PATCH 05/10] ui/gtk: remove unused variable ignore_keys Volker Rümelin
2020-05-12 11:50   ` Philippe Mathieu-Daudé
2020-05-10 18:43 ` [PATCH 06/10] ui/sdl2: fix handling of AltGr key on Windows Volker Rümelin
2020-05-10 18:43 ` [PATCH 07/10] ui/sdl2: start in full screen with grab enabled Volker Rümelin
2020-05-10 18:43 ` [PATCH 08/10] ui/sdl2-input: use trace-events to debug key events Volker Rümelin
2020-05-12 11:51   ` Philippe Mathieu-Daudé
2020-05-10 18:43 ` [PATCH 09/10] ui/gtk: don't pass on win keys without keyboard grab Volker Rümelin
2020-05-12 11:30   ` Gerd Hoffmann
2020-05-10 18:43 ` Volker Rümelin [this message]
2020-05-12 11:31   ` [PATCH 10/10] ui/gtk: use native keyboard scancodes on Windows Daniel P. Berrangé
2020-05-14 20:46     ` Volker Rümelin
2020-05-11  7:56 ` Patches for ui/gtk and ui/sdl Howard Spoelstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200510184304.9267-10-vr_qemu@t-online.de \
    --to=vr_qemu@t-online.de \
    --cc=berrange@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sw@weilnetz.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.