Dmitry Timoshkov : user32: Make MapVirtualKeyEx(MAPVK_VK_TO_CHAR) behave more like in Windows.

Alexandre Julliard julliard at winehq.org
Wed Jan 23 14:36:46 CST 2008


Module: wine
Branch: master
Commit: e5e261f104b88cf703f359ff7ab9da6b88f334ac
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e5e261f104b88cf703f359ff7ab9da6b88f334ac

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Wed Jan 23 20:26:57 2008 +0800

user32: Make MapVirtualKeyEx(MAPVK_VK_TO_CHAR) behave more like in Windows.

---

 dlls/user32/input.c         |   13 ++++++++++++-
 dlls/winex11.drv/keyboard.c |   24 ++++++++++++------------
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 7796e96..354272b 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -622,7 +622,18 @@ UINT WINAPI MapVirtualKeyW(UINT code, UINT maptype)
  */
 UINT WINAPI MapVirtualKeyExA(UINT code, UINT maptype, HKL hkl)
 {
-    return MapVirtualKeyExW(code, maptype, hkl);
+    UINT ret;
+
+    ret = MapVirtualKeyExW( code, maptype, hkl );
+    if (maptype == MAPVK_VK_TO_CHAR)
+    {
+        BYTE ch = 0;
+        WCHAR wch = ret;
+
+        WideCharToMultiByte( CP_ACP, 0, &wch, 1, (LPSTR)&ch, 1, NULL, NULL );
+        ret = ch;
+    }
+    return ret;
 }
 
 /******************************************************************************
diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c
index b38dd34..5196d5e 100644
--- a/dlls/winex11.drv/keyboard.c
+++ b/dlls/winex11.drv/keyboard.c
@@ -2121,17 +2121,15 @@ UINT X11DRV_MapVirtualKeyEx(UINT wCode, UINT wMapType, HKL hkl)
 			/* let's do vkey -> keycode -> (XLookupString) ansi char */
 			XKeyEvent e;
 			KeySym keysym;
-			int keyc;
-			char s[2];
-			e.display = display;
+			int keyc, len;
+			char s[10];
 
-			e.state = LockMask;
-			/* LockMask should behave exactly like caps lock - upercase
-			 * the letter keys and that's about it. */
+			e.display = display;
+			e.state = 0;
+			e.keycode = 0;
 
                         wine_tsx11_lock();
 
-			e.keycode = 0;
 			/* We exit on the first keycode found, to speed up the thing. */
 			for (keyc=min_keycode; (keyc<=max_keycode) && (!e.keycode) ; keyc++)
 			{ /* Find a keycode that could have generated this virtual key */
@@ -2159,14 +2157,16 @@ UINT X11DRV_MapVirtualKeyEx(UINT wCode, UINT wMapType, HKL hkl)
 			}
 			TRACE("Found keycode %d (0x%2X)\n",e.keycode,e.keycode);
 
-			if (XLookupString(&e, s, 2, &keysym, NULL))
+                        len = XLookupString(&e, s, sizeof(s), &keysym, NULL);
+                        wine_tsx11_unlock();
+
+                        if (len)
                         {
-                            wine_tsx11_unlock();
-                            returnMVK (*s);
+                            WCHAR wch;
+                            if (MultiByteToWideChar(CP_UNIXCP, 0, s, len, &wch, 1))
+                                returnMVK(toupperW(wch));
                         }
-
 			TRACE("returning no ANSI.\n");
-                        wine_tsx11_unlock();
 			return 0;
 		}
 		default: /* reserved */




More information about the wine-cvs mailing list