mirror of
https://github.com/reactos/reactos.git
synced 2025-05-01 19:50:36 +00:00
[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:
parent
f3ac86713d
commit
c35488ec70
3 changed files with 33 additions and 11 deletions
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue