はじめに
年末Bluetooth版のThinkPad Keyboardに買い替えたのですが、bluetoothを再接続するたびにキー反応速度がデフォルトに戻ってしまう現象が発生しました。xsetの設定を.xprofileやi3confに入れて起動時に走らせても全く改善しなかったのですが、あれやこれやをやっているうちに昨日ふとできたので、忘れないうちに書き留めておきます。
使用環境
- Lenovo ThinkPad X1 Carbon Gen 6
- Linux 5.4.12-1-MANJARO x86_64 GNU/Linux
- i3wm
bluetoothの自動接続設定
既に出来ている方は飛ばしてください。Arch wikiに書いているように/etc/bluetooth/main.conf
を編集します。
AutoEnable=true
のコメントアウトを外すか、新しく追加してください。
起動時・スリープ復帰後にキーリピートを設定する
デバイスの絞り込み:udevの設定
udevを使います。/etc/udev/rules.d/
に移動して、95-xset-input-rules
ファイルを作成し、以下を入力します。
KERNEL=="js0", ACTION=="add", RUN+="/bin/sh -c '/usr/local/sbin/lenovo-keyrepeat'"
最初のKERNELやACTIONなど「==」が付いたものは、検索条件で、ここでデバイスを限定します。これには色々な絞り込み方があると思うので、udevadm monitor
やudevadm info
を使って絞り込んでください。
参考サイト:
デバイス名を固定するのにudevのルールを書いてみた
udevルールの書き方
ちなみに絞り込みがちゃんとできているかのログの見方がわからなかったので、以下のコマンドをスクリプトで実行していました。
echo 'test' >> /home/<user>/log
再接続時にtestが一行だけなら絞り込み成功、二個以上なら絞り込みが不十分、という原始的な判別方法です。
コマンドの実行
RUN+=以下のスクリプトを記述します。場所は他のところでも大丈夫だと思いますが実行可能にしておく必要はあります。
#!/bin/bash
sleep 1
export XAUTHORITY="/home/<user>/.Xauthority"
export DISPLAY=:0
/usr/bin/xset -display :0 r rate 200 100
sleep 1
は即時実行すると反応しない場合があるので少し待ちます。3とかにしておくと確実で、徐々に減らしてみると良いかもしれません。
export XAUTHORITY=
これを入れないだけで一週間以上悩みました。下記リンクが参考になりました。
udev rule to turn on keyboard backlight
正直これとexport DISPLAY=:0
はなぜ必要なのかはっきりわかっていません。udevの実行は親権限なのでその辺が関係しているのかな、と想像します。
実践!
下記のコマンドをrootで実行します。
udevadm control --reload && udevadm trigger
udevadm control --reload-rules
でも良さそうです。
bluetoothを再接続して少し待つとスピードが変わっています。
内蔵キーボードに比べると即座に打てないのが玉に瑕ですが、そこまで気にはならないので良しとします。