[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 10/10] ui/gtk: use native keyboard scancodes on Windows
From: |
Volker Rümelin |
Subject: |
[PATCH 10/10] ui/gtk: use native keyboard scancodes on Windows |
Date: |
Sun, 10 May 2020 20:43:04 +0200 |
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 <address@hidden>
---
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
- [PATCH 05/10] ui/gtk: remove unused variable ignore_keys, (continued)
- [PATCH 05/10] ui/gtk: remove unused variable ignore_keys, Volker Rümelin, 2020/05/10
- [PATCH 06/10] ui/sdl2: fix handling of AltGr key on Windows, Volker Rümelin, 2020/05/10
- [PATCH 04/10] ui/gtk: remove unused code, Volker Rümelin, 2020/05/10
- [PATCH 07/10] ui/sdl2: start in full screen with grab enabled, Volker Rümelin, 2020/05/10
- [PATCH 08/10] ui/sdl2-input: use trace-events to debug key events, Volker Rümelin, 2020/05/10
- [PATCH 09/10] ui/gtk: don't pass on win keys without keyboard grab, Volker Rümelin, 2020/05/10
- [PATCH 10/10] ui/gtk: use native keyboard scancodes on Windows,
Volker Rümelin <=
- Re: Patches for ui/gtk and ui/sdl, Howard Spoelstra, 2020/05/11