From 4db9f2ba75253e67af5781b142efccc8b9be662c Mon Sep 17 00:00:00 2001 From: Saveliy Tretiakov Date: Tue, 13 Feb 2007 19:50:06 +0000 Subject: [PATCH] - Make NtUserLoadKeyboardLayoutEx accept 6 params - Always get default locale from ntoskrnl - Fix some small bugs svn path=/trunk/; revision=25797 --- .../testsets/user32/kbdlayout/kbdlayout.c | 1 + reactos/config.template.rbuild | 2 + reactos/dll/win32/user32/windows/input.c | 4 +- reactos/include/reactos/win32k/ntuser.h | 12 ++- .../subsystems/win32/win32k/include/input.h | 2 +- .../win32/win32k/ntuser/kbdlayout.c | 75 ++++++++++++++----- reactos/tools/nci/w32ksvc.db | 2 +- 7 files changed, 73 insertions(+), 25 deletions(-) diff --git a/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c b/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c index 4c3239467d3..397901968ac 100644 --- a/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c +++ b/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c @@ -332,6 +332,7 @@ LRESULT MainDialogProc(HWND hDlg, case WM_INPUTLANGCHANGEREQUEST: { FormatMsg(L"dlg WM_INPUTLANGCHANGEREQUEST lParam=%x wParam=%x\n", lParam, wParam); + UpdateData(hDlg); return FALSE; } diff --git a/reactos/config.template.rbuild b/reactos/config.template.rbuild index 0abcbdb9cac..303f842bdc1 100644 --- a/reactos/config.template.rbuild +++ b/reactos/config.template.rbuild @@ -49,6 +49,8 @@ 5 = gcc -O3 with -mpreferred-stack-boundary=2 --> + + diff --git a/reactos/dll/win32/user32/windows/input.c b/reactos/dll/win32/user32/windows/input.c index eeffeac27ef..b691e198b77 100644 --- a/reactos/dll/win32/user32/windows/input.c +++ b/reactos/dll/win32/user32/windows/input.c @@ -300,7 +300,7 @@ LoadKeyboardLayoutA(LPCSTR pwszKLID, { return NtUserLoadKeyboardLayoutEx( strtoul(pwszKLID, NULL, 16), - Flags); + Flags, 0, 0, 0, 0); } @@ -315,7 +315,7 @@ LoadKeyboardLayoutW(LPCWSTR pwszKLID, // We will do things our own way. return NtUserLoadKeyboardLayoutEx( wcstoul(pwszKLID, NULL, 16), - Flags); + Flags, 0, 0, 0, 0); } diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 14c848f3bc8..17e964e339f 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -1217,10 +1217,14 @@ NtUserKillTimer ); HKL -NTAPI -NtUserLoadKeyboardLayoutEx( - LCID LocaleId, - UINT Flags); +STDCALL +NtUserLoadKeyboardLayoutEx( + IN DWORD dwKLID, + IN UINT Flags, + IN DWORD Unused1, + IN DWORD Unused2, + IN DWORD Unused3, + IN DWORD Unused4); BOOL NTAPI diff --git a/reactos/subsystems/win32/win32k/include/input.h b/reactos/subsystems/win32/win32k/include/input.h index a97e4b8b352..9661532c7f8 100644 --- a/reactos/subsystems/win32/win32k/include/input.h +++ b/reactos/subsystems/win32/win32k/include/input.h @@ -12,7 +12,7 @@ typedef struct _KBL HANDLE hModule; ULONG RefCount; HKL hkl; - LCID lcid; + DWORD klid; // Low word - language id. High word - device id. } KBL, *PKBL; #define KBL_UNLOADED 0x20000000 diff --git a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c index 4f139546d3d..52e5d9adbbc 100644 --- a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c +++ b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c @@ -17,7 +17,6 @@ #include PKBL KBLList = NULL; // Keyboard layout list. -PKBL DefaultKL = NULL; typedef PVOID (*KbdLayerDescriptor)(VOID); NTSTATUS STDCALL LdrGetProcedureAddress(PVOID module, @@ -193,13 +192,13 @@ static BOOL UserLoadKbdDll(WCHAR *wsKLID, return TRUE; } -static PKBL UserLoadDllAndCreateKbl(LCID LocaleId) +static PKBL UserLoadDllAndCreateKbl(DWORD LocaleId) { PKBL NewKbl; ULONG hKl; LANGID langid; - NewKbl = ExAllocatePool(PagedPool, sizeof(NewKbl)); + NewKbl = ExAllocatePool(PagedPool, sizeof(KBL)); if(!NewKbl) { @@ -229,7 +228,7 @@ static PKBL UserLoadDllAndCreateKbl(LCID LocaleId) else hKl |= hKl << 16; NewKbl->hkl = (HKL) hKl; - NewKbl->lcid = LocaleId; + NewKbl->klid = LocaleId; NewKbl->Flags = 0; NewKbl->RefCount = 0; @@ -238,7 +237,6 @@ static PKBL UserLoadDllAndCreateKbl(LCID LocaleId) BOOL UserInitDefaultKeyboardLayout() { - LCID LocaleId; NTSTATUS Status; @@ -252,27 +250,60 @@ BOOL UserInitDefaultKeyboardLayout() DPRINT("DefaultLocale = %08lx\n", LocaleId); } - if(!NT_SUCCESS(Status) || !(DefaultKL = UserLoadDllAndCreateKbl(LocaleId))) + if(!NT_SUCCESS(Status) || !(KBLList = UserLoadDllAndCreateKbl(LocaleId))) { DPRINT1("Trying to load US Keyboard Layout.\n"); LocaleId = 0x409; - if(!(DefaultKL = UserLoadDllAndCreateKbl(LocaleId))) + if(!(KBLList = UserLoadDllAndCreateKbl(LocaleId))) { DPRINT1("Failed to load any Keyboard Layout\n"); return FALSE; } } - InitializeListHead(&DefaultKL->List); - KBLList = DefaultKL; + InitializeListHead(&KBLList->List); return TRUE; } - PKBL W32kGetDefaultKeyLayout(VOID) { - return DefaultKL; + LCID LocaleId; + NTSTATUS Status; + PKBL pKbl; + + // This is probably wrong... + // I need to do more research. + Status = ZwQueryDefaultLocale(FALSE, &LocaleId); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Could not get default locale (%08lx).\n", Status); + DPRINT1("Assuming default locale = 0x409 (US).\n"); + LocaleId = 0x409; + } + + pKbl = KBLList; + do + { + if(pKbl->klid == LocaleId) + { + return pKbl; + } + + pKbl = (PKBL) pKbl->List.Flink; + } while(pKbl != KBLList); + + DPRINT("Loading new default keyboard layout.\n"); + pKbl = UserLoadDllAndCreateKbl(LocaleId); + + if(!pKbl) + { + DPRINT1("Failed to load %x!!! Returning any availableKL.\n", LocaleId); + return KBLList; + } + + InsertTailList(&KBLList->List, &pKbl->List); + return pKbl; } static PKBL UserHklToKbl(HKL hKl) @@ -299,6 +330,8 @@ static PKBL UserActivateKbl(PW32THREAD Thread, PKBL pKbl) return Prev; } +/* EXPORTS *******************************************************************/ + HKL FASTCALL UserGetKeyboardLayout( DWORD dwThreadId) @@ -327,8 +360,6 @@ UserGetKeyboardLayout( return Ret; } -/* EXPORTS *******************************************************************/ - UINT STDCALL NtUserGetKeyboardLayoutList( @@ -408,8 +439,12 @@ NtUserGetKeyboardLayoutName( HKL STDCALL NtUserLoadKeyboardLayoutEx( - IN LCID LocaleId, - IN UINT Flags) + IN DWORD dwKLID, + IN UINT Flags, + IN DWORD Unused1, + IN DWORD Unused2, + IN DWORD Unused3, + IN DWORD Unused4) { HKL Ret = NULL; PKBL pKbl; @@ -419,7 +454,7 @@ NtUserLoadKeyboardLayoutEx( pKbl = KBLList; do { - if(pKbl->lcid == LocaleId) + if(pKbl->klid == dwKLID) { Ret = pKbl->hkl; goto the_end; @@ -428,7 +463,13 @@ NtUserLoadKeyboardLayoutEx( pKbl = (PKBL) pKbl->List.Flink; } while(pKbl != KBLList); - pKbl = UserLoadDllAndCreateKbl(LocaleId); + pKbl = UserLoadDllAndCreateKbl(dwKLID); + + if(!pKbl) + { + goto the_end; + } + InsertTailList(&KBLList->List, &pKbl->List); Ret = pKbl->hkl; diff --git a/reactos/tools/nci/w32ksvc.db b/reactos/tools/nci/w32ksvc.db index dacd1ba1418..958d72d4738 100644 --- a/reactos/tools/nci/w32ksvc.db +++ b/reactos/tools/nci/w32ksvc.db @@ -428,7 +428,7 @@ NtUserInternalGetWindowText 3 NtUserIsClipboardFormatAvailable 1 NtUserKillSystemTimer 2 NtUserKillTimer 2 -NtUserLoadKeyboardLayoutEx 2 +NtUserLoadKeyboardLayoutEx 6 NtUserLockWindowStation 1 NtUserLockWindowUpdate 1 NtUserLockWorkStation 0