Skip to content

Instantly share code, notes, and snippets.

@buzztaiki
Last active July 21, 2023 13:25
Show Gist options
  • Save buzztaiki/42eac37fe70ee74e8fdf10acc1640853 to your computer and use it in GitHub Desktop.
Save buzztaiki/42eac37fe70ee74e8fdf10acc1640853 to your computer and use it in GitHub Desktop.
Rust で evdev と uinput を使ってキーマッパーっぽい事をするメモ

Rust で evdev と uinput を使ってキーマッパーっぽい事をするメモ

以下の二つの crate を使って簡単なものを書いた:

あまりちゃんとした事はやってなくて、とりあえず入力されたキーを別のキーに変換できるか試してみた程度。

https://github.com/buzztaiki/rust-evdev-uinput-example

感想

evdev

  • Pure Rust。
  • わりと使いやすいように思う。
    • SYN_DROPPED も透過で処理してくれるのは良い。
  • evdev-rs に以下のコメントがあったけど、今回使った範囲では困る事もなかった。

    but it will miss out on any more complex handling that libevdev provides

  • あまり頻繁な更新はない。

evdev-rs

  • libevdev のラッパー。
    • わりと薄い。
    • ffi は evdev-sys crate。
  • 少し低レイヤな感じで、使いやすくはない。libevdev に慣れてれば問題はなさそう。
  • メンテは続いている。上流の libevdev も当然メンテは続いている。

キーマッパーっぽい事をするときの流れ

  • デバイスを grab して、他のプロセスがそのデバイスを触れないようにする
    • プロセスが終わると ungrab されるから、後処理は必要ない。ぽい。
  • uinput デバイスを作る
    • 入力可能なキーは全て列挙しておく必要がある。
  • 元のデバイスからの入力イベントを変換して uinput デバイスに流す。

実体は ioctl によるデバイスのコントロールと、/dev/input, /dev/uinput の読み書き。

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment