mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[IMM32] Rewrite ImmSetActiveContext (#3982)
- Re-implement ImmSetActiveContext function. - Modify NtUserNotifyIMEStatus prototype. - Improve ImmSetConversionStatus and ImmSetOpenStatus functions. CORE-11700
This commit is contained in:
parent
fc5d8e466f
commit
9adc538c9c
4 changed files with 103 additions and 16 deletions
|
@ -911,7 +911,7 @@ BOOL WINAPI ImmSetOpenStatus(HIMC hIMC, BOOL fOpen)
|
|||
{
|
||||
Imm32NotifyAction(hIMC, hWnd, NI_CONTEXTUPDATED, 0,
|
||||
IMC_SETOPENSTATUS, IMN_SETOPENSTATUS, 0);
|
||||
NtUserNotifyIMEStatus(hWnd, hIMC, dwConversion);
|
||||
NtUserNotifyIMEStatus(hWnd, fOpen, dwConversion);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
@ -1346,7 +1346,7 @@ BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSent
|
|||
HKL hKL;
|
||||
LPINPUTCONTEXT pIC;
|
||||
DWORD dwOldConversion, dwOldSentence;
|
||||
BOOL fConversionChange = FALSE, fSentenceChange = FALSE, fUseCicero = FALSE;
|
||||
BOOL fOpen = FALSE, fConversionChange = FALSE, fSentenceChange = FALSE, fUseCicero = FALSE;
|
||||
HWND hWnd;
|
||||
|
||||
TRACE("(%p, 0x%lX, 0x%lX)\n", hIMC, fdwConversion, fdwSentence);
|
||||
|
@ -1377,6 +1377,7 @@ BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSent
|
|||
}
|
||||
|
||||
hWnd = pIC->hWnd;
|
||||
fOpen = pIC->fOpen;
|
||||
ImmUnlockIMC(hIMC);
|
||||
|
||||
if (fConversionChange || fUseCicero)
|
||||
|
@ -1384,7 +1385,7 @@ BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSent
|
|||
Imm32NotifyAction(hIMC, hWnd, NI_CONTEXTUPDATED, dwOldConversion,
|
||||
IMC_SETCONVERSIONMODE, IMN_SETCONVERSIONMODE, 0);
|
||||
if (fConversionChange)
|
||||
NtUserNotifyIMEStatus(hWnd, hIMC, fdwConversion);
|
||||
NtUserNotifyIMEStatus(hWnd, fOpen, fdwConversion);
|
||||
}
|
||||
|
||||
if (fSentenceChange || fUseCicero)
|
||||
|
|
|
@ -169,6 +169,11 @@ static InputContextData* get_imc_data(HIMC hIMC)
|
|||
return data;
|
||||
}
|
||||
|
||||
static VOID APIENTRY Imm32CiceroSetActiveContext(HIMC hIMC, BOOL fActive, HWND hWnd, HKL hKL)
|
||||
{
|
||||
FIXME("We have to do something\n");
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* ImmAssociateContext (IMM32.@)
|
||||
*/
|
||||
|
@ -1314,10 +1319,96 @@ BOOL WINAPI ImmEnumInputContext(DWORD dwThreadId, IMCENUMPROC lpfn, LPARAM lPara
|
|||
/***********************************************************************
|
||||
* ImmSetActiveContext(IMM32.@)
|
||||
*/
|
||||
BOOL WINAPI ImmSetActiveContext(HWND hwnd, HIMC hIMC, BOOL fFlag)
|
||||
BOOL WINAPI ImmSetActiveContext(HWND hWnd, HIMC hIMC, BOOL fActive)
|
||||
{
|
||||
FIXME("(%p, %p, %d): stub\n", hwnd, hIMC, fFlag);
|
||||
return FALSE;
|
||||
PCLIENTIMC pClientImc;
|
||||
LPINPUTCONTEXTDX pIC;
|
||||
PIMEDPI pImeDpi;
|
||||
HKL hKL;
|
||||
BOOL fOpen = FALSE;
|
||||
DWORD dwConversion = 0, iShow = ISC_SHOWUIALL;
|
||||
HWND hwndDefIME;
|
||||
|
||||
TRACE("(%p, %p, %d)\n", hWnd, hIMC, fActive);
|
||||
|
||||
if (!Imm32IsImmMode())
|
||||
return FALSE;
|
||||
|
||||
pClientImc = ImmLockClientImc(hIMC);
|
||||
|
||||
if (!fActive)
|
||||
{
|
||||
if (pClientImc)
|
||||
pClientImc->dwFlags &= ~CLIENTIMC_UNKNOWN4;
|
||||
}
|
||||
else if (hIMC)
|
||||
{
|
||||
if (!pClientImc)
|
||||
return FALSE;
|
||||
|
||||
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
|
||||
if (!pIC)
|
||||
{
|
||||
ImmUnlockClientImc(pClientImc);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pIC->hWnd = hWnd;
|
||||
pClientImc->dwFlags |= CLIENTIMC_UNKNOWN5;
|
||||
|
||||
if (pIC->dwUIFlags & 2)
|
||||
iShow = (ISC_SHOWUIGUIDELINE | ISC_SHOWUIALLCANDIDATEWINDOW);
|
||||
|
||||
fOpen = pIC->fOpen;
|
||||
dwConversion = pIC->fdwConversion;
|
||||
|
||||
ImmUnlockIMC(hIMC);
|
||||
}
|
||||
else
|
||||
{
|
||||
hIMC = Imm32GetContextEx(hWnd, TRUE);
|
||||
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
|
||||
if (pIC)
|
||||
{
|
||||
pIC->hWnd = hWnd;
|
||||
ImmUnlockIMC(hIMC);
|
||||
}
|
||||
hIMC = NULL;
|
||||
}
|
||||
|
||||
hKL = GetKeyboardLayout(0);
|
||||
|
||||
if (Imm32IsCiceroMode() && !Imm32Is16BitMode())
|
||||
{
|
||||
Imm32CiceroSetActiveContext(hIMC, fActive, hWnd, hKL);
|
||||
hKL = GetKeyboardLayout(0);
|
||||
}
|
||||
|
||||
pImeDpi = ImmLockImeDpi(hKL);
|
||||
if (pImeDpi)
|
||||
{
|
||||
if (IS_IME_HKL(hKL))
|
||||
pImeDpi->ImeSetActiveContext(hIMC, fActive);
|
||||
ImmUnlockImeDpi(pImeDpi);
|
||||
}
|
||||
|
||||
if (IsWindow(hWnd))
|
||||
{
|
||||
SendMessageW(hWnd, WM_IME_SETCONTEXT, fActive, iShow);
|
||||
if (fActive)
|
||||
NtUserNotifyIMEStatus(hWnd, fOpen, dwConversion);
|
||||
}
|
||||
else if (!fActive)
|
||||
{
|
||||
hwndDefIME = ImmGetDefaultIMEWnd(NULL);
|
||||
if (hwndDefIME)
|
||||
SendMessageW(hwndDefIME, WM_IME_SETCONTEXT, 0, iShow);
|
||||
}
|
||||
|
||||
if (pClientImc)
|
||||
ImmUnlockClientImc(pClientImc);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
|
|
@ -1312,6 +1312,8 @@ C_ASSERT(sizeof(CLIENTIMC) == 0x34);
|
|||
|
||||
/* flags for CLIENTIMC */
|
||||
#define CLIENTIMC_WIDE 0x1
|
||||
#define CLIENTIMC_UNKNOWN5 0x2
|
||||
#define CLIENTIMC_UNKNOWN4 0x20
|
||||
#define CLIENTIMC_UNKNOWN1 0x40
|
||||
#define CLIENTIMC_UNKNOWN3 0x80
|
||||
#define CLIENTIMC_UNKNOWN2 0x100
|
||||
|
@ -2769,10 +2771,7 @@ NtUserMoveWindow(
|
|||
|
||||
DWORD
|
||||
NTAPI
|
||||
NtUserNotifyIMEStatus(
|
||||
HWND hwnd,
|
||||
HIMC hIMC,
|
||||
DWORD dwConversion);
|
||||
NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion);
|
||||
|
||||
BOOL
|
||||
NTAPI
|
||||
|
|
|
@ -49,16 +49,12 @@ NtUserGetImeHotKey(IN DWORD dwHotKey,
|
|||
|
||||
DWORD
|
||||
APIENTRY
|
||||
NtUserNotifyIMEStatus(
|
||||
HWND hwnd,
|
||||
HIMC hIMC,
|
||||
DWORD dwConversion)
|
||||
NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
|
||||
{
|
||||
TRACE("NtUserNotifyIMEStatus(%p, %p, 0x%lX)\n", hwnd, hIMC, dwConversion);
|
||||
TRACE("NtUserNotifyIMEStatus(%p, %d, 0x%lX)\n", hwnd, fOpen, dwConversion);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
DWORD
|
||||
APIENTRY
|
||||
NtUserSetImeHotKey(
|
||||
|
|
Loading…
Reference in a new issue