片手キーボードレイアウトを作成しようとしていますが、使用したい Hyper いくつかのキーを押すと、特別なキーが生成されます。
たとえば、私が押すと Hyper_L そして B、XKBに作成してほしい XF86AudioRaiseVolume。
custom_2.kbd
からの関連部分(完全なコード http://Pastebin.com/gm8cggn ):
xkb_keycodes {
<K_36> = 54; // b B XF86AudioRaiseVolume
<K_85> = 133; // Hyper_L
};
xkb_symbols {
key <K_36> { type = "HYPER_LEVEL", [ b, B, XF86AudioRaiseVolume ] };
key <K_85> { type = "ONE_LEVEL", [ Hyper_L ] };
};
xkb_compatibility {
interpret Hyper_L { action = SetMods(modifiers=Hyper); };
};
xkb_types {
type "HYPER_LEVEL" {
modifiers= Shift+Hyper;
map[Shift]= Level2;
map[Hyper]= Level3;
map[Shift+Hyper]= Level3;
};
};
私には問題ないようですが、試してみると次のようになります。
~$ xkbcomp custom_2.kbd $DISPLAY
Error: Identifier "Hyper" of type int is unknown
Error: Key type mask field must be a modifier mask
Key type definition ignored
Warning: Map entry for unused modifiers in HYPER_LEVEL
Using none instead of Shift
Error: Identifier "Hyper" of type int is unknown
Error: The key type map entry field must be a modifier mask
Ignoring illegal assignment in HYPER_LEVEL
Error: Identifier "Hyper" of type int is unknown
Error: The key type map entry field must be a modifier mask
Ignoring illegal assignment in HYPER_LEVEL
-> 1
(エラーコードは1です)
そして今、私は立ち往生しています。誰かがこれを機能させる方法を知っていますか?なしのソリューション Hyper 大丈夫です。
変更することにより Super そして Hyper に Mod4 そして Mod5、そのエラーはなくなります:
~$ xkbcomp custom_3.kbd
( no output )
~$ diff custom_{2,3}.kbd
188,190c188,190
< interpret Super_L { action = SetMods(modifiers=Super); };
< interpret Hyper_L { action = SetMods(modifiers=Hyper); };
< }c;
---
> interpret Super_L { action = SetMods(modifiers=Mod4); };
> interpret Hyper_L { action = SetMods(modifiers=Mod5); };
> };
204c204
< modifiers= Shift+Hyper;
---
> modifiers= Shift+Mod5;
206,207c206,207
< map[Hyper]= Level3;
< map[Shift+Hyper]= Level3;
---
> map[Mod5]= Level3;
> map[Shift+Mod5]= Level3;
ただし、それでも機能しません。
~$ xkbcomp custom_3.kbd $DISPLAY
Error: success in unknown
Couldn't write keyboard description to :0.0
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 135 (XKEYBOARD)
Minor opcode of failed request: 9 (XkbSetMap)
Value in failed request: 0x8010202
Serial number of failed request: 12
Current serial number in output stream: 14
-> 1
XKB自体にはまだいくつかの(無関係だと思います)問題がありますが、Hyper修飾子がマップされており、関連する設定は次のとおりです。
compat:
virtual_modifiers Shift,Control,Meta,Super,Hyper,AltGr;
interpret Hyper_R { action = SetMods(modifiers=Mod4); };
記号:
modifier_map Mod4 { <DELE> }; // Hyper
key <DELE> { type="UNMODIFIED", [ Hyper_R ], repeat=no };
その後のようなもの
key <K_36> { type = "SHIFT+HYPER", [ b, B,
XF86AudioRaiseVolume, XF86AudioRaiseVolume ] };
タイプ
virtual_modifiers Meta,AltGr,Super,Hyper,Mod5;
また、Mod5を使用している場合を除き、Mod5は必要ありません。同様に、Shift&Controlもここでは省略します…
type "SHIFT+HYPER" {
modifiers= Shift+Hyper;
map[Shift]= Level2;
map[Hyper]= Level3;
map[Shift+Hyper]= Level4;
};
それだけの価値があるために、ジオメトリとキーコードを再定義しようとする手間がずっとかかり、結果としてpc105
形式の<AE01>
キーシンボルに戻ってしまいました。それらはばかげて間違った名前が付けられています。 (例:ハイパーキーの場合は<DELE>
)
PS。実用的な例については、 https://github.com/brpocock/spacey-cadet-keyboard …を参照してください。