[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)
NtUserSetWindowLong(hwndUI, IMMGWL_IMC, (LONG_PTR)pimeui->hIMC, FALSE);
NtUserSetWindowLong(hwndUI, IMMGWLP_IMC, (LONG_PTR)pimeui->hIMC, FALSE);
Quit:
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);
}
NtUserSetWindowFNID(hwnd, FNID_IME);
pimeui = HeapAlloc( GetProcessHeap(), 0, sizeof(IMEUI) );
pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
pimeui->spwnd = pWnd;
SetWindowLongPtrW(hwnd, IMMGWLP_IMC, (LONG_PTR)pimeui);
}
else
{
@ -1004,7 +1003,6 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
case WM_NCDESTROY:
HeapFree(GetProcessHeap(), 0, pimeui);
SetWindowLongPtrW(hwnd, IMMGWLP_IMC, 0);
NtUserSetWindowFNID(hwnd, FNID_DESTROY);
break;

View file

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