mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 04:13:34 +00:00
Post WM_INPUTLANGCHANGE to thread's focus windows when keyboard layout is changed.
svn path=/trunk/; revision=25798
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user