user32: Make MapVirtualKeyEx(MAPVK_VK_TO_CHAR) behave more like in Windows
Dmitry Timoshkov
dmitry at codeweavers.com
Wed Jan 23 06:26:57 CST 2008
Hello,
this patch fixes the problem reported in the bug 8683.
Changelog:
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 */
--
1.5.3.8
More information about the wine-patches
mailing list