From: "Thebault, Remi" <remi.thebault@outlook.com>
To: "Stefan Weil" <sw@weilnetz.de>,
"Andreas Färber" <afaerber@suse.de>,
"Kevin Wolf" <kwolf@redhat.com>
Cc: Tim Hardeck <thardeck@suse.de>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2] alt-gr on Windows
Date: Sun, 25 Jan 2015 17:36:16 +0100 [thread overview]
Message-ID: <BLU437-SMTP458BCCBC1E4ECEB68314DBF6340@phx.gbl> (raw)
In-Reply-To: <54A59BA4.2090700@weilnetz.de>
[-- Attachment #1: Type: text/plain, Size: 871 bytes --]
Hello
attached is the v2 set of patchs.
Le 01/01/2015 20:10, Stefan Weil a écrit :
> I suggest calling MapVirtualKey only for those keys which don't need special handling, so it would be in the default case of the switch statement.
Done (patch 0001) . updated code yields to same result as previous patch. Added a FIXME note regarding the previous alt gr fix, which do not look relevant anymore to me.
> It looks like Alt-Ctrl is a valid alternative for pressing AltGr on Windows, so we have to take that into account, too.
Few tests I did on a XP vm give correct keyboard behaviour. looks like this is transparent on Windows guest.
> Wine also needs special handling because it sends a single (different) key code instead of two key codes.
By this I understand that Wine should just be excluded from this fix (what I do by patch 0002)
Regards,
Rémi
[-- Attachment #2: 0001-input-gtk-win32-ui-sends-r-ctrl-and-r-alt-key-events.patch --]
[-- Type: text/plain, Size: 1882 bytes --]
>From 3ecdd74fd12f33b6c00b66fce2e082c7fe9b273e Mon Sep 17 00:00:00 2001
From: Remi Thebault <remi.thebault@outlook.com>
Date: Sun, 25 Jan 2015 16:57:45 +0100
Subject: [PATCH 1/4 v2] input: gtk win32 ui sends r-ctrl and r-alt key events
gtk ui on win32 only sent left ctrl and alt code, whatever the keystroke.
In case of a right keystroke and left scan code, this commit corrects
the qemu code to fit the actual keystroke.
Signed-off-by: Remi Thebault <remi.thebault@outlook.com>
---
ui/gtk.c | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/ui/gtk.c b/ui/gtk.c
index 0385757..da593f7 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -900,10 +900,26 @@ static int gd_map_keycode(GtkDisplayState *s, GdkDisplay *dpy, int gdk_keycode)
#ifdef GDK_WINDOWING_WIN32
if (GDK_IS_WIN32_DISPLAY(dpy)) {
- qemu_keycode = MapVirtualKey(gdk_keycode, MAPVK_VK_TO_VSC);
- switch (qemu_keycode) {
- case 103: /* alt gr */
- qemu_keycode = 56 | SCANCODE_GREY;
+ /*
+ testing for right ctrl and right alt and give corresponding code.
+ for all other keystrokes, scan code is given by MapVirtualKey.
+ (MapVirtualKey maps same code for left and right ctrl and alt keys)
+ */
+ switch (gdk_keycode) {
+ case 0xa3: // r-ctrl
+ qemu_keycode = 0x9d;
+ break;
+ case 0xa5: // r-alt
+ qemu_keycode = 0xb8;
+ break;
+ default:
+ qemu_keycode = MapVirtualKey(gdk_keycode, MAPVK_VK_TO_VSC);
+ /* FIXME: is following check still needed? */
+ switch (qemu_keycode) {
+ case 103: /* alt gr */
+ qemu_keycode = 56 | SCANCODE_GREY;
+ break;
+ }
break;
}
return qemu_keycode;
--
1.8.5.2.msysgit.0
[-- Attachment #3: 0002-input-introduce-INPUT_NEEDS_ALTGR_FIX-macro.patch --]
[-- Type: text/plain, Size: 877 bytes --]
>From b4866d32436e9b6bd9a9488eb5f998d196980e77 Mon Sep 17 00:00:00 2001
From: Remi Thebault <remi.thebault@outlook.com>
Date: Sun, 25 Jan 2015 17:04:01 +0100
Subject: [PATCH 2/4 v2] input: introduce INPUT_NEEDS_ALTGR_FIX macro
Common macro amoung all ui, to provide consistent alt gr fix.
defined such as to have the fix on win32 (excluding wine)
---
include/ui/input.h | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/include/ui/input.h b/include/ui/input.h
index 5d5ac00..64e531c 100644
--- a/include/ui/input.h
+++ b/include/ui/input.h
@@ -10,6 +10,13 @@
#define INPUT_EVENT_ABS_SIZE 0x8000
+#ifndef INPUT_NEEDS_ALTGR_FIX
+# if defined(_WIN32) && !defined(__WINE__)
+# define INPUT_NEEDS_ALTGR_FIX 1
+# endif
+#endif
+
+
typedef struct QemuInputHandler QemuInputHandler;
typedef struct QemuInputHandlerState QemuInputHandlerState;
--
1.8.5.2.msysgit.0
[-- Attachment #4: 0003-input-gtk-win32-ui-handles-altgr-key-correctly.patch --]
[-- Type: text/plain, Size: 2216 bytes --]
>From 23b3b8bfa8dfce05b72bde6a82adf6e122a5d74f Mon Sep 17 00:00:00 2001
From: Remi Thebault <remi.thebault@outlook.com>
Date: Sun, 25 Jan 2015 17:06:11 +0100
Subject: [PATCH 3/4 v2] input: gtk win32 ui handles altgr key correctly
Linux guest / Windows host had a dead altgr key problem due to
Windows mapping of altgr to ctrl-alt. This commit fixes it by sending
a fake ctrl-up event to the guest when appropriate.
In case of turbo mode, only one fake event is sent.
In a windows guest, altgr key still works as usual.
Signed-off-by: Remi Thebault <remi.thebault@outlook.com>
---
ui/gtk.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/ui/gtk.c b/ui/gtk.c
index da593f7..1287409 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -230,6 +230,12 @@ struct GtkDisplayState {
bool modifier_pressed[ARRAY_SIZE(modifier_keycode)];
bool has_evdev;
+
+#if defined(INPUT_NEEDS_ALTGR_FIX)
+ /* win32 alt-gr handling */
+ bool l_ctrl_down;
+ bool r_alt_down;
+#endif
};
static void gd_grab_pointer(VirtualConsole *vc);
@@ -975,6 +981,30 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque)
}
}
+#if defined(INPUT_NEEDS_ALTGR_FIX)
+ /* Windows maps altgr key to l-ctrl + r-alt.
+ For proper handling in the guest, only r-alt is to be sent.
+ This is done by sending a fake "ctrl up" event when appropriate. */
+ switch (qemu_keycode) {
+ case 0x1d: /* l-ctrl */
+ if (!s->l_ctrl_down && s->r_alt_down) {
+ /* fake ctrl up already sent */
+ return TRUE;
+ }
+ s->l_ctrl_down = (key->type == GDK_KEY_PRESS);
+ break;
+ case 0xb8: /* r-alt */
+ if (s->l_ctrl_down && !s->r_alt_down &&
+ key->type == GDK_KEY_PRESS) {
+ /* sending fake "ctrl up" event */
+ qemu_input_event_send_key_number(vc->gfx.dcl.con, 0x1d, FALSE);
+ s->l_ctrl_down = FALSE;
+ }
+ s->r_alt_down = (key->type == GDK_KEY_PRESS);
+ break;
+ }
+#endif
+
qemu_input_event_send_key_number(vc->gfx.dcl.con, qemu_keycode,
key->type == GDK_KEY_PRESS);
--
1.8.5.2.msysgit.0
[-- Attachment #5: 0004-input-sdl2-win32-ui-handles-altgr-key-correctly.patch --]
[-- Type: text/plain, Size: 2650 bytes --]
>From 8d685ff821480aabf28973d2f174f47921617c01 Mon Sep 17 00:00:00 2001
From: Remi Thebault <remi.thebault@outlook.com>
Date: Sun, 25 Jan 2015 17:09:58 +0100
Subject: [PATCH 4/4 v2] input: sdl2 win32 ui handles altgr key correctly
Linux guest / Windows host had a dead altgr key problem due to
Windows mapping of altgr to ctrl-alt. This commit fixes it by sending
a fake ctrl-up event to the guest when appropriate.
In case of turbo mode, only one fake event is sent.
In a windows guest, altgr key still works as usual.
Signed-off-by: Remi Thebault <remi.thebault@outlook.com>
---
ui/sdl2.c | 40 ++++++++++++++++++++++++++++++++++++----
1 file changed, 36 insertions(+), 4 deletions(-)
diff --git a/ui/sdl2.c b/ui/sdl2.c
index 1ad74ba..bba8f4f 100644
--- a/ui/sdl2.c
+++ b/ui/sdl2.c
@@ -73,6 +73,12 @@ static SDL_Cursor *guest_sprite;
static int scaling_active;
static Notifier mouse_mode_notifier;
+#if defined(INPUT_NEEDS_ALTGR_FIX)
+/* win32 alt-gr handling */
+static bool l_ctrl_down = 0;
+static bool r_alt_down = 0;
+#endif
+
static void sdl_update_caption(struct sdl2_state *scon);
static struct sdl2_state *get_scon_from_window(uint32_t window_id)
@@ -252,11 +258,37 @@ static void sdl_process_key(struct sdl2_state *scon,
} else {
modifiers_state[ev->keysym.scancode] = 1;
}
- /* fall though */
- default:
- qemu_input_event_send_key_qcode(con, qcode,
- ev->type == SDL_KEYDOWN);
+ break;
+ }
+
+#if defined(INPUT_NEEDS_ALTGR_FIX)
+ /* Windows maps altgr key to l-ctrl + r-alt.
+ For proper handling in the guest, only r-alt is to be sent.
+ This is done by sending a fake "ctrl up" event when appropriate. */
+ switch (ev->keysym.scancode) {
+ case SDL_SCANCODE_LCTRL: /* l-ctrl */
+ if (!l_ctrl_down && r_alt_down) {
+ /* fake ctrl up already sent */
+ return;
+ }
+ l_ctrl_down = (ev->type == SDL_KEYDOWN);
+ break;
+ case SDL_SCANCODE_RALT: /* r-alt */
+ if (l_ctrl_down && !r_alt_down &&
+ ev->type == SDL_KEYDOWN) {
+ /* sending fake "ctrl up" event */
+ qemu_input_event_send_key_qcode(con,
+ sdl2_scancode_to_qcode[SDL_SCANCODE_LCTRL],
+ false);
+ l_ctrl_down = false;
+ }
+ r_alt_down = (ev->type == SDL_KEYDOWN);
+ break;
}
+#endif
+
+ qemu_input_event_send_key_qcode(con, qcode,
+ ev->type == SDL_KEYDOWN);
}
static void sdl_update_caption(struct sdl2_state *scon)
--
1.8.5.2.msysgit.0
prev parent reply other threads:[~2015-01-25 16:36 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-17 0:11 [Qemu-devel] alt-gr on Windows Thebault, Remi
2014-12-18 11:55 ` Kevin Wolf
2014-12-21 17:54 ` Thebault, Remi
2015-01-01 16:24 ` Andreas Färber
2015-01-01 19:10 ` Stefan Weil
2015-01-25 16:36 ` Thebault, Remi [this message]
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=BLU437-SMTP458BCCBC1E4ECEB68314DBF6340@phx.gbl \
--to=remi.thebault@outlook.com \
--cc=afaerber@suse.de \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=sw@weilnetz.de \
--cc=thardeck@suse.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 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).