[NTUSER][USER32] Implement ImeWnd_OnImeNotify (#4457)

- Add code to ImeWnd_OnImeNotify function.
- Insert ASSERT(pimeui->spwnd != NULL); to some functions.
- Renaming: s/THREADSTATE_UNKNOWN17/THREADSTATE_CHECKCONIME/.
- Improve ImeWnd_OnImeSetContext function.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-04-19 07:48:16 +09:00 committed by GitHub
parent f3ac86713d
commit c35488ec70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 11 deletions

View file

@ -2578,7 +2578,7 @@ enum ThreadStateRoutines
THREADSTATE_OLDKEYBOARDLAYOUT, THREADSTATE_OLDKEYBOARDLAYOUT,
THREADSTATE_ISWINLOGON, THREADSTATE_ISWINLOGON,
THREADSTATE_ISWINLOGON2, THREADSTATE_ISWINLOGON2,
THREADSTATE_UNKNOWN17, THREADSTATE_CHECKCONIME,
THREADSTATE_GETTHREADINFO, THREADSTATE_GETTHREADINFO,
THREADSTATE_PROGMANWINDOW, /* FIXME: Delete this HACK */ THREADSTATE_PROGMANWINDOW, /* FIXME: Delete this HACK */
THREADSTATE_TASKMANWINDOW, /* FIXME: Delete this HACK */ THREADSTATE_TASKMANWINDOW, /* FIXME: Delete this HACK */

View file

@ -335,7 +335,7 @@ NtUserGetThreadState(
case THREADSTATE_ISWINLOGON2: case THREADSTATE_ISWINLOGON2:
ret = (gpidLogon == PsGetCurrentProcessId()); ret = (gpidLogon == PsGetCurrentProcessId());
break; break;
case THREADSTATE_UNKNOWN17: case THREADSTATE_CHECKCONIME:
/* FIXME */ /* FIXME */
break; break;
} }

View file

