[IMM32] Implement Imm32ImeNonImeToggle (#4769)

- Rename Imm32ImeNonImeToggle as Imm32CImeNonImeToggle (Win: CIMENonIMEToggle).
- Add Imm32ImeNonImeToggle (Win: IMENonIMEToggle) function.
- Improve IME hot-key functions.
CORE-11700
This commit is contained in:
Katayama Hirofumi MZ 2022-10-13 07:14:24 +09:00 committed by GitHub
parent a3eda784a5
commit 31a33c5fcb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -13,18 +13,68 @@
WINE_DEFAULT_DEBUG_CHANNEL(imm); WINE_DEFAULT_DEBUG_CHANNEL(imm);
/* Win: IMENonIMEToggle */
BOOL APIENTRY Imm32ImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, BOOL bNowIME, LANGID LangID)
{
HKL hOldKL, LayoutList[32], hFoundKL = NULL;
UINT iLayout, nLayoutCount;
/* Get the previous layout */
hOldKL = (HKL)NtUserGetThreadState(THREADSTATE_OLDKEYBOARDLAYOUT);
/* Get the layout list */
nLayoutCount = GetKeyboardLayoutList(_countof(LayoutList), LayoutList);
/* Is there hOldKL in the list in the specified language ID? */
if (hOldKL && (LangID == 0 || LOWORD(hOldKL) == LangID))
{
for (iLayout = 0; iLayout < nLayoutCount; ++iLayout)
{
if (LayoutList[iLayout] == hOldKL)
{
hFoundKL = hOldKL;
break;
}
}
}
if (hFoundKL == NULL) /* Not found? */
{
/* Is there the keyboard layout of another kind in LangID? */
for (iLayout = 0; iLayout < nLayoutCount; ++iLayout)
{
if (bNowIME == ImmIsIME(LayoutList[iLayout])) /* Same kind? */
continue;
if (LangID == 0 || LangID == LOWORD(LayoutList[iLayout]))
{
hFoundKL = LayoutList[iLayout];
break;
}
}
}
if (hFoundKL && hKL != hFoundKL) /* Found and different layout */
{
PostMessageW(hWnd, WM_INPUTLANGCHANGEREQUEST, 1, (LPARAM)hFoundKL);
}
return ImmIsIME(hFoundKL);
}
/* Open or close the IME on Chinese or Taiwanese */
/* Win: CIMENonIMEToggle */ /* Win: CIMENonIMEToggle */
BOOL APIENTRY Imm32ImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID) BOOL APIENTRY Imm32CImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID)
{ {
LPINPUTCONTEXT pIC; LPINPUTCONTEXT pIC;
BOOL fOpen; BOOL fOpen;
if (hWnd != NULL) if (hWnd == NULL)
return FALSE; return FALSE;
if (!IS_IME_HKL(hKL) || LOWORD(hKL) != LangID) if (LOWORD(hKL) != LangID || !ImmIsIME(hKL))
{ {
FIXME("We have to do something here\n"); Imm32ImeNonImeToggle(hIMC, hKL, hWnd, FALSE, LangID);
return TRUE; return TRUE;
} }
@ -35,16 +85,15 @@ BOOL APIENTRY Imm32ImeNonImeToggle(HIMC hIMC, HKL hKL, HWND hWnd, LANGID LangID)
fOpen = pIC->fOpen; fOpen = pIC->fOpen;
ImmUnlockIMC(hIMC); ImmUnlockIMC(hIMC);
if (!fOpen) if (fOpen)
{ Imm32ImeNonImeToggle(hIMC, hKL, hWnd, TRUE, 0);
else
ImmSetOpenStatus(hIMC, TRUE); ImmSetOpenStatus(hIMC, TRUE);
return TRUE;
}
FIXME("We have to do something here\n");
return TRUE; return TRUE;
} }
/* Toggle shape mode on Chinese or Taiwanese */
/* Win: TShapeToggle */ /* Win: TShapeToggle */
BOOL APIENTRY Imm32CShapeToggle(HIMC hIMC, HKL hKL, HWND hWnd) BOOL APIENTRY Imm32CShapeToggle(HIMC hIMC, HKL hKL, HWND hWnd)
{ {
@ -52,7 +101,7 @@ BOOL APIENTRY Imm32CShapeToggle(HIMC hIMC, HKL hKL, HWND hWnd)
BOOL fOpen; BOOL fOpen;
DWORD dwConversion, dwSentence; DWORD dwConversion, dwSentence;
if (hWnd == NULL || !IS_IME_HKL(hKL)) if (hWnd == NULL || !ImmIsIME(hKL))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
@ -83,7 +132,7 @@ BOOL APIENTRY Imm32CSymbolToggle(HIMC hIMC, HKL hKL, HWND hWnd)
BOOL fOpen; BOOL fOpen;
DWORD dwConversion, dwSentence; DWORD dwConversion, dwSentence;
if (hWnd == NULL || !IS_IME_HKL(hKL)) if (hWnd == NULL || !ImmIsIME(hKL))
return FALSE; return FALSE;
pIC = ImmLockIMC(hIMC); pIC = ImmLockIMC(hIMC);
@ -107,19 +156,31 @@ BOOL APIENTRY Imm32CSymbolToggle(HIMC hIMC, HKL hKL, HWND hWnd)
return TRUE; return TRUE;
} }
/* Open or close Japanese IME */
/* Win: JCloseOpen */ /* Win: JCloseOpen */
BOOL APIENTRY Imm32JCloseOpen(HIMC hIMC, HKL hKL, HWND hWnd) BOOL APIENTRY Imm32JCloseOpen(HIMC hIMC, HKL hKL, HWND hWnd)
{ {
BOOL fOpen; BOOL fOpen;
LPINPUTCONTEXTDX pIC;
if (ImmIsIME(hKL) && LOWORD(hKL) == LANGID_JAPANESE) if (LOWORD(hKL) == LANGID_JAPANESE && ImmIsIME(hKL)) /* Japanese IME is selected */
{ {
fOpen = ImmGetOpenStatus(hIMC); fOpen = ImmGetOpenStatus(hIMC);
ImmSetOpenStatus(hIMC, !fOpen); ImmSetOpenStatus(hIMC, !fOpen);
return TRUE; return TRUE;
} }
FIXME("We have to do something here\n"); /* Japanese IME is not selected. Select now */
if (Imm32ImeNonImeToggle(hIMC, hKL, hWnd, FALSE, LANGID_JAPANESE))
{
pIC = (LPINPUTCONTEXTDX)ImmLockIMC(hIMC);
if (pIC)
{
pIC->dwChange |= INPUTCONTEXTDX_CHANGE_OPEN; /* Notify open change */
ImmUnlockIMC(hIMC);
}
}
return TRUE; return TRUE;
} }
@ -198,7 +259,7 @@ BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID
switch (dwHotKeyID) switch (dwHotKeyID)
{ {
case IME_CHOTKEY_IME_NONIME_TOGGLE: case IME_CHOTKEY_IME_NONIME_TOGGLE:
return Imm32ImeNonImeToggle(hIMC, hKL, hWnd, LANGID_CHINESE_SIMPLIFIED); return Imm32CImeNonImeToggle(hIMC, hKL, hWnd, LANGID_CHINESE_SIMPLIFIED);
case IME_CHOTKEY_SHAPE_TOGGLE: case IME_CHOTKEY_SHAPE_TOGGLE:
return Imm32CShapeToggle(hIMC, hKL, hWnd); return Imm32CShapeToggle(hIMC, hKL, hWnd);
@ -219,7 +280,7 @@ BOOL APIENTRY Imm32ProcessHotKey(HWND hWnd, HIMC hIMC, HKL hKL, DWORD dwHotKeyID
return Imm32KEnglish(hIMC); return Imm32KEnglish(hIMC);
case IME_THOTKEY_IME_NONIME_TOGGLE: case IME_THOTKEY_IME_NONIME_TOGGLE:
return Imm32ImeNonImeToggle(hIMC, hKL, hWnd, LANGID_CHINESE_TRADITIONAL); return Imm32CImeNonImeToggle(hIMC, hKL, hWnd, LANGID_CHINESE_TRADITIONAL);
case IME_THOTKEY_SHAPE_TOGGLE: case IME_THOTKEY_SHAPE_TOGGLE:
return Imm32CShapeToggle(hIMC, hKL, hWnd); return Imm32CShapeToggle(hIMC, hKL, hWnd);