[IMM32] Rewrite ImmSetActiveContext (#3982)

- Re-implement ImmSetActiveContext function.
- Modify NtUserNotifyIMEStatus prototype.
- Improve ImmSetConversionStatus and ImmSetOpenStatus functions.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2021-10-01 03:02:56 +09:00 committed by GitHub
parent fc5d8e466f
commit 9adc538c9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 103 additions and 16 deletions

View file

@ -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)

View file

@ -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;
}
/***********************************************************************

View file

@ -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

View file

@ -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(