XKBを勉強してリベンジを試みる
なんか色々と試していたら入力周りがぶっ壊れた。
多分、知らない設定を知らぬ間に弄って元に戻せなくなったのだろうと思うが、日本語入力ではなくて直接入力にしても変換中みたいな下線が出てカーソルが動かずアルファベット以外のキーを打つまで未確定みたいな動きになってしまいました。
fcitxとfcitx-mozcを再インストールしたら一応その点については直ったので記事作成を再開します。
前回記事『カーソル&ポインタ操作を効率化する』で結局xmodmapじゃダメでした。という、やっぱり方方で書かれていた『今はxkbでやるべき』みたいな話は本当だったのか……と、いうところで終わってしまったのですが、ようやく見つけたこちらのドキュメント『Custom keyboard layout definitions - Community Help Wiki』。
まあ別にここでもxmodmapはダメと書かれているわけではなくて、載っている情報がひたすらxkbのことばかりでしたので、あぁやっぱりもうxmodmapは手が入っていないというか過去の遺産というか、放置みたいな感じなのだろうか? と勝手に筆者は解釈致しました。
実は筆者はxmodmapによるキーコンフィグを実施する以前にxkbでキーコンフィグをしていた時期もありまして、時代に逆行しとるやんけ、ってな感じなのですが、xkbってなんかムズいじゃないですか。
ただ、今回ちょっとキーコンフィグ周りで色々と調べて来て、まだ全然抜けだらけではあるものの、どれもこれもさっぱり分からんという感じだった以前よりかは幾分かマシな理解が出来るかもしれない、と思ってこの際xkbに再チャレンジしてみます。
まぁ、ふわふわとした筆者の現在の感想からすると、確かにいくつかのディレクトリに分かれて、各ディレクトリに設定ファイルが山ほどあるxkbは設定同士の組み合わせとかincludeのネストで追って行くが非常に大変ではあるのですが、ノリとしては世界各個の地域差を小ブロックにまとめて、必要な設定を組み合わせて各自の環境に合わせていく、という割ときっちり理屈で分割された設定群なのであるのだろうなぁ、というくらいの認識にはなりましたので、良く分からないBlackBoxだった以前よりかは怖いものではなくなった気がします。
そういう目で改めて色々なドキュメントを眺めていると、今まで使用されている定義の意味がさっぱり分からなくてちっとも理解できなかったものが、ある程度「こういうことかな?」と予想が付けられる部分も出てきたりしまして、一応「こうやったら出来そうだけど」というところまでは来ることが出来たので、今こうして忘れないうちにと記事化しています。
さて、キーボード等からの入力で発生するEventcodeと処理されるxmodmapのKeycodeにはいくつか謎に噛み合わない部分があったのですが、今回はそれのxkb版と言いますか、よりEventcodeとマッチしていて如何にも「今はxmodmapじゃなくてxkbなんです」という感じを裏付ける資料が見つかったので、まずはそれを貼り付けたいと思います。
この手の調べ物をしているとArchLinuxのドキュメントにお世話になることが多いのですが、しかし筆者のメインPCはXubuntuですので、Archとは違うところも多々あるわけです。
例えばxkbの設定を書く時に使っている『<XXXX>』という4桁の文字。これの定義がどこにあるのかさっぱり分かりません。Arch以外の情報も含めて、筆者の環境で実際にコレと思われる定義ファイルを指し示してくれている情報は皆無で、結局筆者は自力で見当を付けて探し出しました。
xkbの設定を書く時に使う4桁の文字をKeycodeにマッピングしている定義ファイルだと思われるものが、筆者の環境では「/usr/share/X11/xkb/keycodes/evdev」にありました。
ここにある定義はやはりxmodmapと同じようにEventcodeに対して+8オフセットされているものの、xmodmapよりもきっちりと定義が目一杯されており、xmodmapでは尻切れトンボだったEventcode248もKeycode256としてしっかり存在しています。
また、Eventcodeの方はその先もまだ続いてキーボードのEventcodeとしては0x2bcつまり700まで定義があったのですが、こちらのevdevファイルでもちゃんと708(+8オフセットされるので)まで定義があり、程よくマッチングしていました。
Keycode256の手前に「// Key codes below cannot be used in X」(ここから下はXでは使えないよ)と書かれていたのと、evdevの定義が<Innn>(nnnはKeycode10進数表現)という単純な形でコメントで対応するEventcodeが記載されているだけというシンプルな形になっていますので、ここではEventcode1〜248、Keycode9〜256の部分だけをコード順に並べて整理したものを貼り付けておきます。
なお、これは筆者の現時点の環境ではこうなっていた、というだけでも他でも同じ保証はありませんのでご了承ください。
あと、オマケでxmodmapの状態も対応させて貼り付けておきます。
InputEventCode | evdevKeycode | xmodmapKeycode |
---|---|---|
keycode 8 = | ||
KEY_ESC 1 | <ESC> = 9; | keycode 9 = Escape NoSymbol Escape |
KEY_1 2 | <AE01> = 10; | keycode 10 = 1 exclam 1 exclam |
KEY_2 3 | <AE02> = 11; | keycode 11 = 2 quotedbl 2 quotedbl |
KEY_3 4 | <AE03> = 12; | keycode 12 = 3 numbersign 3 numbersign |
KEY_4 5 | <AE04> = 13; | keycode 13 = 4 dollar 4 dollar |
KEY_5 6 | <AE05> = 14; | keycode 14 = 5 percent 5 percent |
KEY_6 7 | <AE06> = 15; | keycode 15 = 6 ampersand 6 ampersand |
KEY_7 8 | <AE07> = 16; | keycode 16 = 7 apostrophe 7 apostrophe |
KEY_8 9 | <AE08> = 17; | keycode 17 = 8 parenleft 8 parenleft |
KEY_9 10 | <AE09> = 18; | keycode 18 = 9 parenright 9 parenright |
KEY_0 11 | <AE10> = 19; | keycode 19 = 0 asciitilde 0 asciitilde |
KEY_MINUS 12 | <AE11> = 20; | keycode 20 = minus equal minus equal |
KEY_EQUAL 13 | <AE12> = 21; | keycode 21 = asciicircum asciitilde asciicircum asciitilde |
KEY_BACKSPACE 14 | <BKSP> = 22; | keycode 22 = BackSpace BackSpace BackSpace BackSpace |
KEY_TAB 15 | <TAB> = 23; | keycode 23 = Tab ISO_Left_Tab Tab ISO_Left_Tab |
KEY_Q 16 | <AD01> = 24; | keycode 24 = q Q q Q |
KEY_W 17 | <AD02> = 25; | keycode 25 = w W w W |
KEY_E 18 | <AD03> = 26; | keycode 26 = e E e E |
KEY_R 19 | <AD04> = 27; | keycode 27 = r R r R |
KEY_T 20 | <AD05> = 28; | keycode 28 = t T t T |
KEY_Y 21 | <AD06> = 29; | keycode 29 = y Y y Y |
KEY_U 22 | <AD07> = 30; | keycode 30 = u U u U |
KEY_I 23 | <AD08> = 31; | keycode 31 = i I i I |
KEY_O 24 | <AD09> = 32; | keycode 32 = o O o O |
KEY_P 25 | <AD10> = 33; | keycode 33 = p P p P |
KEY_LEFTBRACE 26 | <AD11> = 34; | keycode 34 = at grave at grave |
KEY_RIGHTBRACE 27 | <AD12> = 35; | keycode 35 = bracketleft braceleft bracketleft braceleft |
KEY_ENTER 28 | <RTRN> = 36; | keycode 36 = Return NoSymbol Return |
KEY_LEFTCTRL 29 | <LCTL> = 37; | keycode 37 = Control_L NoSymbol Control_L |
KEY_A 30 | <AC01> = 38; | keycode 38 = a A a A |
KEY_S 31 | <AC02> = 39; | keycode 39 = s S s S |
KEY_D 32 | <AC03> = 40; | keycode 40 = d D d D |
KEY_F 33 | <AC04> = 41; | keycode 41 = f F f F |
KEY_G 34 | <AC05> = 42; | keycode 42 = g G g G |
KEY_H 35 | <AC06> = 43; | keycode 43 = h H h H |
KEY_J 36 | <AC07> = 44; | keycode 44 = j J j J |
KEY_K 37 | <AC08> = 45; | keycode 45 = k K k K |
KEY_L 38 | <AC09> = 46; | keycode 46 = l L l L |
KEY_SEMICOLON 39 | <AC10> = 47; | keycode 47 = semicolon plus semicolon plus |
KEY_APOSTROPHE 40 | <AC11> = 48; | keycode 48 = colon asterisk colon asterisk |
KEY_GRAVE 41 | <TLDE> = 49; alias <HZTG> = <TLDE>;// Hankaku/Zenkaku toggle | keycode 49 = Zenkaku_Hankaku Kanji Zenkaku_Hankaku Kanji |
KEY_LEFTSHIFT 42 | <LFSH> = 50; | keycode 50 = Shift_L NoSymbol Shift_L |
KEY_BACKSLASH 43 | <BKSL> = 51; alias <AC12> = <BKSL>; | keycode 51 = bracketright braceright bracketright braceright |
KEY_Z 44 | <AB01> = 52; | keycode 52 = z Z z Z |
KEY_X 45 | <AB02> = 53; | keycode 53 = x X x X |
KEY_C 46 | <AB03> = 54; | keycode 54 = c C c C |
KEY_V 47 | <AB04> = 55; | keycode 55 = v V v V |
KEY_B 48 | <AB05> = 56; | keycode 56 = b B b B |
KEY_N 49 | <AB06> = 57; | keycode 57 = n N n N |
KEY_M 50 | <AB07> = 58; | keycode 58 = m M m M |
KEY_COMMA 51 | <AB08> = 59; | keycode 59 = comma less comma less |
KEY_DOT 52 | <AB09> = 60; | keycode 60 = period greater period greater |
KEY_SLASH 53 | <AB10> = 61; | keycode 61 = slash question slash question |
KEY_RIGHTSHIFT 54 | <RTSH> = 62; | keycode 62 = Shift_R NoSymbol Shift_R |
KEY_KPASTERISK 55 | <KPMU> = 63; | keycode 63 = KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply KP_Multiply XF86ClearGrab |
KEY_LEFTALT 56 | <LALT> = 64; | keycode 64 = Alt_L Meta_L Alt_L Meta_L |
KEY_SPACE 57 | <SPCE> = 65; | keycode 65 = space NoSymbol space |
KEY_CAPSLOCK 58 | <CAPS> = 66; | keycode 66 = Eisu_toggle Caps_Lock Eisu_toggle Caps_Lock |
KEY_F1 59 | <FK01> = 67; | keycode 67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1 |
KEY_F2 60 | <FK02> = 68; | keycode 68 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2 |
KEY_F3 61 | <FK03> = 69; | keycode 69 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3 |
KEY_F4 62 | <FK04> = 70; | keycode 70 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4 |
KEY_F5 63 | <FK05> = 71; | keycode 71 = F5 F5 F5 F5 F5 F5 XF86Switch_VT_5 |
KEY_F6 64 | <FK06> = 72; | keycode 72 = F6 F6 F6 F6 F6 F6 XF86Switch_VT_6 |
KEY_F7 65 | <FK07> = 73; | keycode 73 = F7 F7 F7 F7 F7 F7 XF86Switch_VT_7 |
KEY_F8 66 | <FK08> = 74; | keycode 74 = F8 F8 F8 F8 F8 F8 XF86Switch_VT_8 |
KEY_F9 67 | <FK09> = 75; | keycode 75 = F9 F9 F9 F9 F9 F9 XF86Switch_VT_9 |
KEY_F10 68 | <FK10> = 76; | keycode 76 = F10 F10 F10 F10 F10 F10 XF86Switch_VT_10 |
KEY_NUMLOCK 69 | <NMLK> = 77; | keycode 77 = Num_Lock NoSymbol Num_Lock |
KEY_SCROLLLOCK 70 | <SCLK> = 78; | keycode 78 = Scroll_Lock NoSymbol Scroll_Lock |
KEY_KP7 71 | <KP7> = 79; | keycode 79 = KP_Home KP_7 KP_Home KP_7 |
KEY_KP8 72 | <KP8> = 80; | keycode 80 = KP_Up KP_8 KP_Up KP_8 |
KEY_KP9 73 | <KP9> = 81; | keycode 81 = KP_Prior KP_9 KP_Prior KP_9 |
KEY_KPMINUS 74 | <KPSU> = 82; | keycode 82 = KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract KP_Subtract XF86Prev_VMode |
KEY_KP4 75 | <KP4> = 83; | keycode 83 = KP_Left KP_4 KP_Left KP_4 |
KEY_KP5 76 | <KP5> = 84; | keycode 84 = KP_Begin KP_5 KP_Begin KP_5 |
KEY_KP6 77 | <KP6> = 85; | keycode 85 = KP_Right KP_6 KP_Right KP_6 |
KEY_KPPLUS 78 | <KPAD> = 86; | keycode 86 = KP_Add KP_Add KP_Add KP_Add KP_Add KP_Add XF86Next_VMode |
KEY_KP1 79 | <KP1> = 87; | keycode 87 = KP_End KP_1 KP_End KP_1 |
KEY_KP2 80 | <KP2> = 88; | keycode 88 = KP_Down KP_2 KP_Down KP_2 |
KEY_KP3 81 | <KP3> = 89; | keycode 89 = KP_Next KP_3 KP_Next KP_3 |
KEY_KP0 82 | <KP0> = 90; | keycode 90 = KP_Insert KP_0 KP_Insert KP_0 |
KEY_KPDOT 83 | <KPDL> = 91; | keycode 91 = KP_Delete KP_Decimal KP_Delete KP_Decimal |
<LVL3> = 92; | keycode 92 = ISO_Level3_Shift NoSymbol ISO_Level3_Shift | |
KEY_ZENKAKUHANKAKU 85 | keycode 93 = | |
KEY_102ND 86 | <LSGT> = 94; | keycode 94 = less greater less greater bar brokenbar bar |
KEY_F11 87 | <FK11> = 95; | keycode 95 = F11 F11 F11 F11 F11 F11 XF86Switch_VT_11 |
KEY_F12 88 | <FK12> = 96; | keycode 96 = F12 F12 F12 F12 F12 F12 XF86Switch_VT_12 |
KEY_RO 89 | <AB11> = 97; // backslash/underscore | keycode 97 = backslash underscore backslash underscore |
KEY_KATAKANA 90 | <KATA> = 98; // Katakana | keycode 98 = Katakana NoSymbol Katakana |
KEY_HIRAGANA 91 | <HIRA> = 99; // Hiragana | keycode 99 = Hiragana NoSymbol Hiragana |
KEY_HENKAN 92 | <HENK> = 100; // Henkan | keycode 100 = Henkan_Mode NoSymbol Henkan_Mode |
KEY_KATAKANAHIRAGANA 93 | <HKTG> = 101; // Hiragana/Katakana toggle | keycode 101 = Hiragana_Katakana Romaji Hiragana_Katakana Romaji |
KEY_MUHENKAN 94 | <MUHE> = 102; // Muhenkan | keycode 102 = Muhenkan NoSymbol Muhenkan |
KEY_KPJPCOMMA 95 | <JPCM> = 103; // KPJPComma | keycode 103 = |
KEY_KPENTER 96 | <KPEN> = 104; | keycode 104 = KP_Enter NoSymbol KP_Enter |
KEY_RIGHTCTRL 97 | <RCTL> = 105; | keycode 105 = Control_R NoSymbol Control_R |
KEY_KPSLASH 98 | <KPDV> = 106; | keycode 106 = KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide KP_Divide XF86Ungrab |
KEY_SYSRQ 99 | <PRSC> = 107; | keycode 107 = Print Execute Print Execute |
KEY_RIGHTALT 100 | <RALT> = 108; alias <ALGR> = <RALT>; | keycode 108 = Alt_R Meta_R Alt_R Meta_R |
KEY_LINEFEED 101 | <LNFD> = 109; // #define KEY_LINEFEED 101 | keycode 109 = Linefeed NoSymbol Linefeed |
KEY_HOME 102 | <HOME> = 110; | keycode 110 = Home NoSymbol Home |
KEY_UP 103 | <UP> = 111; | keycode 111 = Up NoSymbol Up |
KEY_PAGEUP 104 | <PGUP> = 112; | keycode 112 = Prior NoSymbol Prior |
KEY_LEFT 105 | <LEFT> = 113; | keycode 113 = Left NoSymbol Left |
KEY_RIGHT 106 | <RGHT> = 114; | keycode 114 = Right NoSymbol Right |
KEY_END 107 | <END> = 115; | keycode 115 = End NoSymbol End |
KEY_DOWN 108 | <DOWN> = 116; | keycode 116 = Down NoSymbol Down |
KEY_PAGEDOWN 109 | <PGDN> = 117; | keycode 117 = Next NoSymbol Next |
KEY_INSERT 110 | <INS> = 118; | keycode 118 = Insert NoSymbol Insert |
KEY_DELETE 111 | <DELE> = 119; | keycode 119 = Delete NoSymbol Delete |
KEY_MACRO 112 | <I120> = 120; // #define KEY_MACRO 112 | keycode 120 = |
KEY_MUTE 113 | <MUTE> = 121; alias <I121> = <MUTE>; // #define KEY_MUTE 113 | keycode 121 = XF86AudioMute NoSymbol XF86AudioMute |
KEY_VOLUMEDOWN 114 | <VOL-> = 122; alias <I122> = <VOL->; // #define KEY_VOLUMEDOWN 114 | keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume |
KEY_VOLUMEUP 115 | <VOL+> = 123; alias <I123> = <VOL+>; // #define KEY_VOLUMEUP 115 | keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume |
KEY_POWER 116 /* SC System Power Down */ | <POWR> = 124; alias <I124> = <POWR>; // #define KEY_POWER 116 | keycode 124 = XF86PowerOff NoSymbol XF86PowerOff |
KEY_KPEQUAL 117 | <KPEQ> = 125; alias <I125> = <KPEQ>; // #define KEY_KPEQUAL 117 | keycode 125 = KP_Equal NoSymbol KP_Equal |
KEY_KPPLUSMINUS 118 | <I126> = 126; // #define KEY_KPPLUSMINUS 118 | keycode 126 = plusminus NoSymbol plusminus |
KEY_PAUSE 119 | <PAUS> = 127; alias <I127> = <PAUS>; // #define KEY_PAUSE 119 | keycode 127 = Pause Break Pause Break |
KEY_SCALE 120 /* AL Compiz Scale (Expose) */ | <I128> = 128; // #define KEY_SCALE 120 | keycode 128 = XF86LaunchA NoSymbol XF86LaunchA |
KEY_KPCOMMA 121 | <I129> = 129; // #define KEY_KPCOMMA 121 alias <KPPT> = <I129>; | keycode 129 = KP_Decimal KP_Decimal KP_Decimal KP_Decimal |
KEY_HANGEUL 122 KEY_HANGUEL KEY_HANGEUL | <HNGL> = 130; // Hangul Latin toggle alias <I130> = <HNGL>; // #define KEY_HANGEUL 122 | keycode 130 = Hangul NoSymbol Hangul |
KEY_HANJA 123 | <HJCV> = 131; // Hangul to Hanja conversion alias <I131> = <HJCV>; // #define KEY_HANJA 123 | keycode 131 = Hangul_Hanja NoSymbol Hangul_Hanja |
KEY_YEN 124 | <AE13> = 132; // Yen alias <I132> = <AE13>; // #define KEY_YEN 124 | keycode 132 = backslash bar backslash bar |
KEY_LEFTMETA 125 | <LWIN> = 133; alias <LMTA> = <LWIN>; alias <I133> = <LWIN>; // #define KEY_LEFTMETA 125 | keycode 133 = Super_L NoSymbol Super_L |
KEY_RIGHTMETA 126 | <RWIN> = 134; alias <RMTA> = <RWIN>; alias <I134> = <RWIN>; // #define KEY_RIGHTMETA 126 | keycode 134 = Super_R NoSymbol Super_R |
KEY_COMPOSE 127 | <COMP> = 135; alias <MENU> = <COMP>; alias <I135> = <COMP>; // #define KEY_COMPOSE 127 | keycode 135 = Menu NoSymbol Menu |
KEY_STOP 128 /* AC Stop */ | <STOP> = 136; alias <I136> = <STOP>; // #define KEY_STOP 128 | keycode 136 = Cancel NoSymbol Cancel |
KEY_AGAIN 129 | <AGAI> = 137; alias <I137> = <AGAI>; // #define KEY_AGAIN 129 | keycode 137 = Redo NoSymbol Redo |
KEY_PROPS 130 /* AC Properties */ | <PROP> = 138; alias <I138> = <PROP>; // #define KEY_PROPS 130 | keycode 138 = SunProps NoSymbol SunProps |
KEY_UNDO 131 /* AC Undo */ | <UNDO> = 139; alias <I139> = <UNDO>; // #define KEY_UNDO 131 | keycode 139 = Undo NoSymbol Undo |
KEY_FRONT 132 | <FRNT> = 140; alias <I140> = <FRNT>; // #define KEY_FRONT 132 | keycode 140 = SunFront NoSymbol SunFront |
KEY_COPY 133 /* AC Copy */ | <COPY> = 141; alias <I141> = <COPY>; // #define KEY_COPY 133 | keycode 141 = XF86Copy NoSymbol XF86Copy |
KEY_OPEN 134 /* AC Open */ | <OPEN> = 142; alias <I142> = <OPEN>; // #define KEY_OPEN 134 | keycode 142 = XF86Open NoSymbol XF86Open |
KEY_PASTE 135 /* AC Paste */ | <PAST> = 143; alias <I143> = <PAST>; // #define KEY_PASTE 135 | keycode 143 = XF86Paste NoSymbol XF86Paste |
KEY_FIND 136 /* AC Search */ | <FIND> = 144; alias <I144> = <FIND>; // #define KEY_FIND 136 | keycode 144 = Find NoSymbol Find |
KEY_CUT 137 /* AC Cut */ | <CUT> = 145; alias <I145> = <CUT>; // #define KEY_CUT 137 | keycode 145 = XF86Cut NoSymbol XF86Cut |
KEY_HELP 138 /* AL Integrated Help Center */ | <HELP> = 146; alias <I146> = <HELP>; // #define KEY_HELP 138 | keycode 146 = Help NoSymbol Help |
KEY_MENU 139 /* Menu (show menu) */ | <I147> = 147; // #define KEY_MENU 139 | keycode 147 = XF86MenuKB NoSymbol XF86MenuKB |
KEY_CALC 140 /* AL Calculator */ | <I148> = 148; // #define KEY_CALC 140 | keycode 148 = XF86Calculator NoSymbol XF86Calculator |
KEY_SETUP 141 | <I149> = 149; // #define KEY_SETUP 141 | keycode 149 = |
KEY_SLEEP 142 /* SC System Sleep */ | <I150> = 150; // #define KEY_SLEEP 142 | keycode 150 = XF86Sleep NoSymbol XF86Sleep |
KEY_WAKEUP 143 /* System Wake Up */ | <I151> = 151; // #define KEY_WAKEUP 143 | keycode 151 = XF86WakeUp NoSymbol XF86WakeUp |
KEY_FILE 144 /* AL Local Machine Browser */ | <I152> = 152; // #define KEY_FILE 144 | keycode 152 = XF86Explorer NoSymbol XF86Explorer |
KEY_SENDFILE 145 | <I153> = 153; // #define KEY_SENDFILE 145 | keycode 153 = XF86Send NoSymbol XF86Send |
KEY_DELETEFILE 146 | <I154> = 154; // #define KEY_DELETEFILE 146 | keycode 154 = |
KEY_XFER 147 | <I155> = 155; // #define KEY_XFER 147 | keycode 155 = XF86Xfer NoSymbol XF86Xfer |
KEY_PROG1 148 | <I156> = 156; // #define KEY_PROG1 148 | keycode 156 = XF86Launch1 NoSymbol XF86Launch1 |
KEY_PROG2 149 | <I157> = 157; // #define KEY_PROG2 149 | keycode 157 = XF86Launch2 NoSymbol XF86Launch2 |
KEY_WWW 150 /* AL Internet Browser */ | <I158> = 158; // #define KEY_WWW 150 | keycode 158 = XF86WWW NoSymbol XF86WWW |
KEY_MSDOS 151 | <I159> = 159; // #define KEY_MSDOS 151 | keycode 159 = XF86DOS NoSymbol XF86DOS |
KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */ KEY_SCREENLOCK KEY_COFFEE | <I160> = 160; // #define KEY_COFFEE 152 | keycode 160 = XF86ScreenSaver NoSymbol XF86ScreenSaver |
KEY_ROTATE_DISPLAY 153 /* Display orientation for e.g. tablets */ KEY_DIRECTION KEY_ROTATE_DISPLAY | <I161> = 161; // #define KEY_ROTATE_DISPLAY 153 | keycode 161 = XF86RotateWindows NoSymbol XF86RotateWindows |
KEY_CYCLEWINDOWS 154 | <I162> = 162; // #define KEY_CYCLEWINDOWS 154 | keycode 162 = XF86TaskPane NoSymbol XF86TaskPane |
KEY_MAIL 155 | <I163> = 163; // #define KEY_MAIL 155 | keycode 163 = XF86Mail NoSymbol XF86Mail |
KEY_BOOKMARKS 156 /* AC Bookmarks */ | <I164> = 164; // #define KEY_BOOKMARKS 156 | keycode 164 = XF86Favorites NoSymbol XF86Favorites |
KEY_COMPUTER 157 | <I165> = 165; // #define KEY_COMPUTER 157 | keycode 165 = XF86MyComputer NoSymbol XF86MyComputer |
KEY_BACK 158 /* AC Back */ | <I166> = 166; // #define KEY_BACK 158 | keycode 166 = XF86Back NoSymbol XF86Back |
KEY_FORWARD 159 /* AC Forward */ | <I167> = 167; // #define KEY_FORWARD 159 | keycode 167 = XF86Forward NoSymbol XF86Forward |
KEY_CLOSECD 160 | <I168> = 168; // #define KEY_CLOSECD 160 | keycode 168 = |
KEY_EJECTCD 161 | <I169> = 169; // #define KEY_EJECTCD 161 | keycode 169 = XF86Eject NoSymbol XF86Eject |
KEY_EJECTCLOSECD 162 | <I170> = 170; // #define KEY_EJECTCLOSECD 162 | keycode 170 = XF86Eject NoSymbol XF86Eject |
KEY_NEXTSONG 163 | <I171> = 171; // #define KEY_NEXTSONG 163 | keycode 171 = XF86AudioNext NoSymbol XF86AudioNext |
KEY_PLAYPAUSE 164 | <I172> = 172; // #define KEY_PLAYPAUSE 164 | keycode 172 = XF86AudioPlay XF86AudioPause XF86AudioPlay XF86AudioPause |
KEY_PREVIOUSSONG 165 | <I173> = 173; // #define KEY_PREVIOUSSONG 165 | keycode 173 = XF86AudioPrev NoSymbol XF86AudioPrev |
KEY_STOPCD 166 | <I174> = 174; // #define KEY_STOPCD 166 | keycode 174 = XF86AudioStop XF86Eject XF86AudioStop XF86Eject |
KEY_RECORD 167 | <I175> = 175; // #define KEY_RECORD 167 | keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord |
KEY_REWIND 168 | <I176> = 176; // #define KEY_REWIND 168 | keycode 176 = XF86AudioRewind NoSymbol XF86AudioRewind |
KEY_PHONE 169 /* Media Select Telephone */ | <I177> = 177; // #define KEY_PHONE 169 | keycode 177 = XF86Phone NoSymbol XF86Phone |
KEY_ISO 170 | <I178> = 178; // #define KEY_ISO 170 | keycode 178 = |
KEY_CONFIG 171 /* AL Consumer Control Configuration */ | <I179> = 179; // #define KEY_CONFIG 171 | keycode 179 = XF86Tools NoSymbol XF86Tools |
KEY_HOMEPAGE 172 /* AC Home */ | <I180> = 180; // #define KEY_HOMEPAGE 172 | keycode 180 = XF86HomePage NoSymbol XF86HomePage |
KEY_REFRESH 173 /* AC Refresh */ | <I181> = 181; // #define KEY_REFRESH 173 | keycode 181 = XF86Reload NoSymbol XF86Reload |
KEY_EXIT 174 /* AC Exit */ | <I182> = 182; // #define KEY_EXIT 174 | keycode 182 = XF86Close NoSymbol XF86Close |
KEY_MOVE 175 | <I183> = 183; // #define KEY_MOVE 175 | keycode 183 = |
KEY_EDIT 176 | <I184> = 184; // #define KEY_EDIT 176 | keycode 184 = |
KEY_SCROLLUP 177 | <I185> = 185; // #define KEY_SCROLLUP 177 | keycode 185 = XF86ScrollUp NoSymbol XF86ScrollUp |
KEY_SCROLLDOWN 178 | <I186> = 186; // #define KEY_SCROLLDOWN 178 | keycode 186 = XF86ScrollDown NoSymbol XF86ScrollDown |
KEY_KPLEFTPAREN 179 | <I187> = 187; // #define KEY_KPLEFTPAREN 179 | keycode 187 = parenleft NoSymbol parenleft |
KEY_KPRIGHTPAREN 180 | <I188> = 188; // #define KEY_KPRIGHTPAREN 180 | keycode 188 = parenright NoSymbol parenright |
KEY_NEW 181 /* AC New */ | <I189> = 189; // #define KEY_NEW 181 | keycode 189 = XF86New NoSymbol XF86New |
KEY_REDO 182 /* AC Redo/Repeat */ | <I190> = 190; // #define KEY_REDO 182 | keycode 190 = Redo NoSymbol Redo |
KEY_F13 183 | <FK13> = 191; alias <I191> = <FK13>; // #define KEY_F13 183 | keycode 191 = XF86Tools NoSymbol XF86Tools |
KEY_F14 184 | <FK14> = 192; alias <I192> = <FK14>; // #define KEY_F14 184 | keycode 192 = XF86Launch5 NoSymbol XF86Launch5 |
KEY_F15 185 | <FK15> = 193; alias <I193> = <FK15>; // #define KEY_F15 185 | keycode 193 = XF86Launch6 NoSymbol XF86Launch6 |
KEY_F16 186 | <FK16> = 194; alias <I194> = <FK16>; // #define KEY_F16 186 | keycode 194 = XF86Launch7 NoSymbol XF86Launch7 |
KEY_F17 187 | <FK17> = 195; alias <I195> = <FK17>; // #define KEY_F17 187 | keycode 195 = XF86Launch8 NoSymbol XF86Launch8 |
KEY_F18 188 | <FK18> = 196; alias <I196> = <FK18>; // #define KEY_F18 188 | keycode 196 = XF86Launch9 NoSymbol XF86Launch9 |
KEY_F19 189 | <FK19> = 197; alias <I197> = <FK19>; // #define KEY_F19 189 | keycode 197 = |
KEY_F20 190 | <FK20> = 198; alias <I198> = <FK20>; // #define KEY_F20 190 | keycode 198 = XF86AudioMicMute NoSymbol XF86AudioMicMute |
KEY_F21 191 | <FK21> = 199; alias <I199> = <FK21>; // #define KEY_F21 191 | keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle |
KEY_F22 192 | <FK22> = 200; alias <I200> = <FK22>; // #define KEY_F22 192 | keycode 200 = XF86TouchpadOn NoSymbol XF86TouchpadOn |
KEY_F23 193 | <FK23> = 201; alias <I201> = <FK23>; // #define KEY_F23 193 | keycode 201 = XF86TouchpadOff NoSymbol XF86TouchpadOff |
KEY_F24 194 | <FK24> = 202; alias <I202> = <FK24>; // #define KEY_F24 194 | keycode 202 = |
<LVL5> = 203; alias <MDSW> = <LVL5>; | keycode 203 = ISO_Level5_Shift NoSymbol ISO_Level5_Shift | |
<ALT> = 204; | keycode 204 = NoSymbol Alt_L NoSymbol Alt_L | |
<META> = 205; | keycode 205 = NoSymbol Meta_L NoSymbol Meta_L | |
<SUPR> = 206; | keycode 206 = NoSymbol Super_L NoSymbol Super_L | |
<HYPR> = 207; | keycode 207 = NoSymbol Hyper_L NoSymbol Hyper_L | |
KEY_PLAYCD 200 | <I208> = 208; // #define KEY_PLAYCD 200 | keycode 208 = XF86AudioPlay NoSymbol XF86AudioPlay |
KEY_PAUSECD 201 | <I209> = 209; // #define KEY_PAUSECD 201 | keycode 209 = XF86AudioPause NoSymbol XF86AudioPause |
KEY_PROG3 202 | <I210> = 210; // #define KEY_PROG3 202 | keycode 210 = XF86Launch3 NoSymbol XF86Launch3 |
KEY_PROG4 203 | <I211> = 211; // #define KEY_PROG4 203 | keycode 211 = XF86Launch4 NoSymbol XF86Launch4 |
KEY_ALL_APPLICATIONS 204 /* AC Desktop Show All Applications */ KEY_DASHBOARD KEY_ALL_APPLICATIONS | <I212> = 212; // #define KEY_DASHBOARD 204 | keycode 212 = XF86LaunchB NoSymbol XF86LaunchB |
KEY_SUSPEND 205 | <I213> = 213; // #define KEY_SUSPEND 205 | keycode 213 = XF86Suspend NoSymbol XF86Suspend |
KEY_CLOSE 206 /* AC Close */ | <I214> = 214; // #define KEY_CLOSE 206 | keycode 214 = XF86Close NoSymbol XF86Close |
KEY_PLAY 207 | <I215> = 215; // #define KEY_PLAY 207 | keycode 215 = XF86AudioPlay NoSymbol XF86AudioPlay |
KEY_FASTFORWARD 208 | <I216> = 216; // #define KEY_FASTFORWARD 208 | keycode 216 = XF86AudioForward NoSymbol XF86AudioForward |
KEY_BASSBOOST 209 | <I217> = 217; // #define KEY_BASSBOOST 209 | keycode 217 = |
KEY_PRINT 210 /* AC Print */ | <I218> = 218; // #define KEY_PRINT 210 | keycode 218 = Print NoSymbol Print |
KEY_HP 211 | <I219> = 219; // #define KEY_HP 211 | keycode 219 = |
KEY_CAMERA 212 | <I220> = 220; // #define KEY_CAMERA 212 | keycode 220 = XF86WebCam NoSymbol XF86WebCam |
KEY_SOUND 213 | <I221> = 221; // #define KEY_SOUND 213 | keycode 221 = XF86AudioPreset NoSymbol XF86AudioPreset |
KEY_QUESTION 214 | <I222> = 222; // #define KEY_QUESTION 214 | keycode 222 = |
KEY_EMAIL 215 | <I223> = 223; // #define KEY_EMAIL 215 | keycode 223 = XF86Mail NoSymbol XF86Mail |
KEY_CHAT 216 | <I224> = 224; // #define KEY_CHAT 216 | keycode 224 = XF86Messenger NoSymbol XF86Messenger |
KEY_SEARCH 217 | <I225> = 225; // #define KEY_SEARCH 217 | keycode 225 = XF86Search NoSymbol XF86Search |
KEY_CONNECT 218 | <I226> = 226; // #define KEY_CONNECT 218 | keycode 226 = XF86Go NoSymbol XF86Go |
KEY_FINANCE 219 /* AL Checkbook/Finance */ | <I227> = 227; // #define KEY_FINANCE 219 | keycode 227 = XF86Finance NoSymbol XF86Finance |
KEY_SPORT 220 | <I228> = 228; // #define KEY_SPORT 220 | keycode 228 = XF86Game NoSymbol XF86Game |
KEY_SHOP 221 | <I229> = 229; // #define KEY_SHOP 221 | keycode 229 = XF86Shop NoSymbol XF86Shop |
KEY_ALTERASE 222 | <I230> = 230; // #define KEY_ALTERASE 222 | keycode 230 = |
KEY_CANCEL 223 /* AC Cancel */ | <I231> = 231; // #define KEY_CANCEL 223 | keycode 231 = Cancel NoSymbol Cancel |
KEY_BRIGHTNESSDOWN 224 | <I232> = 232; // #define KEY_BRIGHTNESSDOWN 224 | keycode 232 = XF86MonBrightnessDown NoSymbol XF86MonBrightnessDown |
KEY_BRIGHTNESSUP 225 | <I233> = 233; // #define KEY_BRIGHTNESSUP 225 | keycode 233 = XF86MonBrightnessUp NoSymbol XF86MonBrightnessUp |
KEY_MEDIA 226 | <I234> = 234; // #define KEY_MEDIA 226 | keycode 234 = XF86AudioMedia NoSymbol XF86AudioMedia |
KEY_SWITCHVIDEOMODE 227 /* Cycle between available video outputs (Monitor/LCD/TV-out/etc) */ | <I235> = 235; // #define KEY_SWITCHVIDEOMODE 227 | keycode 235 = XF86Display NoSymbol XF86Display |
KEY_KBDILLUMTOGGLE 228 | <I236> = 236; // #define KEY_KBDILLUMTOGGLE 228 | keycode 236 = XF86KbdLightOnOff NoSymbol XF86KbdLightOnOff |
KEY_KBDILLUMDOWN 229 | <I237> = 237; // #define KEY_KBDILLUMDOWN 229 | keycode 237 = XF86KbdBrightnessDown NoSymbol XF86KbdBrightnessDown |
KEY_KBDILLUMUP 230 | <I238> = 238; // #define KEY_KBDILLUMUP 230 | keycode 238 = XF86KbdBrightnessUp NoSymbol XF86KbdBrightnessUp |
KEY_SEND 231 /* AC Send */ | <I239> = 239; // #define KEY_SEND 231 | keycode 239 = XF86Send NoSymbol XF86Send |
KEY_REPLY 232 /* AC Reply */ | <I240> = 240; // #define KEY_REPLY 232 | keycode 240 = XF86Reply NoSymbol XF86Reply |
KEY_FORWARDMAIL 233 /* AC Forward Msg */ | <I241> = 241; // #define KEY_FORWARDMAIL 233 | keycode 241 = XF86MailForward NoSymbol XF86MailForward |
KEY_SAVE 234 /* AC Save */ | <I242> = 242; // #define KEY_SAVE 234 | keycode 242 = XF86Save NoSymbol XF86Save |
KEY_DOCUMENTS 235 | <I243> = 243; // #define KEY_DOCUMENTS 235 alias <OUTP> = <I235>; | keycode 243 = XF86Documents NoSymbol XF86Documents |
KEY_BATTERY 236 | <I244> = 244; // #define KEY_BATTERY 236 alias <KITG> = <I236>; | keycode 244 = XF86Battery NoSymbol XF86Battery |
KEY_BLUETOOTH 237 | <I245> = 245; // #define KEY_BLUETOOTH 237 alias <KIDN> = <I237>; | keycode 245 = XF86Bluetooth NoSymbol XF86Bluetooth |
KEY_WLAN 238 | <I246> = 246; // #define KEY_WLAN 238 alias <KIUP> = <I238>; | keycode 246 = XF86WLAN NoSymbol XF86WLAN |
KEY_UWB 239 | <I247> = 247; // #define KEY_UWB 239 | keycode 247 = XF86UWB NoSymbol XF86UWB |
KEY_UNKNOWN 240 | <I248> = 248; // #define KEY_UNKNOWN 240 | keycode 248 = |
KEY_VIDEO_NEXT 241 /* drive next video source */ | <I249> = 249; // #define KEY_VIDEO_NEXT 241 | keycode 249 = XF86Next_VMode NoSymbol XF86Next_VMode |
KEY_VIDEO_PREV 242 /* drive previous video source */ | <I250> = 250; // #define KEY_VIDEO_PREV 242 | keycode 250 = XF86Prev_VMode NoSymbol XF86Prev_VMode |
KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */ | <I251> = 251; // #define KEY_BRIGHTNESS_CYCLE 243 | keycode 251 = XF86MonBrightnessCycle NoSymbol XF86MonBrightnessCycle |
KEY_BRIGHTNESS_AUTO 244 /* Set Auto Brightness: manual brightness control is off, rely on ambient */ KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO | <I252> = 252; // #define KEY_BRIGHTNESS_AUTO 244 | keycode 252 = XF86BrightnessAuto NoSymbol XF86BrightnessAuto |
KEY_DISPLAY_OFF 245 /* display device to off state */ | <I253> = 253; // #define KEY_DISPLAY_OFF 245 | keycode 253 = XF86DisplayOff NoSymbol XF86DisplayOff |
KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */ KEY_WIMAX KEY_WWAN | <I254> = 254; // #define KEY_WWAN 246 | keycode 254 = XF86WWAN NoSymbol XF86WWAN |
KEY_RFKILL 247 /* Key that controls all radios */ | <I255> = 255; // #define KEY_RFKILL 247 | keycode 255 = XF86RFKill NoSymbol XF86RFKill |
KEY_MICMUTE 248 /* Mute / unmute the microphone */ | <I256> = 256; // #define KEY_MICMUTE 248 |
あー作業大変だった。
xkbで使う謎の4文字(以下のものアリ)がどのキーのことを指しているのかこの表でだいたい分かるんじゃないでしょうか。
また、全てが載っているわけではありませんが、xkbに書くkeysymは軽く調べたところ、「/usr/include/X11/keysymdef.h」に定義されている文言から先頭の「XK_」を省いたものが使える模様です。
一方で筆者のやりたいこと、すなわち、一つのキーをレイアウト変更キーにして、レイアウト変更キーを押下したときのカーソル移動関連キーを登録する、というところはナント!
ArchLinuxのドキュメント『X keyboard extension - Level3』のところにほぼそっくりそのまま記載されていました。
ただですねぇ、この「ほぼそっくり」って言うと99%みたいな印象を受けてしまいますが、技術関係の99%って=そのままじゃダメ⇒ダメなところを探して対処しないと結局ダメ、なので99%なんてとんでもなくて実質せいぜい25%とかそんなもんです。
似て非なる文言の紛らわしさ、書いている人が「こんなん当たり前だろう」or「これはこのドキュメントの範囲を逸脱してるし」で除外される情報に大きな意味が隠されていたりして、結局はその周辺を全部洗って精査しないと使えるものにならない。(いつもそう)
このドキュメントで紛らわしいのやはり「Mod5」と「LevelThree」ですよね。
それに、仮にこの辺をきっちりしたとしても既存の設定とも噛み合いで上手く動かなかったりして、また原因追求の繰り返しです。
確かにほぼそのままなのに、1点繋がらないところがあるだけで全く動かないですからね。
本当に疲れた。
最初はxmodmapのときと同じノリで[F24]キーをレイアウト変更キーにしようかと思っていたのですが、どうにも思ったように動いてくれなくて、xevとかで確認してもKeySymが0x00 NoSymbolになってしまって全く効いていません。
ちょっと色々と調べて頭こんがらがって、もう当初の理由を忘れてしまいましたが、結果的に[F24]キーは使わないことにして[LVL3]キーという「// Fake keycodes for virtual keys」とコメントされている本来存在しない架空のキーを割り当てることにしました。
架空のキーなのでEventcodeの方に定義が無かったのですが、コード値をダイレクトに記述したらそれでもOKだったようなので、これを採用しました。
[LVL3]キーは架空キーなので既存の設定が存在しておらず、そのため既存の設定に邪魔されることが無かったので思いの動きがそのまま実現出来たのだと思います。
しかし、問題はそれだけに留まりません。
カーソルキーは範囲選択や単語送り等で[Ctrl][Shift][Alt]と同時に使用することが多々あるのですが、どうも[Alt][Shift]を絡めると筆者が設定していない全く別のキーが入力されてしまいます。
既存の設定が邪魔しているようなので、それも潰すように変更を加えます。
そうして、ようやくそれなりにまともに動いた設定がこちら。
partial modifier_keys xkb_symbols "gihi" { key <LALT> { [ Alt_L, Alt_L ] }; key <LVL3> { [ISO_Level3_Shift ] }; modifier_map Mod5 { ISO_Level3_Shift }; key.type = "THREE_LEVEL"; key <AD07> { [ u, U, Left ] }; key <AD08> { [ i, I, Right ] }; key <AD09> { [ o, O, Up ] }; key <AD10> { [ p, P, Down ] }; key <AC07> { [ j, J, Left ] }; key <AC08> { [ k, K, End ] }; key <AC09> { [ l, L, Prior ] }; key <AC10> { [ semicolon, plus, Down ] }; key <AB07> { [ m, M, Home ] }; key <AB08> { [ comma, less, End ] }; key <AB09> { [ period, greater, Prior ] }; key <AB10> { [ slash, question, Next ] }; key <HOME> { [ Home, Home, Right ] }; key <UP> { [ Up, Up, Prior ] }; key <PGUP> { [ Prior, Prior, Up ] }; key <LEFT> { [ Left, Left, Home ] }; key <RGHT> { [ Right, Right, End ] }; key <END> { [ End, End, Right ] }; key <DOWN> { [ Down, Down, Next ] }; };
"gihi"というのは筆者が勝手に付けた名前ですので気にしないでください。
この設定を既存にプラスして読み込ませることでまあ、当初やりたかったことは実現はできました。
なお今回、[U,.P]にもカーソル関連キーを追加定義しており、またカーソルキーを[Home][End][PgUp][PgDn]に、[Home][End][PgUp][PgDn]をカーソル移動キーに切り替えられるように定義しています。
これらはどこを使っても良いという利便性向上のための重複定義です。
<LALT>キーを再定義しているのが既存設定の邪魔が原因でして、これをしないと[Alt][Shift]押下時に[Meta]キーが発動してしまって[O][L]がカーソルキーではなく[Alt_L]入力になってしまったり、[;]もなんかのボタン押下か分からん変なイベントが発生するようになってしまっていました。
なので、[Shift]押しても変わらず[Alt_L]として働け、と念押ししています。
んでudevのhwdbの方に、
KEYBOARD_KEY_7008a=84 #変換
84ってのが架空のキー[LVL3]のEventcodeです。xmodmapやxkbでは+8されて92ね。
インプレッション
これだけやってもダメなもんはダメでして、xmodmapのときよりかは若干マシな挙動をしていますが、相変わらずWine上のアプリにもVirtualBOXでも全く効かず、Kateでは単独カーソル操作こそ出来るようになったものの[Ctrl][Shift][Alt]を絡めるとKateのショートカットの方が発動してしまって「キーシーケンス Ctrl+J はあいまいです。「設定」から「キーボードショートカットの設定」メニューを選び、解決してください。アクションは設定されません。」などと怒られてしまいます。
xevで見ている限りは完全にコンフィグ出来ていそうなんですけどね。
とにかくちゃんと動いてくれるアプリが少な過ぎてとてもじゃないがこれをメインで使って行こうとはとても思えませんね。
誰だ、過去記事『Xubuntuのキーボード設定をお勉強』で『最近は高級キーボードなんかでキーコンフィグを自在に設定出来て、[Fn]キーを押したときに全く異なるレイアウト定義も出来るなんていう製品が増えて来ましたが、Linux上の設定で似たようなことが実現できるわけです。』とかのたもうてたやつは!
実用に足らんぞぃ!
残念ながらxmodmapもxkbも限定的なキーコンフィグしか出来なくて(筆者のスキル不足の可能性もまだ残ってはいます)使い物になりませんでしたが、udevのhwdbコンフィグだけがガチで使えますので、こちらでどうにかできるところだけをコンフィグする方向に軌道修正しようかと思います。
骨折り損のくたびれ儲け。
それでも、Windowsに戻りたいとは1mmも思いませんが。