mirror of
https://github.com/reactos/reactos.git
synced 2024-06-29 01:12:06 +00:00
[USER32] Implement WM_CREATE of IME window (#4314)
Implement handling of WM_CREATE and WM_DESTROY messages of the IME window. CORE-11700
This commit is contained in:
parent
9c8167e90a
commit
fc62d268d2
|
@ -133,6 +133,55 @@ BOOL WINAPI User32InitializeImmEntryTable(DWORD magic)
|
||||||
return IMM_FN(ImmRegisterClient)(&gSharedInfo, ghImm32);
|
return IMM_FN(ImmRegisterClient)(&gSharedInfo, ghImm32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL CheckIMCForWindow(HIMC hIMC, HWND hWnd)
|
||||||
|
{
|
||||||
|
PIMC pIMC = ValidateHandle(hIMC, TYPE_INPUTCONTEXT);
|
||||||
|
return pIMC && (!pIMC->hImeWnd || pIMC->hImeWnd == hWnd || !ValidateHwnd(pIMC->hImeWnd));
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL ImeWnd_OnCreate(PIMEUI pimeui, LPCREATESTRUCT lpCS)
|
||||||
|
{
|
||||||
|
PWND pParentWnd, pWnd = pimeui->spwnd;
|
||||||
|
HIMC hIMC;
|
||||||
|
|
||||||
|
if (!pWnd || (pWnd->style & (WS_DISABLED | WS_POPUP)) != (WS_DISABLED | WS_POPUP))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
pimeui->hIMC = NULL;
|
||||||
|
pParentWnd = ValidateHwnd(lpCS->hwndParent);
|
||||||
|
if (pParentWnd)
|
||||||
|
{
|
||||||
|
hIMC = pParentWnd->hImc;
|
||||||
|
if (hIMC && CheckIMCForWindow(hIMC, UserHMGetHandle(pWnd)))
|
||||||
|
pimeui->hIMC = hIMC;
|
||||||
|
}
|
||||||
|
|
||||||
|
pimeui->fShowStatus = FALSE;
|
||||||
|
pimeui->nCntInIMEProc = 0;
|
||||||
|
pimeui->fActivate = FALSE;
|
||||||
|
pimeui->fDestroy = FALSE;
|
||||||
|
pimeui->hwndIMC = NULL;
|
||||||
|
pimeui->hKL = GetWin32ClientInfo()->hKL;
|
||||||
|
pimeui->fCtrlShowStatus = TRUE;
|
||||||
|
|
||||||
|
IMM_FN(ImmLoadIME)(pimeui->hKL);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImeWnd_OnDestroy(PIMEUI pimeui)
|
||||||
|
{
|
||||||
|
HWND hwndUI = pimeui->hwndUI;
|
||||||
|
|
||||||
|
if (IsWindow(hwndUI))
|
||||||
|
{
|
||||||
|
pimeui->fDestroy = TRUE;
|
||||||
|
NtUserDestroyWindow(hwndUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
pimeui->fShowStatus = pimeui->fDestroy = FALSE;
|
||||||
|
pimeui->hwndUI = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) // ReactOS
|
LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) // ReactOS
|
||||||
{
|
{
|
||||||
PWND pWnd;
|
PWND pWnd;
|
||||||
|
@ -151,6 +200,7 @@ LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
|
||||||
}
|
}
|
||||||
NtUserSetWindowFNID(hwnd, FNID_IME);
|
NtUserSetWindowFNID(hwnd, FNID_IME);
|
||||||
pimeui = HeapAlloc( GetProcessHeap(), 0, sizeof(IMEUI) );
|
pimeui = HeapAlloc( GetProcessHeap(), 0, sizeof(IMEUI) );
|
||||||
|
pimeui->spwnd = pWnd;
|
||||||
SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
|
SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -169,19 +219,101 @@ LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg==WM_CREATE || msg==WM_NCCREATE)
|
if (pimeui->nCntInIMEProc > 0)
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
if (msg==WM_NCDESTROY)
|
|
||||||
{
|
{
|
||||||
HeapFree( GetProcessHeap(), 0, pimeui );
|
switch (msg)
|
||||||
SetWindowLongPtrW(hwnd, 0, 0);
|
{
|
||||||
NtUserSetWindowFNID(hwnd, FNID_DESTROY);
|
case WM_IME_CHAR:
|
||||||
|
case WM_IME_COMPOSITIONFULL:
|
||||||
|
case WM_IME_CONTROL:
|
||||||
|
case WM_IME_REQUEST:
|
||||||
|
case WM_IME_SELECT:
|
||||||
|
case WM_IME_SETCONTEXT:
|
||||||
|
case WM_IME_STARTCOMPOSITION:
|
||||||
|
case WM_IME_COMPOSITION:
|
||||||
|
case WM_IME_ENDCOMPOSITION:
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case WM_IME_NOTIFY:
|
||||||
|
// TODO:
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case WM_IME_SYSTEM:
|
||||||
|
// TODO:
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (unicode)
|
||||||
|
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
||||||
|
return DefWindowProcA(hwnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unicode)
|
switch (msg)
|
||||||
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
{
|
||||||
return DefWindowProcA(hwnd, msg, wParam, lParam);
|
case WM_CREATE:
|
||||||
|
return (ImeWnd_OnCreate(pimeui, (LPCREATESTRUCT)lParam) ? 0 : -1);
|
||||||
|
|
||||||
|
case WM_DESTROY:
|
||||||
|
ImeWnd_OnDestroy(pimeui);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_NCDESTROY:
|
||||||
|
HeapFree(GetProcessHeap(), 0, pimeui);
|
||||||
|
SetWindowLongPtrW(hwnd, 0, 0);
|
||||||
|
NtUserSetWindowFNID(hwnd, FNID_DESTROY);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_ERASEBKGND:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case WM_PAINT:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_COPYDATA:
|
||||||
|
// TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_IME_STARTCOMPOSITION:
|
||||||
|
case WM_IME_COMPOSITION:
|
||||||
|
case WM_IME_ENDCOMPOSITION:
|
||||||
|
// TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_IME_CONTROL:
|
||||||
|
// TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_IME_NOTIFY:
|
||||||
|
// TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_IME_REQUEST:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_IME_SELECT:
|
||||||
|
// TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_IME_SETCONTEXT:
|
||||||
|
// TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_IME_SYSTEM:
|
||||||
|
// TODO:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (unicode)
|
||||||
|
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
||||||
|
return DefWindowProcA(hwnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LRESULT WINAPI ImeWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
LRESULT WINAPI ImeWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
||||||
|
|
Loading…
Reference in a new issue