Slide 1

Slide 1 text

RubyKaigiで手に入れた HHKB Studioのための HIDRawドライバ 2025/03/20 Fukuoka.rb #397 RubyKaigi 2025の機運 Kohei Yamada @iberianpig

Slide 2

Slide 2 text

About Me Kohei Yamada GitHub @iberianpig Twitter @nukumaro22 自己紹介 最近の趣味はkamal2です。

Slide 3

Slide 3 text

ちょっと前までは外部キーボードやマウスは使わない硬派なタッチパッド勢でした Fusuma ● タッチパッドのマルチタッチジェスチャ用 Linux向けツール ● Yamlで設定して実行するとジェスチャが使える ● キーボードと連携できたりするプラグインの仕組みがある

Slide 4

Slide 4 text

fusuma-plugin-thumbsense タッチ中にキーリマップできるプラグイン ● タッチパッドのタッチ状態を取得 ● キーボードのキーをリマップ ● タッチ中のみFキーでクリックに変換 Thumbsenseのついでにタップしてクリックする機能をオフにすると、誤タップ減ってめちゃくちゃ快適になります

Slide 5

Slide 5 text

fusuma-plugin-thumbsense 動作のイメージはこんなかんじ クリックとポインタ操作は同じ指で行うよりも違う指を使えたほうがやりやすいんですよね ● (タッチ中に)Fでクリック ● 楽々ドラッグ・アンド・ドロップ

Slide 6

Slide 6 text

この辺、RubyKaigi 2023で話しました

Slide 7

Slide 7 text

ところで今日の話は

Slide 8

Slide 8 text

キーボード

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

RubyKaigi 2024にて ガラガラポンまさかの当選 Techouseさん、本当にありがとうございます🙇 大変便利に使わせていただいております。

Slide 12

Slide 12 text

HHKB Studioを手に馴染ませる

Slide 13

Slide 13 text

HHKB Studioを手に馴染ませたい ● HHKB Studioの親指クリックがしっくりこなかった ● タッチパッド + ThumbSenseに慣れすぎていた ● 手癖で F でクリックしようとして誤爆 スペースキーの下にある正規クリックボタンはやたらといい位置にあるので ALTキー と SHIFT キーになりました

Slide 14

Slide 14 text

ポインティングスティックのタッチイベントがほしい ● 汎用デバイスドライバからだと取得できない ○ マウス扱いなので/dev/input/eventX からevdevのレベルの情報はとれる ○ ただしポインタが移動しているときのみ ● 軽く指で触れたくらいだとイベントは取れない ■ さらに低いレイヤーを見てみることに ● /dev/hidrawX から取れないか見てみることに FusumaはLibinputに依存、リマップ処理はEvdevに依存、今回はHIDRawに…

Slide 15

Slide 15 text

ターミナルでデバイスのイベントを観察 ポインティングスティック上に軽く指を置いてテスト ポインタ移動時は取れてるみたい。残りはフィルタされていそう 軽く指置いたときも、空でイベントが飛んでる。使えそう HIDRaw evdev

Slide 16

Slide 16 text

HIDRaw ● 生のHIDイベントをユーザー空間で扱える ○ デバイスから産地直送イベント ● 汎用のデバイスドライバでカバーされないもの ○ 高機能なジョイスティックやマイナーなデバイスなど ● アプリケーション側でHIDを喋る必要がある Steamで高機能コントローラ使ったり、汎用ドライバ未対応の加速度センサー扱ったり

Slide 17

Slide 17 text

イベントの流れ ● 汎用デバイスドライバ経由 ○ カーネル側でデコード ○ evdev I/F ■ /dev/input/eventX ○ Libinput ■ Wayland Compositor ■ Fusuma ○ Application ■ Terminal, Browser… ● HIDRaw経由 ○ HIDRaw I/F ■ /dev/hidrawX ○ Application側に実装 ■ HID Reportのデコード ■ Evdev相当のイベント

Slide 18

Slide 18 text

HIDRawを読む 一般ユーザーは /dev/hidrawX や /dev/input/eventX へのアクセス権がないので、udev rule が必要です デバイスパスの取得(/dev/input/eventX -> /dev/hidrawX) レポートディスクリプタを取得(HIDIOCGRDESC) report_id, 構造体定義に沿ってHIDレポートをデコード 2 3 1

Slide 19

Slide 19 text

HIDRawを読む レポートディスクリプタを元にデコード Report Descriptor ↑Report Descriptorをデバイスから取得 HID Report ● Report Descriptorでバイト列の区切りが決まる ○ HID Usage Tables に仕様が記載 https://usb.org/sites/default/files/hut1_6.pdf ● この場合は8ボタン同時押しを検知できることがわかる hidapiバインディングをいくつか試したけど動かなかったのでPure Rubyで書きました BluetoothはUSB接続時と違ってデバイスが統合されるのでレポート構造が違ってハマりました

Slide 20

Slide 20 text

HIDRawを読む レポートディスクリプタを元にデコード このへんHIDRawを使って頑張るよりもeBPFでフィルタとかリマップ処理をカーネル側に移譲できるととても良さそうな気がしています HID Report RubyでHIDレポートをデコードできた! マウスのレポートをタッチ状態として検知できたので、 あとはFusumaから仮想キーボードのレイヤーを変更するRPC を呼ぶだけ(Fをクリックに変換させるレイヤーに切り替える) 1 2 3

Slide 21

Slide 21 text

fusuma-plugin-thumbsenseに機能追加 ポインティングスティックでもFでクリック

Slide 22

Slide 22 text

まとめ ● RubyKaigiで貰ったキーボードのおかげでより便利な環境になった ● RubyでCライブラリ使わずに書けるところ、意外とある。楽しい ● 道具がより手に馴染むようになって最高