mirror of
https://github.com/reactos/reactos.git
synced 2025-05-07 18:56:48 +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,
|
Imm32NotifyAction(hIMC, hWnd, NI_CONTEXTUPDATED, 0,
|
||||||
IMC_SETOPENSTATUS, IMN_SETOPENSTATUS, 0);
|
IMC_SETOPENSTATUS, IMN_SETOPENSTATUS, 0);
|
||||||
NtUserNotifyIMEStatus(hWnd, hIMC, dwConversion);
|
NtUserNotifyIMEStatus(hWnd, fOpen, dwConversion);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1346,7 +1346,7 @@ BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSent
|
||||||
HKL hKL;
|
HKL hKL;
|
||||||
LPINPUTCONTEXT pIC;
|
LPINPUTCONTEXT pIC;
|
||||||
DWORD dwOldConversion, dwOldSentence;
|
DWORD dwOldConversion, dwOldSentence;
|
||||||
BOOL fConversionChange = FALSE, fSentenceChange = FALSE, fUseCicero = FALSE;
|
BOOL fOpen = FALSE, fConversionChange = FALSE, fSentenceChange = FALSE, fUseCicero = FALSE;
|
||||||
HWND hWnd;
|
HWND hWnd;
|
||||||
|
|
||||||
TRACE("(%p, 0x%lX, 0x%lX)\n", hIMC, fdwConversion, fdwSentence);
|
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;
|
hWnd = pIC->hWnd;
|
||||||
|
fOpen = pIC->fOpen;
|
||||||
ImmUnlockIMC(hIMC);
|
ImmUnlockIMC(hIMC);
|
||||||
|
|
||||||
if (fConversionChange || fUseCicero)
|
if (fConversionChange || fUseCicero)
|
||||||
|
@ -1384,7 +1385,7 @@ BOOL WINAPI ImmSetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSent
|
||||||
Imm32NotifyAction(hIMC, hWnd, NI_CONTEXTUPDATED, dwOldConversion,
|
Imm32NotifyAction(hIMC, hWnd, NI_CONTEXTUPDATED, dwOldConversion,
|
||||||
IMC_SETCONVERSIONMODE, IMN_SETCONVERSIONMODE, 0);
|
IMC_SETCONVERSIONMODE, IMN_SETCONVERSIONMODE, 0);
|
||||||
if (fConversionChange)
|
if (fConversionChange)
|
||||||
NtUserNotifyIMEStatus(hWnd, hIMC, fdwConversion);
|
NtUserNotifyIMEStatus(hWnd, fOpen, fdwConversion);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fSentenceChange || fUseCicero)
|
if (fSentenceChange || fUseCicero)
|
||||||
|
|
|
@ -169,6 +169,11 @@ static InputContextData* get_imc_data(HIMC hIMC)
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID APIENTRY Imm32CiceroSetActiveContext(HIMC hIMC, BOOL fActive, HWND hWnd, HKL hKL)
|
||||||
|
{
|
||||||
|
FIXME("We have to do something\n");
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* ImmAssociateContext (IMM32.@)
|
* ImmAssociateContext (IMM32.@)
|
||||||
*/
|
*/
|
||||||
|
@ -1314,10 +1319,96 @@ BOOL WINAPI ImmEnumInputContext(DWORD dwThreadId, IMCENUMPROC lpfn, LPARAM lPara
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* ImmSetActiveContext(IMM32.@)
|
* 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);
|
PCLIENTIMC pClientImc;
|
||||||
return FALSE;
|
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 */
|
/* flags for CLIENTIMC */
|
||||||
#define CLIENTIMC_WIDE 0x1
|
#define CLIENTIMC_WIDE 0x1
|
||||||
|
#define CLIENTIMC_UNKNOWN5 0x2
|
||||||
|
#define CLIENTIMC_UNKNOWN4 0x20
|
||||||
#define CLIENTIMC_UNKNOWN1 0x40
|
#define CLIENTIMC_UNKNOWN1 0x40
|
||||||
#define CLIENTIMC_UNKNOWN3 0x80
|
#define CLIENTIMC_UNKNOWN3 0x80
|
||||||
#define CLIENTIMC_UNKNOWN2 0x100
|
#define CLIENTIMC_UNKNOWN2 0x100
|
||||||
|
@ -2769,10 +2771,7 @@ NtUserMoveWindow(
|
||||||
|
|
||||||
DWORD
|
DWORD
|
||||||
NTAPI
|
NTAPI
|
||||||
NtUserNotifyIMEStatus(
|
NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion);
|
||||||
HWND hwnd,
|
|
||||||
HIMC hIMC,
|
|
||||||
DWORD dwConversion);
|
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
NTAPI
|
NTAPI
|
||||||
|
|
|
@ -49,16 +49,12 @@ NtUserGetImeHotKey(IN DWORD dwHotKey,
|
||||||
|
|
||||||
DWORD
|
DWORD
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtUserNotifyIMEStatus(
|
NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
|
||||||
HWND hwnd,
|
|
||||||
HIMC hIMC,
|
|
||||||
DWORD dwConversion)
|
|
||||||
{
|
{
|
||||||
TRACE("NtUserNotifyIMEStatus(%p, %p, 0x%lX)\n", hwnd, hIMC, dwConversion);
|
TRACE("NtUserNotifyIMEStatus(%p, %d, 0x%lX)\n", hwnd, fOpen, dwConversion);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
DWORD
|
DWORD
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtUserSetImeHotKey(
|
NtUserSetImeHotKey(
|
||||||
|
|
Loading…
Reference in a new issue