Skip to content

Latest commit

 

History

History
109 lines (75 loc) · 4.26 KB

2022-08-23.md

File metadata and controls

109 lines (75 loc) · 4.26 KB

2022-08-23

さて

こんにちは!

課題について。

        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」でレイアウト番号とレイアウト識別子の対を定義している。

image05.png

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)

今日はここまで。

【課題】自由研究とする。

了解です


戻る | 次へ