[IMM32] Fix and improve Imm32SelectInputContext

CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-10-21 11:22:00 +09:00
parent edbeaa3c87
commit b086f910d8

View file

@ -180,8 +180,8 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
LPCOMPOSITIONSTRING pCS; LPCOMPOSITIONSTRING pCS;
LOGFONTA LogFontA; LOGFONTA LogFontA;
LOGFONTW LogFontW; LOGFONTW LogFontW;
BOOL fOpen, bIsNewHKLIme = TRUE, bIsOldHKLIme = TRUE, bClientWide, bNewDpiWide; BOOL fOldOpen, bIsNewHKLIme = TRUE, bIsOldHKLIme = TRUE, bClientWide, bNewDpiWide;
DWORD cbNewPrivate = 0, cbOldPrivate = 0, dwConversion, dwSentence, dwSize, dwNewSize; DWORD cbNewPrivate = 0, cbOldPrivate = 0, dwOldConversion, dwOldSentence, dwSize, dwNewSize;
PIMEDPI pNewImeDpi = NULL, pOldImeDpi = NULL; PIMEDPI pNewImeDpi = NULL, pOldImeDpi = NULL;
HANDLE hPrivate; HANDLE hPrivate;
PIME_STATE pNewState = NULL, pOldState = NULL; PIME_STATE pNewState = NULL, pOldState = NULL;
@ -205,14 +205,11 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
pClientImc->uCodePage = CP_ACP; pClientImc->uCodePage = CP_ACP;
} }
if (cbNewPrivate < sizeof(DWORD))
cbNewPrivate = sizeof(DWORD);
if (pOldImeDpi) if (pOldImeDpi)
cbOldPrivate = pOldImeDpi->ImeInfo.dwPrivateDataSize; cbOldPrivate = pOldImeDpi->ImeInfo.dwPrivateDataSize;
if (cbOldPrivate < sizeof(DWORD)) cbNewPrivate = max(cbNewPrivate, sizeof(DWORD));
cbOldPrivate = sizeof(DWORD); cbOldPrivate = max(cbOldPrivate, sizeof(DWORD));
if (pClientImc->hKL == hOldKL) if (pClientImc->hKL == hOldKL)
{ {
@ -226,13 +223,10 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
pClientImc->hKL = NULL; pClientImc->hKL = NULL;
} }
if (CtfImmIsTextFrameServiceDisabled()) if (CtfImmIsTextFrameServiceDisabled() && IS_CICERO_MODE() && !IS_16BIT_MODE())
{ {
if (IS_IMM_MODE() && !IS_CICERO_MODE()) bIsNewHKLIme = IS_IME_HKL(hNewKL);
{ bIsOldHKLIme = IS_IME_HKL(hOldKL);
bIsNewHKLIme = IS_IME_HKL(hNewKL);
bIsOldHKLIme = IS_IME_HKL(hOldKL);
}
} }
pIC = (LPINPUTCONTEXTDX)Imm32InternalLockIMC(hIMC, FALSE); pIC = (LPINPUTCONTEXTDX)Imm32InternalLockIMC(hIMC, FALSE);
@ -250,9 +244,9 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
} }
else else
{ {
dwConversion = pIC->fdwConversion; dwOldConversion = pIC->fdwConversion;
dwSentence = pIC->fdwSentence; dwOldSentence = pIC->fdwSentence;
fOpen = pIC->fOpen; fOldOpen = pIC->fOpen;
if (pNewImeDpi) if (pNewImeDpi)
{ {
@ -359,7 +353,8 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
if (pOldState) if (pOldState)
{ {
pOldState->fOpen = !!pIC->fOpen; pOldState->fOpen = !!pIC->fOpen;
pOldState->dwConversion = (pIC->fdwConversion & ~IME_CMODE_EUDC); pOldState->dwConversion = pIC->fdwConversion;
pOldState->dwConversion &= ~IME_CMODE_EUDC;
pOldState->dwSentence = pIC->fdwSentence; pOldState->dwSentence = pIC->fdwSentence;
pOldState->dwInit = pIC->fdwInit; pOldState->dwInit = pIC->fdwInit;
} }
@ -376,7 +371,8 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
pIC->fOpen = pNewState->fOpen; pIC->fOpen = pNewState->fOpen;
} }
pIC->fdwConversion = (pNewState->dwConversion & ~IME_CMODE_EUDC); pIC->fdwConversion = pNewState->dwConversion;
pIC->fdwConversion &= ~IME_CMODE_EUDC;
pIC->fdwSentence = pNewState->dwSentence; pIC->fdwSentence = pNewState->dwSentence;
pIC->fdwInit = pNewState->dwInit; pIC->fdwInit = pNewState->dwInit;
} }
@ -396,11 +392,11 @@ VOID APIENTRY Imm32SelectInputContext(HKL hNewKL, HKL hOldKL, HIMC hIMC)
} }
pIC->dwChange = 0; pIC->dwChange = 0;
if (pIC->fOpen != fOpen) if (pIC->fOpen != fOldOpen)
pIC->dwChange |= INPUTCONTEXTDX_CHANGE_OPEN; pIC->dwChange |= INPUTCONTEXTDX_CHANGE_OPEN;
if (pIC->fdwConversion != dwConversion) if (pIC->fdwConversion != dwOldConversion)
pIC->dwChange |= INPUTCONTEXTDX_CHANGE_CONVERSION; pIC->dwChange |= INPUTCONTEXTDX_CHANGE_CONVERSION;
if (pIC->fdwSentence != dwSentence) if (pIC->fdwSentence != dwOldSentence)
pIC->dwChange |= INPUTCONTEXTDX_CHANGE_SENTENCE; pIC->dwChange |= INPUTCONTEXTDX_CHANGE_SENTENCE;
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);