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