[NTUSER] Rewrite NtUserDestroyInputContext (#4342)

CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-02-07 10:45:02 +09:00 committed by GitHub
parent 914f14a8b9
commit 1bc9dda5e6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -27,6 +27,13 @@ PWND FASTCALL IntGetTopLevelWindow(PWND pwnd)
return pwnd; return pwnd;
} }
HIMC FASTCALL IntAssociateInputContext(PWND pWnd, PIMC pImc)
{
HIMC hOldImc = pWnd->hImc;
pWnd->hImc = (pImc ? UserHMGetHandle(pImc) : NULL);
return hOldImc;
}
DWORD DWORD
APIENTRY APIENTRY
NtUserSetThreadLayoutHandles(HKL hNewKL, HKL hOldKL) NtUserSetThreadLayoutHandles(HKL hNewKL, HKL hOldKL)
@ -612,20 +619,49 @@ BOOL APIENTRY NtUserDestroyInputContext(HIMC hIMC)
{ {
PIMC pIMC; PIMC pIMC;
BOOL ret = FALSE; BOOL ret = FALSE;
HWND *phwnd;
PWND pWnd;
PWINDOWLIST pwl;
PTHREADINFO pti;
UserEnterExclusive(); UserEnterExclusive();
if (!(gpsi->dwSRVIFlags & SRVINFO_IMM32)) if (!IS_IMM_MODE())
{ {
EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED); EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
UserLeave(); goto Quit;
return FALSE;
} }
pIMC = UserGetObject(gHandleTable, hIMC, TYPE_INPUTCONTEXT); pIMC = UserGetObjectNoErr(gHandleTable, hIMC, TYPE_INPUTCONTEXT);
if (pIMC) if (!pIMC)
ret = UserDereferenceObject(pIMC); goto Quit;
pti = pIMC->head.pti;
if (pti != GetW32ThreadInfo() || pIMC == pti->spDefaultImc)
goto Quit;
UserMarkObjectDestroy(pIMC);
pwl = IntBuildHwndList(pti->rpdesk->pDeskInfo->spwnd->spwndChild,
IACE_CHILDREN | IACE_LIST, pti);
if (pwl)
{
for (phwnd = pwl->ahwnd; *phwnd != HWND_TERMINATOR; ++phwnd)
{
pWnd = ValidateHwndNoErr(*phwnd);
if (!pWnd)
continue;
if (pWnd->hImc == hIMC)
IntAssociateInputContext(pWnd, pti->spDefaultImc);
}
IntFreeHwndList(pwl);
}
ret = UserDeleteObject(hIMC, TYPE_INPUTCONTEXT);
Quit:
UserLeave(); UserLeave();
return ret; return ret;
} }
@ -695,13 +731,6 @@ Quit:
return ret; return ret;
} }
HIMC FASTCALL IntAssociateInputContext(PWND pWnd, PIMC pImc)
{
HIMC hOldImc = pWnd->hImc;
pWnd->hImc = (pImc ? UserHMGetHandle(pImc) : NULL);
return hOldImc;
}
DWORD FASTCALL IntAssociateInputContextEx(PWND pWnd, PIMC pIMC, DWORD dwFlags) DWORD FASTCALL IntAssociateInputContextEx(PWND pWnd, PIMC pIMC, DWORD dwFlags)
{ {
DWORD ret = 0; DWORD ret = 0;