interception-tools

提供: ArchWiki
2023年8月11日 (金) 09:50時点におけるAshMyzk (トーク | 投稿記録)による版 (→‎複数のジョブを処理する: 修正)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

interception-tools は、キーボード入力のマッピングの制御とカスタマイズをするためのユーティリティのセットです。

interception-tools は、libevdevlibudev(3) を使用することで、他の似たようなツール (xcapexmodmap) よりも低レベルで動作します。ゆえに interception-tools は、X11Wayland、そして Linux コンソールの全てでキーボードの挙動をカスタマイズできる数少ない方法の1つとなります。

インストール

interception-toolsインストールしてください。

利用可能なプラグインはたくさんあります:

設定

interception-tools には、いくつかのコマンドラインツールと1つの systemd サービスが含まれています。

パッケージに含まれている udevmon.service起動する場合は、まず先に /etc/interception/udevmon.yaml に設定を追加しておく必要があります。

ノート: /etc/interception/udevmon.d/ 内の設定ファイルがまず先に読み込まれ、その後に /etc/interception/udevmon.yaml にフォールバックします。

仕組み

Interception-tool は libevdev を使用します (libevdev は、このライブラリの wiki によると、本質的には /dev/input/eventX デバイス用に強化された read(2) です)。 libevdev は、イベントを処理するプロセスとカーネルとの間で動作します。 最もシンプルなシナリオでは、以下のような感じになります:

カーネル | libevdev | evtest

X.Org 入力モジュールの場合、スタックは以下のようになります:

カーネル | libevdev | xf86-input-evdev | X サーバ | X クライアント

Wayland では、スタックは以下のようになります:

カーネル | libevdev | コンポジタ | Wayland クライアント

言い換えると、libevdev は低レベルであるため、X/Wayland クライアントに関する情報を持ちません。

実用例

Interception-tools では4つのユーティリティが使用できます:

  • intercept: デバイスの入力イベントを標準出力にリダイレクトする。
  • mux: 入力イベントの複数のストリームを結合する。
  • udevmon: 入力デバイスを監視し、(それに応じて) タスクを開始する。
  • uinput: 入力イベントを標準入力から仮想デバイスへリダイレクトする。

実行優先度を上げる

このツールはデバイス入力の最も低いレベルで動作するため、udevmon の実行優先度を上げて持続的に動作するようにしてください:

# nice -n -20 udevmon -c udevmon.yaml > udevmon.log 2> udevmon.err &
ヒント: udevmon systemd サービスは Nice=-20 で実行されます。

シンプルなリダイレクト

イベントを標準出力に (他に何もせずに) リダイレクトする最も単純な方法は:

$ intercept -g DEVNODE | uinput -d DEVNODE

DEVNODE は実際のデバイスへのパスです (例: /dev/input/by-path/platform-i8042-serio-0-event-kbd)。

コマンドを挟む

キーイベントと入力との間で何か処理を行うには、その処理を interceptuinput との間にパイプで挟んでください。

例えば、interception-caps2esc プラグインをインストールし、以下のコマンドを実行してみてください:

$ intercept -g DEVNODE | caps2esc | uinput -d DEVNODE

-g フラグを省略すると、デバイスイベントは単に観測されるだけで、捕捉 (grab) されません (訳注: -g フラグを付けることにより、そのデバイスに排他的にアクセスできるようになります。そうすることで、uinput によって作成された新しい仮想デバイスが元のデバイスイベントを処理後のデバイスイベントに完全に置き換えることができます。-g を付けないと、処理される前の元のデバイスイベントが残ってしまいます。)。

YAML で設定する

先の方法で入力をインターセプトするのは、すぐに最適ではなくなるかもしれません。そのような場合、udevmon が役に立ちます。 udevmon は、ジョブ (デフォルトでは sh コマンド) のリストを含む YAML 設定ファイルを読み込み、それらを (適切な時に) 実行します。

デバイスが記述とマッチする場合にジョブを実行する例:

$ udevmon -c caps2esc.conf.yml
- JOB: intercept -g DEVNODE | caps2esc | uinput -d DEVNODE
  DEVICE:
    LINK: /dev/input/by-path/platform-i8042-serio-0-event-kbd

ここでは LINK の設定は特定の名前を持つデバイスとマッチしますが、正規表現も可です。 複数のジョブ設定を組み合わせることで、デフォルトの挙動を設定することができます。いずれの場合も、最初にマッチしたジョブのみが実行されます:

- JOB: intercept -g DEVNODE | caps2esc -m 2 | uinput -d DEVNODE
  DEVICE:
    LINK: /dev/input/by-id/usb-SEMITEK_USB-HID_Gaming_Keyboard_SN0000000001-event-kbd
- JOB: intercept -g DEVNODE | caps2esc | uinput -d DEVNODE
  DEVICE:
    EVENTS:
      EV_KEY: [[KEY_CAPSLOCK, KEY_ESC]]
    LINK: .*-event-kbd

複数のデバイスを組み合わせる

uinput ツールは、入力のエミュレーションだけでなく、デバイスの記述を YAML 形式で出力するために使用することもできます:

$ uinput -p -d /dev/input/by-id/my-kbd

YAML ファイルは、以下のようにして uinput に与えることができます:

$ uinput -c my-kbd.yaml

また、デバイスの記述と YAML で書かれた記述を同時に使用することもできます (例えば、キーボードとマウスのイベントを組み合わせることができます):

例えば、CapsLock+ClickCtrl+Click として使う場合:

$ uinput -p -d /dev/input/by-id/my-kbd -d /dev/input/by-id/my-mouse -c my-extra.yaml

複数のジョブを処理する

mux を使うことで、複数のパイプラインを1つにまとめることができます。muxer を先に作成しておく必要があります。作成した muxer は、後にパイプラインの入力や出力として使用できます。YAML 設定ファイルでは、muxer は CMD キーを使って作成できます:

- CMD: mux -c caps2esc
- JOB: mux -i caps2esc | caps2esc | uinput -c /etc/interception/gaming-keyboard.yaml
- JOB: intercept -g DEVNODE | mux -o caps2esc
  DEVICE:
    LINK: /dev/input/by-id/my-kbd
- JOB: intercept DEVNODE | mux -o caps2esc
  DEVICE:
    LINK: /dev/input/by-id/my-mouse

上記の例では、キーボードが接続された時に、キーボードは捕捉 (grab) され、入力イベントは最初に作成しておいた caps2esc muxer に送られます。マウスから観測された (捕捉されていない) 入力も、同じ muxer に送られます。マウスのボタンは EV_KEY イベントを生成するので、caps2esc はそのイベントを受け入れます。

参照

翻訳ステータス: このページは en:interception-tools の翻訳バージョンです。最後の翻訳日は 2023-08-11 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。