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