[USER32] RealDefWindowProcA/W WM_IME_SYSTEM handling (#4607)

- Add WM_IME_SYSTEM message handling on RealDefWindowProcA and RealDefWindowProcW functions.
- Improve WM_IME_... messages handling.
- s/IMMGWL_IMC/IMMGWLP_IMC/
- Don't set IMMGWLP_IMC value to the default IME window.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-08-16 08:00:47 +09:00 committed by GitHub
parent eb674f353e
commit 60be15ff5d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 45 deletions

View file

@ -331,7 +331,7 @@ static HWND User32CreateImeUIWindow(PIMEUI pimeui, HKL hKL)
} }
if (hwndUI) if (hwndUI)
NtUserSetWindowLong(hwndUI, IMMGWL_IMC, (LONG_PTR)pimeui->hIMC, FALSE); NtUserSetWindowLong(hwndUI, IMMGWLP_IMC, (LONG_PTR)pimeui->hIMC, FALSE);
Quit: Quit:
IMM_FN(ImmUnlockImeDpi)(pImeDpi); IMM_FN(ImmUnlockImeDpi)(pImeDpi);
@ -935,9 +935,8 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
return DefWindowProcA(hwnd, msg, wParam, lParam); return DefWindowProcA(hwnd, msg, wParam, lParam);
} }
NtUserSetWindowFNID(hwnd, FNID_IME); NtUserSetWindowFNID(hwnd, FNID_IME);
pimeui = HeapAlloc( GetProcessHeap(), 0, sizeof(IMEUI) ); pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
pimeui->spwnd = pWnd; pimeui->spwnd = pWnd;
SetWindowLongPtrW(hwnd, IMMGWLP_IMC, (LONG_PTR)pimeui);
} }
else else
{ {
@ -1004,7 +1003,6 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
case WM_NCDESTROY: case WM_NCDESTROY:
HeapFree(GetProcessHeap(), 0, pimeui); HeapFree(GetProcessHeap(), 0, pimeui);
SetWindowLongPtrW(hwnd, IMMGWLP_IMC, 0);
NtUserSetWindowFNID(hwnd, FNID_DESTROY); NtUserSetWindowFNID(hwnd, FNID_DESTROY);
break; break;

View file

@ -10,6 +10,7 @@
*/ */
#include <user32.h> #include <user32.h>
#include <ddk/immdev.h>
WINE_DEFAULT_DEBUG_CHANNEL(user32); WINE_DEFAULT_DEBUG_CHANNEL(user32);
@ -830,7 +831,6 @@ RealDefWindowProcA(HWND hWnd,
switch (Msg) switch (Msg)
{ {
case WM_NCCREATE: case WM_NCCREATE:
{
if ( Wnd && if ( Wnd &&
Wnd->style & (WS_HSCROLL | WS_VSCROLL) ) Wnd->style & (WS_HSCROLL | WS_VSCROLL) )
{ {
@ -854,7 +854,6 @@ RealDefWindowProcA(HWND hWnd,
Result = 1; Result = 1;
} }
break; break;
}
case WM_GETTEXTLENGTH: case WM_GETTEXTLENGTH:
{ {
@ -926,24 +925,18 @@ RealDefWindowProcA(HWND hWnd,
} }
case WM_IME_KEYDOWN: case WM_IME_KEYDOWN:
{
Result = PostMessageA(hWnd, WM_KEYDOWN, wParam, lParam); Result = PostMessageA(hWnd, WM_KEYDOWN, wParam, lParam);
break; break;
}
case WM_IME_KEYUP: case WM_IME_KEYUP:
{
Result = PostMessageA(hWnd, WM_KEYUP, wParam, lParam); Result = PostMessageA(hWnd, WM_KEYUP, wParam, lParam);
break; break;
}
case WM_IME_CHAR: case WM_IME_CHAR:
{
if (HIBYTE(wParam)) if (HIBYTE(wParam))
PostMessageA(hWnd, WM_CHAR, HIBYTE(wParam), lParam); PostMessageA(hWnd, WM_CHAR, HIBYTE(wParam), lParam);
PostMessageA(hWnd, WM_CHAR, LOBYTE(wParam), lParam); PostMessageA(hWnd, WM_CHAR, LOBYTE(wParam), lParam);
break; break;
}
case WM_IME_COMPOSITION: case WM_IME_COMPOSITION:
if (lParam & GCS_RESULTSTR) if (lParam & GCS_RESULTSTR)
@ -987,26 +980,40 @@ RealDefWindowProcA(HWND hWnd,
case WM_IME_SELECT: case WM_IME_SELECT:
case WM_IME_NOTIFY: case WM_IME_NOTIFY:
case WM_IME_CONTROL: case WM_IME_CONTROL:
{
HWND hwndIME;
hwndIME = IMM_FN(ImmGetDefaultIMEWnd)(hWnd);
if (hwndIME)
Result = SendMessageA(hwndIME, Msg, wParam, lParam);
break;
}
case WM_IME_SETCONTEXT: case WM_IME_SETCONTEXT:
NormalImeMsgHandling:
{ {
HWND hwndIME; HWND hwndIME;
if (GetWin32ClientInfo()->dwTIFlags & TIF_DISABLEIME)
{
TRACE("This thread's IME is disabled\n");
break;
}
hwndIME = IMM_FN(ImmGetDefaultIMEWnd)(hWnd); hwndIME = IMM_FN(ImmGetDefaultIMEWnd)(hWnd);
if (hwndIME) if (!hwndIME)
{
ERR("hwndIME was NULL\n");
break;
}
if (hwndIME == hWnd)
{
ImeWndProc_common(hwndIME, Msg, wParam, lParam, FALSE);
break;
}
Result = SendMessageA(hwndIME, Msg, wParam, lParam); Result = SendMessageA(hwndIME, Msg, wParam, lParam);
break; break;
} }
/* fall through */ case WM_IME_SYSTEM:
if (wParam == 4)
break;
goto NormalImeMsgHandling;
default: default:
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE); Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, FALSE);
} }
@ -1038,7 +1045,6 @@ RealDefWindowProcW(HWND hWnd,
switch (Msg) switch (Msg)
{ {
case WM_NCCREATE: case WM_NCCREATE:
{
if ( Wnd && if ( Wnd &&
Wnd->style & (WS_HSCROLL | WS_VSCROLL) ) Wnd->style & (WS_HSCROLL | WS_VSCROLL) )
{ {
@ -1064,7 +1070,6 @@ RealDefWindowProcW(HWND hWnd,
Result = 1; Result = 1;
} }
break; break;
}
case WM_GETTEXTLENGTH: case WM_GETTEXTLENGTH:
{ {
@ -1117,33 +1122,25 @@ RealDefWindowProcW(HWND hWnd,
} }
case WM_SETTEXT: case WM_SETTEXT:
{
DefSetText(hWnd, (PCWSTR)lParam, FALSE); DefSetText(hWnd, (PCWSTR)lParam, FALSE);
if ((GetWindowLongPtrW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION) if ((GetWindowLongPtrW(hWnd, GWL_STYLE) & WS_CAPTION) == WS_CAPTION)
UserPaintCaption(Wnd, DC_TEXT); UserPaintCaption(Wnd, DC_TEXT);
Result = 1; Result = 1;
break; break;
}
case WM_IME_CHAR: case WM_IME_CHAR:
{
PostMessageW(hWnd, WM_CHAR, wParam, lParam); PostMessageW(hWnd, WM_CHAR, wParam, lParam);
Result = 0; Result = 0;
break; break;
}
case WM_IME_KEYDOWN: case WM_IME_KEYDOWN:
{
Result = PostMessageW(hWnd, WM_KEYDOWN, wParam, lParam); Result = PostMessageW(hWnd, WM_KEYDOWN, wParam, lParam);
break; break;
}
case WM_IME_KEYUP: case WM_IME_KEYUP:
{
Result = PostMessageW(hWnd, WM_KEYUP, wParam, lParam); Result = PostMessageW(hWnd, WM_KEYUP, wParam, lParam);
break; break;
}
case WM_IME_COMPOSITION: case WM_IME_COMPOSITION:
if (lParam & GCS_RESULTSTR) if (lParam & GCS_RESULTSTR)
@ -1172,25 +1169,40 @@ RealDefWindowProcW(HWND hWnd,
case WM_IME_SELECT: case WM_IME_SELECT:
case WM_IME_NOTIFY: case WM_IME_NOTIFY:
case WM_IME_CONTROL: case WM_IME_CONTROL:
{
HWND hwndIME;
hwndIME = IMM_FN(ImmGetDefaultIMEWnd)(hWnd);
if (hwndIME)
Result = SendMessageW(hwndIME, Msg, wParam, lParam);
break;
}
case WM_IME_SETCONTEXT: case WM_IME_SETCONTEXT:
NormalImeMsgHandling:
{ {
HWND hwndIME; HWND hwndIME;
if (GetWin32ClientInfo()->dwTIFlags & TIF_DISABLEIME)
{
TRACE("This thread's IME is disabled\n");
break;
}
hwndIME = IMM_FN(ImmGetDefaultIMEWnd)(hWnd); hwndIME = IMM_FN(ImmGetDefaultIMEWnd)(hWnd);
if (hwndIME) if (!hwndIME)
{
ERR("hwndIME was NULL\n");
break;
}
if (hwndIME == hWnd)
{
ImeWndProc_common(hwndIME, Msg, wParam, lParam, TRUE);
break;
}
Result = SendMessageW(hwndIME, Msg, wParam, lParam); Result = SendMessageW(hwndIME, Msg, wParam, lParam);
break; break;
} }
case WM_IME_SYSTEM:
if (wParam == 4)
break;
goto NormalImeMsgHandling;
default: default:
Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, TRUE); Result = User32DefWindowProc(hWnd, Msg, wParam, lParam, TRUE);
} }