mirror of
https://github.com/reactos/reactos.git
synced 2025-08-07 23:43:07 +00:00
[INCLUDE][USER32] Add WM_FINALDESTROY and improve ImeWndProcA/W
CORE-11700
This commit is contained in:
parent
c7e8b544bc
commit
e1f8b32c3d
2 changed files with 61 additions and 51 deletions
|
@ -36,6 +36,7 @@ extern "C" {
|
||||||
#define WM_COPYGLOBALDATA 0x00000049
|
#define WM_COPYGLOBALDATA 0x00000049
|
||||||
#define WM_LOGONNOTIFY 0x0000004C
|
#define WM_LOGONNOTIFY 0x0000004C
|
||||||
#define WM_KEYF1 0x0000004D
|
#define WM_KEYF1 0x0000004D
|
||||||
|
#define WM_FINALDESTROY 0x00000070
|
||||||
#define WM_KLUDGEMINRECT 0x0000008B
|
#define WM_KLUDGEMINRECT 0x0000008B
|
||||||
#define WM_UAHDRAWMENU 0x00000091
|
#define WM_UAHDRAWMENU 0x00000091
|
||||||
#define WM_UAHDRAWITEM 0x00000092 // WM_DRAWITEM
|
#define WM_UAHDRAWITEM 0x00000092 // WM_DRAWITEM
|
||||||
|
|
|
@ -939,42 +939,43 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
|
||||||
LRESULT ret;
|
LRESULT ret;
|
||||||
|
|
||||||
pWnd = ValidateHwnd(hwnd);
|
pWnd = ValidateHwnd(hwnd);
|
||||||
if (pWnd)
|
if (pWnd == NULL)
|
||||||
{
|
{
|
||||||
if (IS_CICERO_MODE())
|
ERR("hwnd was %p\n", hwnd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pWnd->fnid)
|
||||||
|
{
|
||||||
|
NtUserSetWindowFNID(hwnd, FNID_IME);
|
||||||
|
}
|
||||||
|
else if (pWnd->fnid != FNID_IME)
|
||||||
|
{
|
||||||
|
ERR("fnid was 0x%x\n", pWnd->fnid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pimeui = (PIMEUI)GetWindowLongPtrW(hwnd, 0);
|
||||||
|
if (pimeui == NULL)
|
||||||
|
{
|
||||||
|
pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
|
||||||
|
if (pimeui == NULL)
|
||||||
{
|
{
|
||||||
ret = IMM_FN(CtfImmDispatchDefImeMessage)(hwnd, msg, wParam, lParam);
|
ERR("HeapAlloc failed\n");
|
||||||
if (ret)
|
NtUserSetWindowFNID(hwnd, FNID_DESTROY);
|
||||||
return ret;
|
DestroyWindow(hwnd);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pWnd->fnid)
|
SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
|
||||||
{
|
pimeui->spwnd = pWnd;
|
||||||
if (msg != WM_NCCREATE)
|
}
|
||||||
{
|
|
||||||
if (unicode)
|
if (IS_CICERO_MODE())
|
||||||
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
{
|
||||||
return DefWindowProcA(hwnd, msg, wParam, lParam);
|
ret = IMM_FN(CtfImmDispatchDefImeMessage)(hwnd, msg, wParam, lParam);
|
||||||
}
|
if (ret)
|
||||||
NtUserSetWindowFNID(hwnd, FNID_IME);
|
return ret;
|
||||||
pimeui = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMEUI));
|
|
||||||
pimeui->spwnd = pWnd;
|
|
||||||
SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (pWnd->fnid != FNID_IME)
|
|
||||||
{
|
|
||||||
ERR("Wrong window class for Ime! fnId 0x%x\n",pWnd->fnid);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pimeui = (PIMEUI)GetWindowLongPtrW(hwnd, 0);
|
|
||||||
if (pimeui == NULL)
|
|
||||||
{
|
|
||||||
ERR("Window is not set to IME!\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pimeui->nCntInIMEProc > 0)
|
if (pimeui->nCntInIMEProc > 0)
|
||||||
|
@ -1011,11 +1012,21 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
goto Finish;
|
||||||
if (unicode)
|
}
|
||||||
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
}
|
||||||
return DefWindowProcA(hwnd, msg, wParam, lParam);
|
|
||||||
}
|
if ((pWnd->state2 & WNDS2_INDESTROY) || (pWnd->state & WNDS_DESTROYED))
|
||||||
|
{
|
||||||
|
switch (msg)
|
||||||
|
{
|
||||||
|
case WM_DESTROY:
|
||||||
|
case WM_NCDESTROY:
|
||||||
|
case WM_FINALDESTROY:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1026,9 +1037,11 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
|
||||||
|
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
User32DestroyImeUIWindow(pimeui);
|
User32DestroyImeUIWindow(pimeui);
|
||||||
break;
|
return 0;
|
||||||
|
|
||||||
case WM_NCDESTROY:
|
case WM_NCDESTROY:
|
||||||
|
case WM_FINALDESTROY:
|
||||||
|
pimeui->spwnd = NULL;
|
||||||
HeapFree(GetProcessHeap(), 0, pimeui);
|
HeapFree(GetProcessHeap(), 0, pimeui);
|
||||||
NtUserSetWindowFNID(hwnd, FNID_DESTROY);
|
NtUserSetWindowFNID(hwnd, FNID_DESTROY);
|
||||||
break;
|
break;
|
||||||
|
@ -1037,11 +1050,7 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
break;
|
return 0;
|
||||||
|
|
||||||
case WM_COPYDATA:
|
|
||||||
// TODO:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case WM_IME_STARTCOMPOSITION:
|
case WM_IME_STARTCOMPOSITION:
|
||||||
case WM_IME_COMPOSITION:
|
case WM_IME_COMPOSITION:
|
||||||
|
@ -1055,11 +1064,11 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
|
||||||
return ImeWnd_OnImeNotify(pimeui, wParam, lParam);
|
return ImeWnd_OnImeNotify(pimeui, wParam, lParam);
|
||||||
|
|
||||||
case WM_IME_REQUEST:
|
case WM_IME_REQUEST:
|
||||||
break;
|
return 0;
|
||||||
|
|
||||||
case WM_IME_SELECT:
|
case WM_IME_SELECT:
|
||||||
ImeWnd_OnImeSelect(pimeui, wParam, lParam);
|
ImeWnd_OnImeSelect(pimeui, wParam, lParam);
|
||||||
break;
|
return (LRESULT)pimeui;
|
||||||
|
|
||||||
case WM_IME_SETCONTEXT:
|
case WM_IME_SETCONTEXT:
|
||||||
return ImeWnd_OnImeSetContext(pimeui, wParam, lParam);
|
return ImeWnd_OnImeSetContext(pimeui, wParam, lParam);
|
||||||
|
@ -1068,14 +1077,14 @@ ImeWndProc_common(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicod
|
||||||
return ImeWnd_OnImeSystem(pimeui, wParam, lParam);
|
return ImeWnd_OnImeSystem(pimeui, wParam, lParam);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
break;
|
||||||
if (unicode)
|
|
||||||
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
|
||||||
return DefWindowProcA(hwnd, msg, wParam, lParam);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
Finish:
|
||||||
|
if (unicode)
|
||||||
|
return DefWindowProcW(hwnd, msg, wParam, lParam);
|
||||||
|
return DefWindowProcA(hwnd, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Win: ImeWndProcA
|
// Win: ImeWndProcA
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue