xkbでISO_Level4_Shiftを作成してロックする方法は?

xkbでISO_Level4_Shiftを作成してロックする方法は?

Shift + ISO_Level3_Shift(別名AltGr)を使用する代わりに、xkbがレベル4修飾子またはロックにキーを設定できるかどうか疑問に思います。

レベル6、7、8と同じ問題です(「EIGHT_LEVEL」またはバリアントを使用)。

レベル3とレベル5はどちらも大丈夫ですが、他のものはなぜできませんか?

ベストアンサー1

可能ですが、少しハッキーです。特定のキーシンボルが定義されていません。 ISO_Level3_{Shift,Latch,Lock}(level5の場合でも同じ3つ)は、X11およびlibxkbcommonヘッダーでコンパイル時に定義されます。

compatibility実行時にinterpretセクションと;を介してactionsモジュールで有効になります。たとえば、現在のキーマップを確認してください。

$ xkbcomp $DISPLAY - | less

//....
xkb_compatibility "complete+ledcaps(shift_lock)" {
    //....
    interpret ISO_Level3_Shift+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= SetMods(modifiers=LevelThree,clearLocks);
    };
    interpret ISO_Level3_Latch+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
    };
    interpret ISO_Level3_Lock+AnyOf(all) {
        virtualModifier= LevelThree;
        useModMapMods=level1;
        action= LockMods(modifiers=LevelThree);
    };
    //....
    interpret ISO_Level3_Shift+AnyOfOrNone(all) {
        action= SetMods(modifiers=LevelThree,clearLocks);
    };
    interpret ISO_Level3_Latch+AnyOfOrNone(all) {
        action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock);
    };
    interpret ISO_Level3_Lock+AnyOfOrNone(all) {
        action= LockMods(modifiers=LevelThree);
    };
//....

既存のキー記号がありますISO_Level2_Latchinterpret上記の既存の互換性セクションはありませんが、追加すると期待どおりに機能します。 (Shiftすでに存在しているためISO_Level2_Shift必要ありません。Shift_LockまたはCaps_Lock置き換えられますISO_Level2_Lock。) したがって、キーが必要な場合は、キー記号をShift_Latch使用してISO_Level2_Latchキーマップに追加します。

    interpret ISO_Level2_Latch+AnyOf(all) {
        useModMapMods=level1;
        action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
    };
    interpret ISO_Level2_Latch+AnyOfOrNone(all) {
        action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
    };

ISO_Level4_Shiftこの方法はレベル4、6、7、8で使用できますが、事前定義されたキー記号などはありません。これをコードに追加して再コンパイルしたり、使用されていない一部のキーシンボルの目的を変更して、レベル4シフト(またはラッチまたはロック)として解釈することができます。ヘッダファイルを調べてみると、libxkbcommonXKBに知られているすべての主要なシンボル名が私たちの目的に適しているようです。

//....in xkbcommon/xkbcommon-keysyms.h:
//....
#define XKB_KEY_ISO_Fast_Cursor_Left          0xfe2c
#define XKB_KEY_ISO_Fast_Cursor_Right         0xfe2d
#define XKB_KEY_ISO_Fast_Cursor_Up            0xfe2e
#define XKB_KEY_ISO_Fast_Cursor_Down          0xfe2f

XKB_KEY_XKBルールで参照できるキーシンボル名を取得するには、プレフィックスを削除してください。ISO_Fast_Cursor_Left偽物を使ってみましょうISO_Level4_Latch

まず、次を使用して主キーマップを作成しますsetxkbmap -print。次に、このファイルを編集し、それに上書きを追加し、最後に次を使用して変更されたキーマップをロードしますxkbcomp [file] $DISPLAY

$ setxkbmap -print > mykeymap.xkb
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us(altgr-intl)+inet(evdev)" };
    xkb_geometry  { include "pc(pc105)" };
};

このファイルを編集し、必要な上書きを入力します。

// Attempting to define and use a key as Level4 Shift/Latch/Lock.
// Plan: * activate lv5 shift on rctrl.
//       * place latches on lv5 of keys 2,3,4,5 for corresponding level.
//       * replace keys ASDF with 8-level versions and define symbols for test.
//       * pressing RCtrl+4 then A should result in Á

