mirror of
https://github.com/reactos/reactos.git
synced 2024-09-29 14:09:10 +00:00
[NTUSER] Empower co_UserActivateKeyboardLayout (#4608)
- Add code to co_UserActivateKeyboardLayout function for IME. - Add IntImmActivateLayout helper function. CORE-11700
This commit is contained in:
parent
86bde3c76a
commit
e44e151840
|
@ -10,6 +10,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <win32k.h>
|
#include <win32k.h>
|
||||||
|
#include <ddk/immdev.h>
|
||||||
|
|
||||||
// Was included only because of CP_ACP and required the
|
// Was included only because of CP_ACP and required the
|
||||||
// definition of SYSTEMTIME in ndk\rtltypes.h
|
// definition of SYSTEMTIME in ndk\rtltypes.h
|
||||||
|
@ -607,6 +608,31 @@ co_UserActivateKbl(PTHREADINFO pti, PKL pKl, UINT Flags)
|
||||||
return pklPrev;
|
return pklPrev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Win: xxxImmActivateLayout
|
||||||
|
VOID APIENTRY
|
||||||
|
IntImmActivateLayout(
|
||||||
|
_Inout_ PTHREADINFO pti,
|
||||||
|
_Inout_ PKL pKL)
|
||||||
|
{
|
||||||
|
PWND pImeWnd;
|
||||||
|
HWND hImeWnd;
|
||||||
|
USER_REFERENCE_ENTRY Ref;
|
||||||
|
|
||||||
|
if (pti->KeyboardLayout == pKL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pImeWnd = pti->spwndDefaultIme;
|
||||||
|
if (pImeWnd)
|
||||||
|
{
|
||||||
|
UserRefObjectCo(pImeWnd, &Ref);
|
||||||
|
hImeWnd = UserHMGetHandle(pImeWnd);
|
||||||
|
co_IntSendMessage(hImeWnd, WM_IME_SYSTEM, IMS_ACTIVATELAYOUT, (LPARAM)pKL->hkl);
|
||||||
|
UserDerefObjectCo(pImeWnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
UserAssignmentLock((PVOID*)&pti->KeyboardLayout, pKL);
|
||||||
|
}
|
||||||
|
|
||||||
/* Win: xxxInternalActivateKeyboardLayout */
|
/* Win: xxxInternalActivateKeyboardLayout */
|
||||||
HKL APIENTRY
|
HKL APIENTRY
|
||||||
co_UserActivateKeyboardLayout(
|
co_UserActivateKeyboardLayout(
|
||||||
|
@ -614,23 +640,104 @@ co_UserActivateKeyboardLayout(
|
||||||
_In_ ULONG uFlags,
|
_In_ ULONG uFlags,
|
||||||
_Inout_ PWND pWnd)
|
_Inout_ PWND pWnd)
|
||||||
{
|
{
|
||||||
HKL hKL = pKL->hkl;
|
HKL hOldKL = NULL;
|
||||||
PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
|
PKL pOldKL = NULL;
|
||||||
|
PTHREADINFO pti = GetW32ThreadInfo();
|
||||||
|
PWND pTargetWnd, pImeWnd;
|
||||||
|
HWND hTargetWnd, hImeWnd;
|
||||||
|
USER_REFERENCE_ENTRY Ref1, Ref2;
|
||||||
|
PCLIENTINFO ClientInfo = pti->pClientInfo;
|
||||||
|
|
||||||
if (pKL != pti->KeyboardLayout)
|
if (pti->KeyboardLayout)
|
||||||
{
|
{
|
||||||
/* Activate layout for current thread */
|
pOldKL = pti->KeyboardLayout;
|
||||||
co_UserActivateKbl(pti, pKL, uFlags);
|
if (pOldKL)
|
||||||
|
hOldKL = pOldKL->hkl;
|
||||||
/* Send shell message */
|
|
||||||
if (!(uFlags & KLF_NOTELLSHELL))
|
|
||||||
co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)hKL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: KLF_RESET
|
if (uFlags & KLF_RESET)
|
||||||
KLF_SHIFTLOCK */
|
{
|
||||||
|
/* FIXME */
|
||||||
|
}
|
||||||
|
|
||||||
return hKL;
|
if (!(uFlags & KLF_SETFORPROCESS) && pKL == pti->KeyboardLayout)
|
||||||
|
return hOldKL;
|
||||||
|
|
||||||
|
pKL->wchDiacritic = 0;
|
||||||
|
|
||||||
|
if (pOldKL)
|
||||||
|
UserRefObjectCo(pOldKL, &Ref1);
|
||||||
|
|
||||||
|
if (pti->TIF_flags & TIF_CSRSSTHREAD)
|
||||||
|
{
|
||||||
|
UserAssignmentLock((PVOID*)&pti->KeyboardLayout, pKL);
|
||||||
|
ClientInfo->CodePage = pKL->CodePage;
|
||||||
|
}
|
||||||
|
else if (uFlags & KLF_SETFORPROCESS)
|
||||||
|
{
|
||||||
|
/* FIXME */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (IS_IMM_MODE())
|
||||||
|
IntImmActivateLayout(pti, pKL);
|
||||||
|
else
|
||||||
|
UserAssignmentLock((PVOID*)&pti->KeyboardLayout, pKL);
|
||||||
|
|
||||||
|
if (!(pti->TIF_flags & TIF_INCLEANUP))
|
||||||
|
{
|
||||||
|
ClientInfo->CodePage = pKL->CodePage;
|
||||||
|
ClientInfo->hKL = pKL->hkl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gptiForeground && (gptiForeground->ppi == pti->ppi))
|
||||||
|
{
|
||||||
|
/* Send shell message */
|
||||||
|
co_IntShellHookNotify(HSHELL_LANGUAGE, 0, (LPARAM)pKL->hkl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pti->MessageQueue)
|
||||||
|
{
|
||||||
|
/* Determine the target window */
|
||||||
|
pTargetWnd = pti->MessageQueue->spwndFocus;
|
||||||
|
if (!pTargetWnd)
|
||||||
|
{
|
||||||
|
pTargetWnd = pti->MessageQueue->spwndActive;
|
||||||
|
if (!pTargetWnd)
|
||||||
|
pTargetWnd = pWnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send WM_INPUTLANGCHANGE message */
|
||||||
|
if (pTargetWnd)
|
||||||
|
{
|
||||||
|
UserRefObjectCo(pTargetWnd, &Ref2);
|
||||||
|
hTargetWnd = UserHMGetHandle(pTargetWnd);
|
||||||
|
co_IntSendMessage(hTargetWnd, WM_INPUTLANGCHANGE, pKL->iBaseCharset, (LPARAM)pKL->hkl);
|
||||||
|
UserDerefObjectCo(pTargetWnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Send WM_IME_SYSTEM:IMS_SENDNOTIFICATION message if necessary */
|
||||||
|
if (pti && !(pti->TIF_flags & TIF_CSRSSTHREAD))
|
||||||
|
{
|
||||||
|
if (IS_IME_HKL(pKL->hkl) || (gpsi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
|
||||||
|
{
|
||||||
|
pImeWnd = pti->spwndDefaultIme;
|
||||||
|
if (pImeWnd)
|
||||||
|
{
|
||||||
|
UserRefObjectCo(pImeWnd, &Ref2);
|
||||||
|
BOOL bProcess = !!(pti->TIF_flags & KLF_SETFORPROCESS);
|
||||||
|
hImeWnd = UserHMGetHandle(pImeWnd);
|
||||||
|
co_IntSendMessage(hImeWnd, WM_IME_SYSTEM, IMS_SENDNOTIFICATION, bProcess);
|
||||||
|
UserDerefObjectCo(pImeWnd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pOldKL)
|
||||||
|
UserDerefObjectCo(pOldKL);
|
||||||
|
return hOldKL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Win: ReorderKeyboardLayouts
|
// Win: ReorderKeyboardLayouts
|
||||||
|
|
Loading…
Reference in a new issue