Vitaliy Margolen : winex11: Fix MapVirtualKeyEx to properly map left-right modifier keys.
Alexandre Julliard
julliard at winehq.org
Mon Apr 28 08:01:11 CDT 2008
Module: wine
Branch: master
Commit: 09c6bf415ff2f0927cc186c5d8a89a6d62d6f224
URL: http://source.winehq.org/git/wine.git/?a=commit;h=09c6bf415ff2f0927cc186c5d8a89a6d62d6f224
Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date: Sat Apr 26 17:35:50 2008 -0600
winex11: Fix MapVirtualKeyEx to properly map left-right modifier keys.
---
dlls/user32/tests/input.c | 22 +++++++++++
dlls/winex11.drv/keyboard.c | 83 ++++++++++++++++++++++++++++++-------------
2 files changed, 80 insertions(+), 25 deletions(-)
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index a4e09a3..dd597d8 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -1111,6 +1111,27 @@ static void test_GetMouseMovePointsEx(void)
#undef MYERROR
}
+static void test_key_map(void)
+{
+ HKL kl = GetKeyboardLayout(0);
+ UINT kL, kR, s, sL;
+
+ s = MapVirtualKeyEx(VK_SHIFT, MAPVK_VK_TO_VSC, kl);
+ ok(s != 0, "MapVirtualKeyEx(VK_SHIFT) should return non-zero\n");
+ sL = MapVirtualKeyEx(VK_LSHIFT, MAPVK_VK_TO_VSC, kl);
+ ok(s == sL, "%x != %x\n", s, sL);
+
+ kL = MapVirtualKeyEx(0x2a, MAPVK_VSC_TO_VK, kl);
+ ok(kL == VK_SHIFT, "Scan code -> vKey = %x (not VK_SHIFT)\n", kL);
+ kR = MapVirtualKeyEx(0x36, MAPVK_VSC_TO_VK, kl);
+ ok(kR == VK_SHIFT, "Scan code -> vKey = %x (not VK_SHIFT)\n", kR);
+
+ kL = MapVirtualKeyEx(0x2a, MAPVK_VSC_TO_VK_EX, kl);
+ ok(kL == VK_LSHIFT, "Scan code -> vKey = %x (not VK_LSHIFT)\n", kL);
+ kR = MapVirtualKeyEx(0x36, MAPVK_VSC_TO_VK_EX, kl);
+ ok(kR == VK_RSHIFT, "Scan code -> vKey = %x (not VK_RSHIFT)\n", kR);
+}
+
START_TEST(input)
{
init_function_pointers();
@@ -1123,6 +1144,7 @@ START_TEST(input)
test_Input_blackbox();
test_keynames();
test_mouse_ll_hook();
+ test_key_map();
if(pGetMouseMovePointsEx)
test_GetMouseMovePointsEx();
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index 917cc2e..981e4df 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -2053,31 +2053,64 @@ UINT X11DRV_MapVirtualKeyEx(UINT wCode, UINT wMapType, HKL hkl)
if (hkl != X11DRV_GetKeyboardLayout(0))
FIXME("keyboard layout %p is not supported\n", hkl);
- switch(wMapType) {
- case MAPVK_VK_TO_VSC: /* vkey-code to scan-code */
- case MAPVK_VK_TO_VSC_EX: /* FIXME: should differentiate between
- left and right keys */
- {
- /* let's do vkey -> keycode -> scan */
- int keyc;
- for (keyc=min_keycode; keyc<=max_keycode; keyc++)
- if ((keyc2vkey[keyc] & 0xFF) == wCode)
- returnMVK (keyc2scan[keyc] & 0xFF);
- TRACE("returning no scan-code.\n");
- return 0;
- }
- case MAPVK_VSC_TO_VK: /* scan-code to vkey-code */
- case MAPVK_VSC_TO_VK_EX: /* FIXME: should differentiate between
- left and right keys */
- {
- /* let's do scan -> keycode -> vkey */
- int keyc;
- for (keyc=min_keycode; keyc<=max_keycode; keyc++)
- if ((keyc2scan[keyc] & 0xFF) == (wCode & 0xFF))
- returnMVK (keyc2vkey[keyc] & 0xFF);
- TRACE("returning no vkey-code.\n");
- return 0;
- }
+ switch(wMapType)
+ {
+ case MAPVK_VK_TO_VSC: /* vkey-code to scan-code */
+ case MAPVK_VK_TO_VSC_EX:
+ {
+ int keyc;
+
+ switch (wCode)
+ {
+ case VK_SHIFT: wCode = VK_LSHIFT; break;
+ case VK_CONTROL: wCode = VK_LCONTROL; break;
+ case VK_MENU: wCode = VK_LMENU; break;
+ }
+
+ /* let's do vkey -> keycode -> scan */
+ for (keyc = min_keycode; keyc <= max_keycode; keyc++)
+ if ((keyc2vkey[keyc] & 0xFF) == wCode) break;
+
+ if (keyc > max_keycode)
+ {
+ TRACE("returning no scan-code.\n");
+ return 0;
+ }
+ returnMVK (keyc2scan[keyc] & 0xFF);
+ }
+ case MAPVK_VSC_TO_VK: /* scan-code to vkey-code */
+ case MAPVK_VSC_TO_VK_EX:
+ {
+ int keyc;
+ UINT vkey;
+
+ /* let's do scan -> keycode -> vkey */
+ for (keyc = min_keycode; keyc <= max_keycode; keyc++)
+ if ((keyc2scan[keyc] & 0xFF) == (wCode & 0xFF)) break;
+
+ if (keyc > max_keycode)
+ {
+ TRACE("returning no vkey-code.\n");
+ return 0;
+ }
+
+ vkey = keyc2vkey[keyc] & 0xFF;
+ if (wMapType == MAPVK_VSC_TO_VK)
+ switch (vkey)
+ {
+ case VK_LSHIFT:
+ case VK_RSHIFT:
+ vkey = VK_SHIFT; break;
+ case VK_LCONTROL:
+ case VK_RCONTROL:
+ vkey = VK_CONTROL; break;
+ case VK_LMENU:
+ case VK_RMENU:
+ vkey = VK_MENU; break;
+ }
+
+ returnMVK (vkey);
+ }
case MAPVK_VK_TO_CHAR: /* vkey-code to unshifted ANSI code */
{
/* we still don't know what "unshifted" means. in windows VK_W (0x57)
More information about the wine-cvs
mailing list