NtUserLoadKeyboardLayoutEx: Support KLF_REORDER and KLF_ACTIVATE.

NtUserActivateKeyboardLayout: Support HKL_NEXT, HKL_PREV, KLF_REORDER.


svn path=/trunk/; revision=25879
This commit is contained in:
Saveliy Tretiakov 2007-02-22 19:41:10 +00:00
parent 06b4e06c8a
commit da13fb5a41

View file

@ -328,7 +328,7 @@ static PKBL UserActivateKbl(PW32THREAD Thread, PKBL pKbl)
Thread->KeyboardLayout = pKbl; Thread->KeyboardLayout = pKbl;
pKbl->RefCount++; pKbl->RefCount++;
// Post WM_INPUTLANGCHANGE to thread's focus window // Send WM_INPUTLANGCHANGE to thread's focus window
Msg.hwnd = Thread->MessageQueue->FocusWindow; Msg.hwnd = Thread->MessageQueue->FocusWindow;
Msg.message = WM_INPUTLANGCHANGE; Msg.message = WM_INPUTLANGCHANGE;
@ -457,33 +457,46 @@ NtUserLoadKeyboardLayoutEx(
IN DWORD Unused4) IN DWORD Unused4)
{ {
HKL Ret = NULL; HKL Ret = NULL;
PKBL pKbl; PKBL pKbl = NULL, Cur;
UserEnterExclusive(); UserEnterExclusive();
pKbl = KBLList; Cur = KBLList;
do do
{ {
if(pKbl->klid == dwKLID) if(Cur->klid == dwKLID)
{
pKbl = Cur;
break;
}
Cur = (PKBL) Cur->List.Flink;
} while(Cur != KBLList);
if(!pKbl)
{
pKbl = UserLoadDllAndCreateKbl(dwKLID);
if(!pKbl)
{ {
Ret = pKbl->hkl;
goto the_end; goto the_end;
} }
pKbl = (PKBL) pKbl->List.Flink; InsertTailList(&KBLList->List, &pKbl->List);
} while(pKbl != KBLList);
pKbl = UserLoadDllAndCreateKbl(dwKLID);
if(!pKbl)
{
goto the_end;
} }
InsertTailList(&KBLList->List, &pKbl->List); if(Flags & KLF_REORDER) KBLList = pKbl;
if(Flags & KLF_ACTIVATE)
{
UserActivateKbl(PsGetCurrentThreadWin32Thread(), pKbl);
}
Ret = pKbl->hkl; Ret = pKbl->hkl;
//FIXME: Respect Flags! //FIXME: Respect Flags!
// KLF_NOTELLSHELL KLF_SETFORPROCESS
// KLF_REPLACELANG KLF_SUBSTITUTE_OK
the_end: the_end:
UserLeave(); UserLeave();
@ -502,17 +515,35 @@ NtUserActivateKeyboardLayout(
UserEnterExclusive(); UserEnterExclusive();
pKbl = UserHklToKbl(hKl); pWThread = PsGetCurrentThreadWin32Thread();
//FIXME: Respect flags! if(pWThread->KeyboardLayout->hkl == hKl)
{
Ret = hKl;
goto the_end;
}
if(hKl == (HKL)HKL_NEXT)
{
pKbl = (PKBL)pWThread->KeyboardLayout->List.Flink;
}
else if(hKl == (HKL)HKL_PREV)
{
pKbl = (PKBL)pWThread->KeyboardLayout->List.Blink;
}
else pKbl = UserHklToKbl(hKl);
//FIXME: KLF_RESET, KLF_SHIFTLOCK
//FIXME: KLF_SETFORPROCESS
if(pKbl) if(pKbl)
{ {
pWThread = PsGetCurrentThreadWin32Thread(); if(Flags & KLF_REORDER)
KBLList = pKbl;
if(pWThread->KeyboardLayout->hkl == hKl) if(pKbl == pWThread->KeyboardLayout)
{ {
Ret = hKl; Ret = pKbl->hkl;
} }
else else
{ {
@ -521,6 +552,7 @@ NtUserActivateKeyboardLayout(
} }
} }
the_end:
UserLeave(); UserLeave();
return Ret; return Ret;
} }