diff options
author | Mattias Grönlund <mattias@gronlund.se> | 2013-05-15 11:30:02 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2013-05-15 11:33:12 +0200 |
commit | 6e180217428ffd6e8c0f835fb9c97e6e49998630 (patch) | |
tree | e6101a67ff58982d59aebc6c700fd37d6caee269 | |
parent | d1a1df640c9b9fea5390996c6d2069cc6710dcf0 (diff) |
mingw: Fix non-working AltGr with some layouts
Running virt-viewer-x64-0.5.6.msi, on Windows 7, connecting to QEMU using
spice, AltGR key combinations fails (using Swedish keyboard layout both at
server and client).
I suspect that this is a variant of
https://bugzilla.redhat.com/show_bug.cgi?id=904092.
After some debugging, I realized that there is an extra VK_LCONTROL
keypress sent by Windows. This extra VK_LCONTROL will then make the key
e.g. AltGr-< actually be Control-AltGr-<, which is not interpreted as a |
sign.
So in spice-widget.c : keyboard_hook_cb(), I added SPICE_DEBUG lines which
printed out the hooked->scanCode, and realized that this extra VK_LCONTROL
has a very suspect scanCode with bit 9 set. If I instead press the left
Ctrl key, it will also emit VK_LCONTROL, but with bit 9 cleared.
So I just made sure that keyboard_hook_cb(), silently dropped these strange
VK_LCONTROL events, which seems to work for me.
-rw-r--r-- | gtk/spice-widget.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c index 7eb9e64..4f74380 100644 --- a/gtk/spice-widget.c +++ b/gtk/spice-widget.c @@ -672,11 +672,17 @@ static LRESULT CALLBACK keyboard_hook_cb(int code, WPARAM wparam, LPARAM lparam) case VK_NUMLOCK: case VK_LSHIFT: case VK_RSHIFT: - case VK_LCONTROL: case VK_RCONTROL: case VK_LMENU: 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: SendMessage(win32_window, wparam, hooked->vkCode, dwmsg); return 1; |