TrackballをHyprlandでより快適に使う(追記あり)
- Kensington SlimBlade Proを例に、Hyprlandとinput-remapperを使用してトラックボールの加速度やスクロール設定をカスタマイズする方法を紹介。
- input-remapperでマウスボタンの同時押しコンビネーションを設定していたが、キーバインド成立前のクリックが発火してしまう問題があったため、evsieveに移行した。
Kensington SlimBlade Proを例に、Hyprlandとinput-remapperを使用してトラックボールの加速度やスクロール設定をカスタマイズする方法を紹介。
トラックボールは加速をONにして加速度をカスタムに設定することで、より快適な操作感を得ることができる(と思っている)
以下のようにHyprlandの設定ファイルhyprland.confにトラックボールの加速度や感度、スクロール設定を記述する。
ケンジントン公式のデバイスドライバでは、ボタン同時押しの設定が可能だが、当然Linuxでは利用できない。
そのためinput-remapperを使用して、複数ボタン同時押しの操作を実現している。
config例の重要なポイント
- 加速度のプロファイルをカスタムに設定し、加速度のカーブを細かく調整することで、トラックボールの動きがより自然になるようにしている
- スクロール方法を
on_button_downに設定し、スクロールボタンを指定。トラックボールの特定のボタンを押しながら動かすことでスクロールができるようになる input-remapperを利用する場合、デバイス名が仮想デバイスのものになるため、Hyprlandの設定ファイルでは仮想デバイスの名前を指定する必要があるinput-remapperが使用できない状況のために、フォールバックとして通常のデバイス名での設定も記述している
Hyprlandの設定例
nameは実際のデバイス名に合わせて適宜変更する必要がある。hyprctrl devicesコマンドでデバイス名を確認できる。
| |
input-remapperの自動起動とプリセットのロード
Hyprlandの起動時にinput-remapperを自動で起動し、設定済みのプリセットをロードするには、hyprland.confに以下を追記する。
| |
--command autoloadを指定することで、input-remapper-controlがデーモンを起動し、各デバイスに対して最後に使用したプリセットを自動的にロードしてくれる。
特定のプリセットを明示的にロードしたい場合は、以下のように指定できる。
| |
蛇足
トラックボールは物理的な接点があるため、潤滑油が必要である。 定期的に自分の手汗や顔面の油を利用して潤滑するのが良い。天然の油であるため無害だしコストもかからない。
(追記)input-remapperからevsieveへの移行
背景
input-remapperでマウスボタンの同時押しコンビネーションを設定していたが、以下のような問題があったため、evsieveに移行した。
- キーバインド成立前のクリックが発火してしまう:例えばMiddle+Left+Sideの3ボタン同時押しでワークスペースを切り替える設定の場合、最初に押したボタンのクリックイベントが、コンビネーションが成立する前にアプリケーションに送信されてしまう
- input-remapperはevdevレベルでデバイスをグラブして処理しているが、コンビネーション判定中にイベントを保留する仕組みが弱く、この問題の根本的な解決が難しかった
- キーイベントを発する際のマウスフォーカスを意識すること無く、心理的安全性の高いコンビネーション操作を実現したい
evsieveとは
evsieveはLinuxのevdevイベントを直接操作するユーティリティ。コマンドライン引数だけで設定が完結し、systemdサービスとしても軽量に動作する。
evsieveの--hookと--withholdの組み合わせにより、ボタンイベントを一時保留してからコンビネーション判定を行い、成立しなければ遅延リリース、成立すれば元のクリックを抑制するという動作が実現できる。
セットアップ
インストール(Arch Linux)
| |
systemdサービスの作成
/etc/systemd/system/evsieve-trackball.serviceを作成する。
evdevデバイスへのアクセスにはroot権限が必要なため、システムレベルのサービスとして配置する。
| |
各オプションの意味:
grab— デバイスを排他的に取得し、他のプロセス(libinput等)に生のイベントが流れないようにする--hook btn:middle btn:side send-key=key:f13— MiddleとSideの同時押しでF13キーを送信--withhold btn:side— Sideボタンのイベントを一時保留し、フック成立時は元のクリックを抑制する。フックが不成立なら通常通りイベントを通過させる--map btn:middle btn:extra/--map btn:side btn:middle— 物理的なMiddle(大玉横のボタン)をbtn:extra(276)に、物理的なSide(上部ボタン)をbtn:middleに再マッピングする。これによりbtn:side(戻るボタン)はどの物理ボタンからも出力されなくなり、Sideボタンはフックの修飾キーとしてのみ機能する--output name=evsieve-trackball— 仮想デバイス名を指定して出力
ワークスペースのスイッチを行なった時、そのスイッチ先のワークスペースにブラウザが有る場合、意図せずbtn:sideが効いてしまう現象が合った。
やむなく、btn:side単独のキー挙動を無効化して、マウス上のModキーとして動作するようにした。
戻るボタンはhyprlandの設定で、alt+btn:rightで行うこととする。
サービスの有効化
| |
Hyprlandの設定変更
仮想デバイスの設定
evsieveがデバイスをグラブして仮想デバイスとして再出力するため、Hyprland側では仮想デバイス名で設定を記述する必要がある。
| |
キーバインドの設定
evsieveが送信するF13〜F16キーをHyprlandのキーバインドに割り当てる。
evsieveの仮想キーボードから送信されるキーイベントは、keysym(F13)ではなくkeycode指定(code:XXX)で照合する必要がある。
| |

| キー | 動作 | アクション |
|---|---|---|
| Middle + Side | evsieve F13 (code:191) | ワークスペース前へ |
| Middle + Right | evsieve F14 (code:192) | ワークスペース次へ |
| Side + Left | evsieve F16 (code:194) | スクリーンショット(slurp + satty) |
| Middle + Move | libinput (btn:extra経由) | スクロール |
input-remapperの無効化
evsieveに移行した場合、input-remapperは不要になったため、以下のコマンドでサービスを無効化する。
| |
hyprland.confからinput-remapper-control --command autoloadの行も削除する。
EOF