Module: wine Branch: master Commit: e5e261f104b88cf703f359ff7ab9da6b88f334ac URL: http://source.winehq.org/git/wine.git/?a=commit;h=e5e261f104b88cf703f359ff7a...
Author: Dmitry Timoshkov dmitry@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 */