// starting point: setxkbmap -layout us -variant altgr-intl -option '' -print
// load this file: xkbcomp myfile.xkb $DISPLAY
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"      };
    xkb_compat    { 
        include "complete"      

        // add in interpretations
        // ISO_Level3_Latch includes a +AnyOf stanza and a +AnyOfOrNone stanza (same for ISO_Level5_Latch)
        // assume each additional latch needs both
        interpret ISO_Level2_Latch+AnyOf(all) {
            useModMapMods=level1;
            action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
        };
        interpret ISO_Level2_Latch+AnyOfOrNone(all) {
            action= LatchMods(modifiers=Shift,clearLocks,latchToLock);
        };
        interpret ISO_Fast_Cursor_Left+AnyOf(all) {
            // Level4 needs both Shift and LevelThree
            useModMapMods=level1;
            action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
        };
        interpret ISO_Fast_Cursor_Left+AnyOfOrNone(all) {
            // Level4 needs both Shift and LevelThree
            action= LatchMods(modifiers=Shift+LevelThree,clearLocks,latchToLock);
        };
    };
    xkb_symbols   { 
        include "pc"
        include "us(altgr-intl)"
        include "inet(evdev)"

        // latch keys
        key <AE02> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 2, at, twosuperior, dead_doubleacute, ISO_Level2_Latch, X, z, Z ]
        };
        key <AE03> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 3, numbersign, threesuperior, dead_macron, ISO_Level3_Latch, X, z, Z ]
        };
        // no ISO_Level4_Latch so use ISO_Fast_Cursor_Left
        key <AE04> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 4, dollar, currency, sterling, ISO_Fast_Cursor_Left, X, z, Z ]
        };
        key <AE05> {
            type= "EIGHT_LEVEL",
            symbols[Group1]= [ 5, percent, EuroSign, dead_cedilla, ISO_Level5_Latch, X, z, Z ]
        };
        // no ISO_Level6_Latch so use ISO_Fast_Cursor_Right
        // no ISO_Level7_Latch so use ISO_Fast_Cursor_Up
        // no ISO_Level8_Latch so use ISO_Fast_Cursor_Down

        // eight-level keys ASDF for testing
        key <AC01> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ a, A, aacute, Aacute, agrave, Agrave, aring, Aring ]
        };
        key <AC02> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ s, S, ssharp, section, ccedilla, Ccedilla, ntilde, Ntilde ]
        };
        key <AC03> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ d, D, eth, ETH, thorn, THORN, t, T ]
        };
        key <AC04> {
            type= "EIGHT_LEVEL_SEMIALPHABETIC",
            symbols[Group1]= [ f, F, eacute, Eacute, x, X, z, Z ]
        };

        // ISO_Level3_Shift on Right Alt
        include "level3(ralt_switch)"
        // ISO_Level5_Shift on Right Ctrl
        include "level5(rctrl_switch)"  
    };
    xkb_geometry  { include "pc(pc105)"     };
};

これでクラスプをテストできます(上記の例では右クリックする必要があります。ISO_Level5_ShiftそうCtrlxkbcompない場合は、コマンドを再実行してください)。

  • ISO_Level5_Shift+2その後、a印刷する必要がありますA
  • ISO_Level5_Shift+3その後、a印刷する必要がありますá
  • ISO_Level5_Shift+4その後、a印刷する必要がありますÁ
  • ISO_Level5_Shift+5その後、a印刷する必要がありますà

テストでは、RCtrl-as-level5-shiftが少し不安定で、常に正しく適用されていないことを確認しました。通常、xkbcompコマンドを1〜2回再実行すると機能します。Aまたは、キーを使用してFテストすると、Ctrl+Dシェルが終了する可能性があります。


一部のアプリは、私たちが借りたキーボード記号を認識していないので、奇妙なことをするかもしれません。たとえば、Firefoxは4正しいラッチが有効になると偶数を印刷するため、キーシーケンスがrctrl+4 then a発生します。これは3と5の実際のキーシンボルでは発生しないため、他のキーシンボルを借用するとFirefoxは何も印刷しないことに気づくでしょう。これまで、ほとんどの端末アプリケーションは期待どおりに動作しています。

おすすめ記事