From 1102b7a6e98745970796c885eb0217be4a352da4 Mon Sep 17 00:00:00 2001 From: Saveliy Tretiakov Date: Wed, 14 Feb 2007 13:00:38 +0000 Subject: [PATCH] Post WM_INPUTLANGCHANGE to thread's focus windows when keyboard layout is changed. svn path=/trunk/; revision=25798 --- .../testsets/user32/kbdlayout/kbdlayout.c | 9 ++++-- .../win32/win32k/ntuser/kbdlayout.c | 32 +++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c b/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c index 397901968ac..6e962785e7c 100644 --- a/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c +++ b/reactos/base/applications/testsets/user32/kbdlayout/kbdlayout.c @@ -240,7 +240,10 @@ LRESULT MainDialogProc(HWND hDlg, SubclassWnd(GetDlgItem(hDlg, IDC_EDIT2), L"Edit2"); SubclassWnd(GetDlgItem(hDlg, IDC_KLID), L"Klid"); SubclassWnd(GetDlgItem(hDlg, IDC_HANDLE), L"Handle"); - SubclassWnd(GetDlgItem(hDlg, ID_CANCEL), L"Button"); + SubclassWnd(GetDlgItem(hDlg, ID_CANCEL), L"CancelB"); + SubclassWnd(GetDlgItem(hDlg, IDC_ACTIVATE), L"ActivateB"); + SubclassWnd(GetDlgItem(hDlg, IDC_REFRESH), L"RefreshB"); + SubclassWnd(GetDlgItem(hDlg, IDC_UNLOAD), L"UnloadB"); CheckRadioButton(hDlg, IDC_FROMLIST, IDC_FROMEDIT, IDC_FROMLIST); SetWindowText(GetDlgItem(hDlg, IDC_KLID), L"00000419"); @@ -262,10 +265,12 @@ LRESULT MainDialogProc(HWND hDlg, { if((hKl = GetActivateHandle(hDlg)) != INVALID_HANDLE_VALUE) { - if(!ActivateKeyboardLayout(hKl, GetActivateFlags(hDlg))) + if(!(hKl = ActivateKeyboardLayout(hKl, GetActivateFlags(hDlg)))) FormatBox(hDlg, MB_ICONERROR, L"Error", L"ActivateKeyboardLayout() failed. %d", GetLastError()); else UpdateData(hDlg); + //FormatBox(hDlg, 0, L"Activated", L"Prev - %x, err - %d.", hKl, + // GetLastError()); } else MessageBox(hDlg, L"No item selected", L"Error", MB_ICONERROR); break; diff --git a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c index 52e5d9adbbc..ebde849adf8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c +++ b/reactos/subsystems/win32/win32k/ntuser/kbdlayout.c @@ -321,12 +321,22 @@ static PKBL UserHklToKbl(HKL hKl) static PKBL UserActivateKbl(PW32THREAD Thread, PKBL pKbl) { PKBL Prev; + MSG Msg; Prev = Thread->KeyboardLayout; Prev->RefCount--; Thread->KeyboardLayout = pKbl; pKbl->RefCount++; + // Post WM_INPUTLANGCHANGE to thread's focus window + + Msg.hwnd = Thread->MessageQueue->FocusWindow; + Msg.message = WM_INPUTLANGCHANGE; + Msg.wParam = 0; // Charset. FIXME: what is this? + Msg.lParam = (LPARAM)pKbl->hkl; // klid + + MsqPostMessage(Thread->MessageQueue, &Msg, FALSE, QS_POSTMESSAGE); + return Prev; } @@ -419,9 +429,9 @@ NtUserGetKeyboardLayoutName( _SEH_TRY { - ProbeForWrite(lpszName, 9*sizeof(WCHAR), 1); + ProbeForWrite(lpszName, KL_NAMELENGTH*sizeof(WCHAR), 1); pKbl = PsGetCurrentThreadWin32Thread()->KeyboardLayout; - RtlCopyMemory(lpszName, pKbl->Name, 9*sizeof(WCHAR)); + RtlCopyMemory(lpszName, pKbl->Name, KL_NAMELENGTH*sizeof(WCHAR)); ret = TRUE; } _SEH_HANDLE @@ -488,17 +498,27 @@ NtUserActivateKeyboardLayout( { PKBL pKbl; HKL Ret = NULL; + PW32THREAD pWThread; UserEnterExclusive(); pKbl = UserHklToKbl(hKl); + //FIXME: Respect flags! + if(pKbl) { - pKbl = UserActivateKbl(PsGetCurrentThreadWin32Thread(), pKbl); - Ret = pKbl->hkl; - - //FIXME: Respect flags! + pWThread = PsGetCurrentThreadWin32Thread(); + + if(pWThread->KeyboardLayout->hkl == hKl) + { + Ret = hKl; + } + else + { + pKbl = UserActivateKbl(pWThread, pKbl); + Ret = pKbl->hkl; + } } UserLeave();