@ -170,6 +170,8 @@ User32SendImeUIMessage(PIMEUI pimeui, UINT uMsg, WPARAM wParam, LPARAM lParam, B
HWND hwndUI = pimeui->hwndUI; HWND hwndUI = pimeui->hwndUI;
PWND pwnd, pwndUI; PWND pwnd, pwndUI;
ASSERT(pimeui->spwnd != NULL);
pwnd = pimeui->spwnd; pwnd = pimeui->spwnd;
pwndUI = ValidateHwnd(hwndUI); pwndUI = ValidateHwnd(hwndUI);
if (!pwnd || (pwnd->state & WNDS_DESTROYED) || (pwnd->state2 & WNDS2_INDESTROY) || if (!pwnd || (pwnd->state & WNDS_DESTROYED) || (pwnd->state2 & WNDS2_INDESTROY) ||
@ -195,6 +197,8 @@ static VOID User32NotifyOpenStatus(PIMEUI pimeui, HWND hwndIMC, BOOL bOpen)
{ {
WPARAM wParam = (bOpen ? IMN_OPENSTATUSWINDOW : IMN_CLOSESTATUSWINDOW); WPARAM wParam = (bOpen ? IMN_OPENSTATUSWINDOW : IMN_CLOSESTATUSWINDOW);
ASSERT(pimeui->spwnd != NULL);
pimeui->fShowStatus = bOpen; pimeui->fShowStatus = bOpen;
if (LOWORD(GetWin32ClientInfo()->dwExpWinVer) >= 0x400) if (LOWORD(GetWin32ClientInfo()->dwExpWinVer) >= 0x400)
@ -216,9 +220,12 @@ static VOID User32SetImeWindowOfImc(HIMC hIMC, HWND hImeWnd)
// Win: ImeSetImc // Win: ImeSetImc
static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC) static VOID User32UpdateImcOfImeUI(PIMEUI pimeui, HIMC hNewIMC)
{ {
HWND hImeWnd = UserHMGetHandle(pimeui->spwnd); HWND hImeWnd;
HIMC hOldIMC = pimeui->hIMC; HIMC hOldIMC = pimeui->hIMC;
ASSERT(pimeui->spwnd != NULL);
hImeWnd = UserHMGetHandle(pimeui->spwnd);
if (hNewIMC == hOldIMC) if (hNewIMC == hOldIMC)
return; return;
@ -237,7 +244,9 @@ static LRESULT ImeWnd_OnImeNotify(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
LRESULT ret = 0; LRESULT ret = 0;
HIMC hIMC; HIMC hIMC;
LPINPUTCONTEXT pIC; LPINPUTCONTEXT pIC;
HWND hwndUI, hwndIMC; HWND hwndUI, hwndIMC, hImeWnd, hwndOwner;
ASSERT(pimeui->spwnd != NULL);
switch (wParam) switch (wParam)
{ {
@ -252,9 +261,14 @@ static LRESULT ImeWnd_OnImeNotify(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
{ {
NtUserNotifyIMEStatus(hwndIMC, pIC->fOpen, pIC->fdwConversion); NtUserNotifyIMEStatus(hwndIMC, pIC->fOpen, pIC->fdwConversion);
} }
else else if (gfConIme == TRUE && pimeui->spwnd)
{ {
// TODO: hImeWnd = UserHMGetHandle(pimeui->spwnd);
hwndOwner = GetWindow(hImeWnd, GW_OWNER);
if (hwndOwner)
{
NtUserNotifyIMEStatus(hwndOwner, pIC->fOpen, pIC->fdwConversion);
}
} }
IMM_FN(ImmUnlockIMC)(hIMC); IMM_FN(ImmUnlockIMC)(hIMC);
@ -284,6 +298,8 @@ static HWND User32CreateImeUIWindow(PIMEUI pimeui, HKL hKL)
CHAR szUIClass[32]; CHAR szUIClass[32];
PWND pwnd = pimeui->spwnd; PWND pwnd = pimeui->spwnd;
ASSERT(pimeui->spwnd != NULL);
if (!pwnd || !IMM_FN(ImmGetImeInfoEx)(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL)) if (!pwnd || !IMM_FN(ImmGetImeInfoEx)(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
return NULL; return NULL;
@ -549,6 +565,8 @@ static LRESULT ImeWnd_OnImeSystem(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
COMPOSITIONFORM CompForm; COMPOSITIONFORM CompForm;
UINT iCandForm; UINT iCandForm;
ASSERT(pimeui->spwnd != NULL);
switch (wParam) switch (wParam)
{ {
case 0x05: case 0x05:
@ -688,12 +706,13 @@ LRESULT ImeWnd_OnImeSetContext(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
LRESULT ret; LRESULT ret;
HIMC hIMC; HIMC hIMC;
LPINPUTCONTEXTDX pIC; LPINPUTCONTEXTDX pIC;
HWND hwndFocus, hwndOldImc, hwndNewImc, hImeWnd, hwndActive; HWND hwndFocus, hwndOldImc, hwndNewImc, hImeWnd, hwndActive, hwndOwner;
PWND pwndFocus, pwndOldImc, pwndNewImc, pImeWnd, pwndOwner; PWND pwndFocus, pwndOldImc, pwndNewImc, pImeWnd, pwndOwner;
COMPOSITIONFORM CompForm; COMPOSITIONFORM CompForm;
pimeui->fActivate = !!wParam; pimeui->fActivate = !!wParam;
hwndOldImc = pimeui->hwndIMC; hwndOldImc = pimeui->hwndIMC;
ASSERT(pimeui->spwnd != NULL);
if (wParam) if (wParam)
{ {
@ -702,14 +721,17 @@ LRESULT ImeWnd_OnImeSetContext(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
if (gfConIme == -1) if (gfConIme == -1)
{ {
gfConIme = (INT)NtUserGetThreadState(THREADSTATE_UNKNOWN17); gfConIme = (INT)NtUserGetThreadState(THREADSTATE_CHECKCONIME);
if (gfConIme) if (gfConIme)
pimeui->fCtrlShowStatus = FALSE; pimeui->fCtrlShowStatus = FALSE;
} }
hImeWnd = UserHMGetHandle(pimeui->spwnd);
if (gfConIme) if (gfConIme)
{ {
pwndOwner = pimeui->spwnd->spwndOwner; hwndOwner = GetWindow(hImeWnd, GW_OWNER);
pwndOwner = ValidateHwnd(hwndOwner);
if (pwndOwner) if (pwndOwner)
{ {
User32UpdateImcOfImeUI(pimeui, pwndOwner->hImc); User32UpdateImcOfImeUI(pimeui, pwndOwner->hImc);
@ -721,7 +743,6 @@ LRESULT ImeWnd_OnImeSetContext(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
return User32SendImeUIMessage(pimeui, WM_IME_SETCONTEXT, wParam, lParam, TRUE); return User32SendImeUIMessage(pimeui, WM_IME_SETCONTEXT, wParam, lParam, TRUE);
} }
hImeWnd = UserHMGetHandle(pimeui->spwnd);
hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS); hwndFocus = (HWND)NtUserQueryWindow(hImeWnd, QUERY_WINDOW_FOCUS);
hIMC = IMM_FN(ImmGetContext)(hwndFocus); hIMC = IMM_FN(ImmGetContext)(hwndFocus);
@ -786,7 +807,8 @@ LRESULT ImeWnd_OnImeSetContext(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
if (wParam) if (wParam)
{ {
if (pwndFocus && pimeui->spwnd->head.pti == pwndFocus->head.pti) pImeWnd = ValidateHwnd(hImeWnd);
if (pwndFocus && pImeWnd && pImeWnd->head.pti == pwndFocus->head.pti)
{ {
hwndNewImc = pimeui->hwndIMC; hwndNewImc = pimeui->hwndIMC;
if (pimeui->fShowStatus) if (pimeui->fShowStatus)