[USER32] Adjustment for IME/IMM (#4610)

- Add IS_CICERO_MODE() macro.
- Append DWORD dwLastStatus to IMEUI structure.
- Modify ImeWndProc_common, ImeWnd_OnCreate, ImeWnd_OnImeSelect, and ImeWnd_OnImeControl functions.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-08-18 10:55:11 +09:00 committed by GitHub
parent 93955f37de
commit c06cccea22
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 9 deletions

View file

@ -1201,6 +1201,7 @@ typedef enum IMEINFOEXCLASS
} IMEINFOEXCLASS; } IMEINFOEXCLASS;
#define IS_IME_HKL(hkl) ((((ULONG_PTR)(hkl)) & 0xF0000000) == 0xE0000000) #define IS_IME_HKL(hkl) ((((ULONG_PTR)(hkl)) & 0xF0000000) == 0xE0000000)
#define IS_CICERO_MODE() (gpsi->dwSRVIFlags & SRVINFO_CICERO_ENABLED)
typedef struct tagIMEUI typedef struct tagIMEUI
{ {
@ -1219,6 +1220,7 @@ typedef struct tagIMEUI
UINT fCtrlShowStatus:1; UINT fCtrlShowStatus:1;
UINT fFreeActiveEvent:1; UINT fFreeActiveEvent:1;
}; };
DWORD dwLastStatus;
} IMEUI, *PIMEUI; } IMEUI, *PIMEUI;
/* Window Extra data container. */ /* Window Extra data container. */

View file

@ -340,13 +340,13 @@ Quit:
/* Initializes the default IME window. */ /* Initializes the default IME window. */
/* Win: ImeWndCreateHandler */ /* Win: ImeWndCreateHandler */
static BOOL ImeWnd_OnCreate(PIMEUI pimeui, LPCREATESTRUCT lpCS) static INT ImeWnd_OnCreate(PIMEUI pimeui, LPCREATESTRUCT lpCS)
{ {
PWND pParentWnd, pWnd = pimeui->spwnd; PWND pParentWnd, pWnd = pimeui->spwnd;
HIMC hIMC = NULL; HIMC hIMC = NULL;
if (!pWnd || (pWnd->style & (WS_DISABLED | WS_POPUP)) != (WS_DISABLED | WS_POPUP)) if (!pWnd || (pWnd->style & (WS_DISABLED | WS_POPUP)) != (WS_DISABLED | WS_POPUP))
return FALSE; return -1;
pParentWnd = ValidateHwnd(lpCS->hwndParent); pParentWnd = ValidateHwnd(lpCS->hwndParent);
if (pParentWnd) if (pParentWnd)
@ -365,12 +365,9 @@ static BOOL ImeWnd_OnCreate(PIMEUI pimeui, LPCREATESTRUCT lpCS)
pimeui->hwndIMC = NULL; pimeui->hwndIMC = NULL;
pimeui->hKL = GetWin32ClientInfo()->hKL; pimeui->hKL = GetWin32ClientInfo()->hKL;
pimeui->fCtrlShowStatus = TRUE; pimeui->fCtrlShowStatus = TRUE;
pimeui->dwLastStatus = 0;
IMM_FN(ImmLoadIME)(pimeui->hKL); return 0;
pimeui->hwndUI = NULL;
return TRUE;
} }
/* Destroys the IME UI window. */ /* Destroys the IME UI window. */
@ -399,6 +396,10 @@ static VOID ImeWnd_OnImeSelect(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
if (wParam) if (wParam)
{ {
pimeui->hKL = hKL = (HKL)lParam; pimeui->hKL = hKL = (HKL)lParam;
if (!pimeui->fActivate)
return;
pimeui->hwndUI = hwndUI = User32CreateImeUIWindow(pimeui, hKL); pimeui->hwndUI = hwndUI = User32CreateImeUIWindow(pimeui, hKL);
if (hwndUI) if (hwndUI)
User32SendImeUIMessage(pimeui, WM_IME_SELECT, wParam, lParam, TRUE); User32SendImeUIMessage(pimeui, WM_IME_SELECT, wParam, lParam, TRUE);
@ -429,6 +430,19 @@ ImeWnd_OnImeControl(PIMEUI pimeui, WPARAM wParam, LPARAM lParam, BOOL unicode)
DWORD dwConversion, dwSentence; DWORD dwConversion, dwSentence;
POINT pt; POINT pt;
if (IS_CICERO_MODE())
{
if (wParam == IMC_OPENSTATUSWINDOW)
{
IMM_FN(CtfImmRestoreToolbarWnd)(pimeui->dwLastStatus);
pimeui->dwLastStatus = 0;
}
else if (wParam == IMC_CLOSESTATUSWINDOW)
{
pimeui->dwLastStatus = IMM_FN(CtfImmHideToolbarWnd)();
}
}
if (!hIMC) if (!hIMC)
return 0; return 0;
@ -922,10 +936,18 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
{ {
PWND pWnd; PWND pWnd;
PIMEUI pimeui; PIMEUI pimeui;
LRESULT ret;
pWnd = ValidateHwnd(hwnd); pWnd = ValidateHwnd(hwnd);
if (pWnd) if (pWnd)
{ {
if (IS_CICERO_MODE())
{
ret = IMM_FN(CtfImmDispatchDefImeMessage)(hwnd, msg, wParam, lParam);
if (ret)
return ret;
}
if (!pWnd->fnid) if (!pWnd->fnid)
{ {
if (msg != WM_NCCREATE) if (msg != WM_NCCREATE)
@ -961,7 +983,6 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
case WM_IME_CHAR: case WM_IME_CHAR:
case WM_IME_COMPOSITIONFULL: case WM_IME_COMPOSITIONFULL:
case WM_IME_CONTROL: case WM_IME_CONTROL:
case WM_IME_NOTIFY:
case WM_IME_REQUEST: case WM_IME_REQUEST:
case WM_IME_SELECT: case WM_IME_SELECT:
case WM_IME_SETCONTEXT: case WM_IME_SETCONTEXT:
@ -970,6 +991,11 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
case WM_IME_ENDCOMPOSITION: case WM_IME_ENDCOMPOSITION:
return 0; return 0;
case WM_IME_NOTIFY:
if (wParam < IMN_PRIVATE || IS_IME_HKL(pimeui->hKL) || !IS_CICERO_MODE())
return 0;
break;
case WM_IME_SYSTEM: case WM_IME_SYSTEM:
switch (wParam) switch (wParam)
{ {
@ -995,7 +1021,7 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
switch (msg) switch (msg)
{ {
case WM_CREATE: case WM_CREATE:
return (ImeWnd_OnCreate(pimeui, (LPCREATESTRUCT)lParam) ? 0 : -1); return ImeWnd_OnCreate(pimeui, (LPCREATESTRUCT)lParam);
case WM_DESTROY: case WM_DESTROY:
User32DestroyImeUIWindow(pimeui); User32DestroyImeUIWindow(pimeui);