X.orgでキーボードの音量調整ダイヤルを動画の再生位置移動に使う（一応成功）

この記事はLinuxかつX.org環境（非Wayland環境）前提です。昨今のゲーミングキーボードには音量調節ダイヤルとメディアキーを備えたものが増えていますが、音量調節ダイヤルをもっと色々なことに使いたいなぁと思ってちょっと試してみました。

まず今回使っているキーボードはCorsair製のキーボードなのでCorsair向けオープンソースドライバの[ckb-next](https://github.com/ckb-next/ckb-next)を使えば簡単にできそうと思ったのですが、このキーボードが日本語版なためかckb-nextではまだ未対応のようでした。

仕方ないのでX.orgにおいてボリュームダイヤルやメディアキーの割り当てがどうなってるかをxmodmapで調べてみたところ、ちゃんと割り当てられてそうな感じでした（二番目はShift押しながら、三番目は海外のAltGr）。
```bash
$ xmodmap -pke | grep XF86Audio
keycode 121 = XF86AudioMute NoSymbol XF86AudioMute
keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume
keycode 171 = XF86AudioNext NoSymbol XF86AudioNext
keycode 172 = XF86AudioPlay XF86AudioPause XF86AudioPlay XF86AudioPause
keycode 173 = XF86AudioPrev NoSymbol XF86AudioPrev
keycode 174 = XF86AudioStop NoSymbol XF86AudioStop
keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord
keycode 176 = XF86AudioRewind NoSymbol XF86AudioRewind
keycode 198 = XF86AudioMicMute NoSymbol XF86AudioMicMute
keycode 208 = XF86AudioPlay NoSymbol XF86AudioPlay
keycode 209 = XF86AudioPause NoSymbol XF86AudioPause
keycode 215 = XF86AudioPlay NoSymbol XF86AudioPlay
keycode 216 = XF86AudioForward NoSymbol XF86AudioForward
keycode 221 = XF86AudioPreset NoSymbol XF86AudioPreset
keycode 234 = XF86AudioMedia NoSymbol XF86AudioMedia
```

このうち音量調節に当たるのはXF86AudioLowerVolumeとXF86AudioRaiseVolumeなので音量調節ジョグダイヤルは必然的にkeycode 122とkeycode 123となります。

今回やりたいのは動画の再生位置を移動させることなので、今回はこれらのキーを左矢印キーと右矢印キーにマッピングすることにします。

まずは単純にxmodmapで割り当ててみましたが、上手く動きませんでした。
```
$ ### 上手く動かない
$ # xmodmap -e "keycode 122 = XF86AudioLowerVolume Left XF86AudioLowerVolume"
$ # xmodmap -e "keycode 123 = XF86AudioRaiseVolume Right XF86AudioRaiseVolume"
```
これは確かめてませんが多分キーコードで処理する実装系があるためだと思います。

仕方ないのでどうしようかと色々調べてたら xkb (X keyboard extension) のリダイレクトが使えるとの情報を見つけました。とりあえず現在のxkbのルールをダンプして調べてみると以下のようになりました:
```bash
$ xkbcomp $DISPLAY output.xkb
$ grep XF86Audio output.xkb
    key <MUTE> {         [   XF86AudioMute ] };
    key <VOL-> {         [ XF86AudioLowerVolume ] };
    key <VOL+> {         [ XF86AudioRaiseVolume ] };
    key <I171> {         [   XF86AudioNext ] };
    key <I172> {         [   XF86AudioPlay,  XF86AudioPause ] };
    key <I173> {         [   XF86AudioPrev ] };
    key <I174> {         [   XF86AudioStop,       XF86Eject ] };
    key <I175> {         [ XF86AudioRecord ] };
    key <I176> {         [ XF86AudioRewind ] };
    key <FK20> {         [ XF86AudioMicMute ] };
    key <I208> {         [   XF86AudioPlay ] };
    key <I209> {         [  XF86AudioPause ] };
    key <I215> {         [   XF86AudioPlay ] };
    key <I216> {         [ XF86AudioForward ] };
    key <I221> {         [ XF86AudioPreset ] };
    key <I234> {         [  XF86AudioMedia ] };
```

キー名の割り当ては途中から適当になってますが、音量部分はちゃんと名前が付いてますね。

とりあえずoutput.xkbの```<VOL->```と```<VOL+>```をShift押しながらだと左矢印キーと右矢印キーにリダイレクトするように書き換えてみます。

書き換え前:
```
    key <VOL-> {         [ XF86AudioLowerVolume ] };
    key <VOL+> {         [ XF86AudioRaiseVolume ] };
```

書き換え後:
```
    key <VOL-> {
        symbols[Group1]= [   XF86AudioLowerVolume, NoSymbol, XF86AudioLowerVolume ],
        actions[Group1]= [ NoAction(), RedirectKey(key=<LEFT>, clearmods=Shift), NoAction()]
    };
    key <VOL+> {
        symbols[Group1]= [   XF86AudioRaiseVolume, NoSymbol, XF86AudioRaiseVolume ],
        actions[Group1]= [ NoAction(), RedirectKey(key=<RGHT>, clearmods=Shift), NoAction()]
    };
```

その後、ルールを反映させます:
```bash
$ xkbcomp output.xkb $DISPLAY
```

良かった、ちゃんと動いてるようです。これによりシフト押しながら音量調節ダイヤルをコロコロすることで動画の再生位置の移動ができるようにできました。

次はI174キーをShiftキーに割り当てて使いやすくし…ようかと思ったのですが何か上手く行かなかったので、設定の永続化もまだですがこの記事はここまでとなります。ご了承下さい。

そろそろWaylandへの移行も近づいてますし、多分こっちよりもckb-nextの方を何とかする方が良さそうです。