しばらくLinux環境のキーリマッパーとしてxremapを使っていたのですが、アプリケーションによっては動かない場面が多く、xremapより低レイヤでリマップを実現しているxkeysnailに乗り換えました。systemdでデーモン化し、自動で起動、仮にプロセスが死んでも復帰させるようにさせたいので設定します。
最終形はAnsibleでroleとしてまとめてますので、https://github.com/yosmoc/Ubuntu-bootstrap/tree/master/roles/xkeysnail を参照ください。
Ubuntu17.10で動作を確認しています。現在のところudevのruleの再読込がうまくいっておらず、このroleを実行後再起動が必要です。
Install
https://github.com/mooz/xkeysnail#installation の通りにインストールします。自分はpip3でインストールしました。
ユーザーにxkeysnailが必要とする権限を与える
xkeysnailはuinputとinput/*にアクセスする必要があります。よって、公式のページではsudoで動かすようREADMEに書かれています。ここでは一般ユーザーにuinput / inputの権限を与え、後にそのユーザー権限でsystemdのserviceを動かします。
uinputグループの作成
おそらく、uinputグループは存在しないので、作成します。
sudo groupadd uinput
実行したいuserをuinput, input groupに加える
sudo useradd -G input,uinput your_username
uinput, input groupがkernelのuinput, eventにアクセスできるように設定する。
KERNEL=="event*", NAME="input/%k", MODE="660", GROUP="input"
KERNEL=="uinput", GROUP="uinput"
上記の2ファイルを/etc/udev/rules.d/
にコピーする。
sudo cp input.rules uinput.rules /etc/udev/rules.d/
udev ruleのリロード。
sudo udevadm control --reload-rules && udevadm trigger
これでうまくリロードできることを期待していたのですが、今のところうまく行っていません。
systemd serviceの設定ファイル
xremapのsystemd serviceファイルを元に作成しました。
# 1. Copy this to ~/.config/systemd/user/xkeysnail.service
# 2. systemctl --user enable xkeysnail
#
# Note that you need to set proper $DISPLAY on your environment.
[Unit]
Description=xkeysnail
[Service]
KillMode=process
ExecStart=/usr/local/bin/xkeysnail /home/your_username/.xkeysnail/config.py
ExecStartPre=/usr/bin/xhost +SI:localuser:root
Type=simple
Restart=always
# Update DISPLAY to be the same as `echo $DISPLAY` on your graphical terminal.
Environment=DISPLAY=:0
[Install]
WantedBy=default.target
ExecStartPreでxhostの設定、EnvironmentでDISPLAYを設定している辺りがポイントです。ExecStartは各自読み替えて設定してください。自分の場合は~/に.xkeysnailフォルダを作成し、config.pyを配置してあります。
このファイルを~/.config/systemd/user/
においておきます。このフォルダはなければ先に作成しておいてください。
サービスの起動
サービスを有効化、起動します。
systemctl --user enable xkeysnail
systemctl --user start xkeysnail
statusを確認します。
systemctl --user status xkeysnail
以上です。