mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
[USER32] Add ImeWnd_OnImeSystem (#4327)
- Add WM_IME_SYSTEM message handling of the IME window. - Modify immtable.h. CORE-11700
This commit is contained in:
parent
173fca6ed6
commit
99614febad
3 changed files with 181 additions and 4 deletions
|
@ -891,6 +891,11 @@ NtUserCallHwndParamLock(
|
|||
|
||||
switch (Routine)
|
||||
{
|
||||
case X_ROUTINE_IMESHOWSTATUSCHANGE:
|
||||
{
|
||||
// TODO:
|
||||
break;
|
||||
}
|
||||
case TWOPARAM_ROUTINE_VALIDATERGN:
|
||||
{
|
||||
PREGION Rgn = REGION_LockRgn((HRGN)Param);
|
||||
|
|
|
@ -32,6 +32,7 @@ DEFINE_IMM_ENTRY(BOOL, ImmLoadIME, (HKL hKL), 0, NONVOID)
|
|||
DEFINE_IMM_ENTRY(BOOL, ImmSetOpenStatus, (HIMC hIMC, BOOL bOpen), 0, NONVOID)
|
||||
DEFINE_IMM_ENTRY(BOOL, ImmFreeLayout, (DWORD dwFlags), 0, NONVOID)
|
||||
DEFINE_IMM_ENTRY(BOOL, ImmActivateLayout, (HKL hKL), 0, NONVOID)
|
||||
DEFINE_IMM_ENTRY(BOOL, ImmGetCandidateWindow, (HIMC hIMC, DWORD dwIndex, LPCANDIDATEFORM lpCandForm), 0, NONVOID)
|
||||
DEFINE_IMM_ENTRY(BOOL, ImmSetCandidateWindow, (HIMC hIMC, LPCANDIDATEFORM lpCandForm), 0, NONVOID)
|
||||
DEFINE_IMM_ENTRY(BOOL, ImmConfigureIMEW, (HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData), 0, NONVOID)
|
||||
DEFINE_IMM_ENTRY(BOOL, ImmGetConversionStatus, (HIMC hIMC, LPDWORD lpdwConversion, LPDWORD lpdwSentence), 0, NONVOID)
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
WINE_DEFAULT_DEBUG_CHANNEL(user32);
|
||||
|
||||
#define IMM_INIT_MAGIC 0x19650412
|
||||
#define MAX_CANDIDATEFORM 4
|
||||
|
||||
/* Is != NULL when we have loaded the IMM ourselves */
|
||||
HINSTANCE ghImm32 = NULL;
|
||||
|
@ -491,6 +492,168 @@ ImeWnd_OnImeControl(PIMEUI pimeui, WPARAM wParam, LPARAM lParam, BOOL unicode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static VOID FASTCALL User32SetImeActivenessOfWindow(HWND hWnd, BOOL bActive)
|
||||
{
|
||||
HIMC hIMC;
|
||||
|
||||
if (!hWnd || !IsWindow(hWnd))
|
||||
{
|
||||
IMM_FN(ImmSetActiveContext)(NULL, NULL, bActive);
|
||||
return;
|
||||
}
|
||||
|
||||
hIMC = IMM_FN(ImmGetContext)(hWnd);
|
||||
IMM_FN(ImmSetActiveContext)(hWnd, hIMC, bActive);
|
||||
IMM_FN(ImmReleaseContext)(hWnd, hIMC);
|
||||
}
|
||||
|
||||
static LRESULT ImeWnd_OnImeSystem(PIMEUI pimeui, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT ret = 0;
|
||||
LPINPUTCONTEXTDX pIC;
|
||||
HIMC hIMC = pimeui->hIMC;
|
||||
LPCANDIDATEFORM pCandForm;
|
||||
LPCOMPOSITIONFORM pCompForm;
|
||||
DWORD dwConversion, dwSentence;
|
||||
HWND hImeWnd;
|
||||
BOOL bCompForm;
|
||||
CANDIDATEFORM CandForm;
|
||||
COMPOSITIONFORM CompForm;
|
||||
UINT iCandForm;
|
||||
|
||||
switch (wParam)
|
||||
{
|
||||
case 0x05:
|
||||
if (User32GetImeShowStatus() == !lParam)
|
||||
{
|
||||
hImeWnd = UserHMGetHandle(pimeui->spwnd);
|
||||
NtUserCallHwndParamLock(hImeWnd, lParam, X_ROUTINE_IMESHOWSTATUSCHANGE);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x06:
|
||||
if (!hIMC)
|
||||
break;
|
||||
|
||||
bCompForm = TRUE;
|
||||
pIC = IMM_FN(ImmLockIMC)(hIMC);
|
||||
if (pIC)
|
||||
{
|
||||
bCompForm = !(pIC->dwUIFlags & 0x2);
|
||||
IMM_FN(ImmUnlockIMC)(hIMC);
|
||||
}
|
||||
|
||||
if (!IsWindow(pimeui->hwndIMC))
|
||||
break;
|
||||
|
||||
if (bCompForm && IMM_FN(ImmGetCompositionWindow)(hIMC, &CompForm))
|
||||
{
|
||||
if (CompForm.dwStyle)
|
||||
IMM_FN(ImmSetCompositionWindow)(hIMC, &CompForm);
|
||||
}
|
||||
|
||||
for (iCandForm = 0; iCandForm < MAX_CANDIDATEFORM; ++iCandForm)
|
||||
{
|
||||
if (IMM_FN(ImmGetCandidateWindow)(hIMC, iCandForm, &CandForm))
|
||||
{
|
||||
if (CandForm.dwStyle)
|
||||
IMM_FN(ImmSetCandidateWindow)(hIMC, &CandForm);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x09:
|
||||
pIC = IMM_FN(ImmLockIMC)(hIMC);
|
||||
if (!pIC)
|
||||
break;
|
||||
|
||||
pCandForm = &pIC->cfCandForm[lParam];
|
||||
IMM_FN(ImmSetCandidateWindow)(hIMC, pCandForm);
|
||||
IMM_FN(ImmUnlockIMC)(hIMC);
|
||||
break;
|
||||
|
||||
case 0x0A:
|
||||
pIC = IMM_FN(ImmLockIMC)(hIMC);
|
||||
if (!pIC)
|
||||
break;
|
||||
|
||||
IMM_FN(ImmSetCompositionFontW)(hIMC, &pIC->lfFont.W);
|
||||
IMM_FN(ImmUnlockIMC)(hIMC);
|
||||
break;
|
||||
|
||||
case 0x0B:
|
||||
pIC = IMM_FN(ImmLockIMC)(hIMC);
|
||||
if (!pIC)
|
||||
break;
|
||||
|
||||
pCompForm = &pIC->cfCompForm;
|
||||
pIC->dwUIFlags |= 0x8;
|
||||
IMM_FN(ImmSetCompositionWindow)(hIMC, pCompForm);
|
||||
IMM_FN(ImmUnlockIMC)(hIMC);
|
||||
break;
|
||||
|
||||
case 0x0D:
|
||||
IMM_FN(ImmConfigureIMEW)((HKL)lParam, pimeui->hwndIMC, IME_CONFIG_GENERAL, NULL);
|
||||
break;
|
||||
|
||||
case 0x0F:
|
||||
if (hIMC)
|
||||
IMM_FN(ImmSetOpenStatus)(hIMC, (BOOL)lParam);
|
||||
break;
|
||||
|
||||
case 0x11:
|
||||
ret = IMM_FN(ImmFreeLayout)((DWORD)lParam);
|
||||
break;
|
||||
|
||||
case 0x13:
|
||||
// TODO:
|
||||
break;
|
||||
|
||||
case 0x14:
|
||||
IMM_FN(ImmGetConversionStatus)(hIMC, &dwConversion, &dwSentence);
|
||||
ret = dwConversion;
|
||||
break;
|
||||
|
||||
case 0x15:
|
||||
// TODO:
|
||||
break;
|
||||
|
||||
case 0x17:
|
||||
User32SetImeActivenessOfWindow((HWND)lParam, TRUE);
|
||||
break;
|
||||
|
||||
case 0x18:
|
||||
User32SetImeActivenessOfWindow((HWND)lParam, FALSE);
|
||||
break;
|
||||
|
||||
case 0x19:
|
||||
ret = IMM_FN(ImmActivateLayout)((HKL)lParam);
|
||||
break;
|
||||
|
||||
case 0x1C:
|
||||
ret = IMM_FN(ImmPutImeMenuItemsIntoMappedFile)((HIMC)lParam);
|
||||
break;
|
||||
|
||||
case 0x1D:
|
||||
// TODO:
|
||||
break;
|
||||
|
||||
case 0x1E:
|
||||
ret = (ULONG_PTR)IMM_FN(ImmGetContext)((HWND)lParam);
|
||||
break;
|
||||
|
||||
case 0x1F:
|
||||
case 0x20:
|
||||
ret = IMM_FN(ImmSystemHandler)(hIMC, wParam, lParam);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) // ReactOS
|
||||
{
|
||||
PWND pWnd;
|
||||
|
@ -545,8 +708,17 @@ LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
|
|||
return 0;
|
||||
|
||||
case WM_IME_SYSTEM:
|
||||
// TODO:
|
||||
return 0;
|
||||
switch (wParam)
|
||||
{
|
||||
case 0x03:
|
||||
case 0x10:
|
||||
case 0x13:
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
|
@ -605,8 +777,7 @@ LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
|
|||
break;
|
||||
|
||||
case WM_IME_SYSTEM:
|
||||
// TODO:
|
||||
break;
|
||||
return ImeWnd_OnImeSystem(pimeui, wParam, lParam);
|
||||
|
||||
default:
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue