Author: jimtabor Date: Fri May 22 05:35:48 2009 New Revision: 41040
URL: http://svn.reactos.org/svn/reactos?rev=41040&view=rev Log: - Fix NtUserVkKeyScanEx to support current thread keyboard layout or use the one provided by handle. See bug report 4269 and the related bug report 4272.
Modified: trunk/reactos/dll/win32/user32/windows/input.c trunk/reactos/include/reactos/win32k/ntuser.h trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c
Modified: trunk/reactos/dll/win32/user32/windows/input.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/in... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/input.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/windows/input.c [iso-8859-1] Fri May 22 05:35:48 2009 @@ -492,7 +492,7 @@ VkKeyScanExW(WCHAR ch, HKL dwhkl) { - return (SHORT) NtUserVkKeyScanEx(ch, dwhkl, 0); + return (SHORT) NtUserVkKeyScanEx(ch, dwhkl, TRUE); }
@@ -502,7 +502,7 @@ SHORT WINAPI VkKeyScanW(WCHAR ch) { - return VkKeyScanExW(ch, GetKeyboardLayout(0)); + return (SHORT) NtUserVkKeyScanEx(ch, 0, FALSE); }
Modified: trunk/reactos/include/reactos/win32k/ntuser.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntus... ============================================================================== --- trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] (original) +++ trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] Fri May 22 05:35:48 2009 @@ -2697,7 +2697,7 @@ NtUserVkKeyScanEx( WCHAR wChar, HKL KeyboardLayout, - DWORD Unknown2); + BOOL bUsehHK);
DWORD NTAPI
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/keyboard.c [iso-8859-1] Fri May 22 05:35:48 2009 @@ -1000,22 +1000,31 @@ APIENTRY NtUserVkKeyScanEx( WCHAR wChar, - HKL KeyboardLayout, - DWORD Unknown2) -{ -/* FIXME: currently, this routine doesnt seem to need any locking */ + HKL hKeyboardLayout, + BOOL UsehKL ) // TRUE from KeyboardLayout, FALSE from pkbl = (THREADINFO)->KeyboardLayout +{ PKBDTABLES KeyLayout; PVK_TO_WCHAR_TABLE vtwTbl; PVK_TO_WCHARS10 vkPtr; size_t size_this_entry; int nMod; - DWORD CapsMod = 0, CapsState = 0; - - DPRINT("NtUserVkKeyScanEx() wChar %d, KbdLayout 0x%p\n", wChar, KeyboardLayout); - - if(!KeyboardLayout) - return -1; - KeyLayout = UserHklToKbl(KeyboardLayout)->KBTables; + PKBL pkbl = NULL; + DWORD CapsMod = 0, CapsState = 0, Ret = -1; + + DPRINT("NtUserVkKeyScanEx() wChar %d, KbdLayout 0x%p\n", wChar, hKeyboardLayout); + UserEnterShared(); + + if (UsehKL) + { + if ( !hKeyboardLayout || !(pkbl = UserHklToKbl(hKeyboardLayout))) + goto Exit; + } + else // From VkKeyScanAW it is FALSE so KeyboardLayout is white noise. + { + pkbl = ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->KeyboardLayout; + } + + KeyLayout = pkbl->KBTables;
for (nMod = 0; KeyLayout->pVkToWcharTable[nMod].nModifications; nMod++) { @@ -1038,13 +1047,16 @@ CapsMod = KeyLayout->pCharModifiers->ModNumber[CapsState]; DPRINT("nMod %d wC %04x: CapsMod %08x CapsState %08x MaxModBits %08x\n", nMod, wChar, CapsMod, CapsState, KeyLayout->pCharModifiers->wMaxModBits); - return ((CapsMod << 8)|(vkPtr->VirtualKey & 0xff)); + Ret = ((CapsMod << 8)|(vkPtr->VirtualKey & 0xff)); + goto Exit; } } vkPtr = (PVK_TO_WCHARS10)(((BYTE *)vkPtr) + size_this_entry); } } - return -1; +Exit: + UserLeave(); + return Ret; }