さて
こんにちは!
課題について。
if (SearchType == ImeInfoExKeyboardLayoutTFS)
{
if (!IS_IME_HKL(hKL))
{
ERR("!IS_IME_HKL: %p\n", hKL); // この行を追加。
if (!CtfImmIsTextFrameServiceDisabled() ||
!Imm32IsCiceroMode() || Imm32Is16BitMode())
{
return FALSE;
}
}
SearchType = ImeInfoExKeyboardLayout;
}
インストール前:
err:(dll/win32/imm32/ime.c:878) !IS_IME_HKL: F0010411
インストール後:
err:(dll/win32/imm32/ime.c:878) !IS_IME_HKL: 04110411
これは読み込まれているHKLが間違っているということ。
右下の言語切り替えでキーボードレイアウトを変更しようとすると
*** Assertion failed: pci->hKL == pti->KeyboardLayout->hkl
*** Source File: ../win32ss/user/ntuser/misc.c, line 751
Break repeatedly, break Once, Ignore, terminate Process or terminate Thread (boipt)?
kdb:>
ASSERT失敗する。この意味は、「pci->hKL と pti->KeyboardLayout->hkl の値が異なる」。 この議論の詳細は、https://jira.reactos.org/browse/CORE-18317 で行う。
右下の言語切り替えはkbswitch(base/applications/kbswitch)で実装されており、kbswitchに不具合があるかもしれない。
kbswitchを見ていこう。言語切り替え時に他のウィンドウにWM_INPUTLANGCHANGEREQUESTメッセージを送っているようだ(EnumWindowsProc関数)。
kbswitchのGetLayoutID関数。「HKEY_CURRENT_USER\Keyboard Layout\Preload」でレイアウト番号とレイアウト識別子の対を定義している。
Preload だから「読み込み前」の情報だ。
(レジストリエディタ(regedit)のレジストリキーはファイルへエクスポートできる。後でテキストエディタで開いて検証することが可能だ)
「HKEY_CURRENT_USER\Keyboard Layout\Substitutes」は、Substitutesの意味通り、レイアウト番号の置き換えにより、表示される順序を変えることができる。
kbswitchのGetLayoutIDByHkl関数。これはまずい。上の画像を見る限り、「E0010411」と「E0120411」の二つがある。 LOWORD(hKL)がどちらも0x0411になってしまう。IS_IME_HKLマクロを定義して場合分けした方がいいだろう。
input.dll(dll/cpl/input)について。リストを定義するファイルinput_list.hとlocale_list.hとlayout_list.hの三つがあって、 入力リストのINPUT_LIST_NODEは、ロケールリストのLOCALE_LIST_NODEへのポインタと、 レイアウトリストのLAYOUT_LIST_NODEへのポインタを所有している。
ロケールリストは、レジストリの「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language」とロケール情報から生成されている。
レイアウトリストは、レジストリの「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts」から生成されている。
肝心のリストビューのリストは、settings_page.c のAddToInputListView関数で入力リストを使って要素が追加されている。
...
item.pszText = pInputNode->pLocale->pszName;
...
その入力リストは、input_list.cのInputList_Create関数で作成されている。
LOCALE_LIST_NODE *pLocale = LocaleList_GetByHkl(pLayoutList[iIndex]);
LAYOUT_LIST_NODE *pLayout = LayoutList_GetByHkl(pLayoutList[iIndex]);
...
pInput->pLocale = pLocale;
pInput->pLayout = pLayout;
pInput->hkl = pLayoutList[iIndex];
ここでpLayoutList[iIndex]は、HKL型である。
ここでAddToInputListViewのitem.pszTextは、pInputNode->pLocale->pszNameだけでなく、pInput->pLayout->pszNameも見ないといけないことに気づくだろう。 LayoutList_GetByHklについてもIS_IME_HKLマクロを使って修正が必要だ。
#define IS_IME_HKL(hKL) ((((ULONG_PTR)(hKL)) & 0xF0000000) == 0xE0000000)
今日はここまで。
【課題】自由研究とする。
了解です