jdmouse - SONY VAIO event handler

Kunihiko IMAI <bak@d2.dion.ne.jp>

2005/03/19

1. 構成

2. クイックスタート

3. jdmouse

4. blctl

5. xzoom

6. acpi3


1. 構成

これまで jdmouse は,多くの人に「ハードコーディングはダサイ」とか「設 定しづらい」とか叩かれてきました. が,ついに究極の解決法を思いつきました.

他人に任せる

これです.

つまり,jdmouse 自身はイベントの受信・翻訳に専念し,コマンドの実行は外 部プログラムに任せる,というものです. これに伴い,バックライト調整やサウンドボリュームコントロールなど,従来 jdmouse 自身が制御していた機能を外部コマンドに追い出しました.

ただし,ジョグダイヤルイベントについては,イベントの頻度と名前に関する アイデンティティのため,jdmouse 自身で処理しています.

以下にプログラムの関係を示します.


sonypi.ko -> jdmouse* -> ~/.jdmouse_event* +-> xzoom*
                |                          +-> blctl*
                V                          +-> acpi3*
             uinput.ko                     +-> amixer
                |                          + ....
                V
             /dev/input/mice
                |
                V
             mouse events on X

`*' 印のあるプログラム本アーカイブに含まれているものです.

2. クイックスタート

以下の説明はカーネル 2.6.11 + debian sarge 環境で確認した手順です. 他のカーネルバージョン・ディストリビューションでは多少異なる場合があります.

2.1 sonypi ドライバ

  1. 今使用してるカーネルで sonypi.ko がコンパイルされていることを確 認します. 無い場合は…カーネルをコンパイルし直しましょう.
    $ find /lib/modules/`uname -r` -name sonypi.ko
    
  2. /etc/modprobe.conf を編集し,以下の行を加えます.
    options sonypi minor=250
    
  3. デバイスファイルを作成します.
    # mknod /dev/sonypi c 10 250
    # chmod 666 /dev/sonypi
    

2.2 uinput ドライバ

  1. 今使用してるカーネルで uinput.ko がコンパイルされていることを確 認します. 無い場合は…カーネルをコンパイルし直しましょう.
    $ find /lib/modules/`uname -r` -name uinput.ko
    
  2. デバイスファイルを作成します.
    # mknod /dev/input/uinput c 10 223
    # chmod 666 /dev/input/uinput
    

2.3 X ウィンドウシステム

/etc/X11/XFree86-4 の以下の設定が有効になっていることを確認します.

Section "InputDevice"
        Identifier      "Generic Mouse"
        Driver          "mouse"
        Option          "SendCoreEvents"        "true"
        Option          "Device"                "/dev/input/mice"
        Option          "Protocol"              "ImPS/2"
        Option          "Emulate3Buttons"       "true"
        Option          "ZAxisMapping"          "4 5"
EndSection
...
Section "ServerLayout"
        ...
        InputDevice     "Generic Mouse"
        ...
EndSection

2.4 jdmouse のコンパイルとインストール

jdmouse アーカイブのトップディレクトリで,以下のコマンドを実行します. プログラムが /usr/local/bin の下にインストールされます.

$ make
$ su
# make install

2.5 設定ファイルのコピーと編集

configs/dot_jdmouse_event を  /.jdmouse_event にコピーし,好みの動作に なるよう編集します.

2.6 ドライバのロード

ここで必要なドライバをロードします.

# modprobe sonypi
# modprobe uinput

2.7 プログラムの起動

やっとおまちかねのプログラムの起動です.

$ jdmouse &

3. jdmouse

3.1 コマンドライン

jdmouse [-d] [-s sonypiデバイスファイル] \
             [-e イベントハンドラ] \
             [-u uinputデバイスファイル] [-b 1|2|3]]

3.2 オプション

-d

このオプションが指定されると,jdmouse は,イベントを標準エラー出力へと ダンプします.

-s sonypiデバイスファイル

sonypi デバイスファイルを指定します. 指定の無い場合は /dev/sonypi を使用します.

-e イベントハンドラ

イベントを処理するプログラムを指定します. 指定の無い場合は  /.jdmouse_event が使用されます.

-u uinputデバイスファイル

uinput デバイスファイルを指定します. 指定の無い場合は,ジョグダイヤルイベントのホイールマウスイベントへの変 換は行なわれず,イベントは破棄されます.

このオプションを指定し,jdmouse でのジョグダイヤルイベント変換を使用し たい場合は,sonypi ドライバのモジュールオプションで useinput=0 を指定 してください. でないと,ジョグダイヤルの操作に対し,sonypi からのイベントと jdmouse からのイベントが X に二重に通知されることになります.

-b 1|2|3

ジョグダイヤルのクリック時に通知するマウスのボタン番号を指定します. 番号は X でのマウスボタン番号に合わせてあり,1 = 左, 2 = 中(orホイー ル), 3 = 右のマウスボタンクリックに相当します. 指定の無い場合は 2(中)が使用されます.

3.3 イベントハンドラ API

説明

jdmouse からイベントハンドラは,system(2) により以下の形式で呼び出されます.

プログラム名 イベント名 通し番号
プログラム名

イベントを処理するプログラムで,-e オプションで指定されたもの,もしく はデフォルト値 ( /.jdmouse_event) です.

プログラム自体は実行できれば良く,bash, perl などのスクリプト言語や C などの実行ファイルなど,種類は問いません.

イベント名

sonypi デバイスからのイベント名. /usr/include/linux/sonypi.h の中の SONYPI_EVENT_ で始まるものです. ただし,先頭の SONYPI_EVENT_ は省略して渡されます. つまり,「Fn + F1 キーが押された」というイベント場合,ここには FNKEY_F1 が指定されます.

通し番号

各イベント毎の通し番号で,0 番から振られます.

例えば,jdmouse の起動直後に Fn + F1 キーが押された時は 0 が,その次に Fn + F1 が押された時は 1 が…となります. が,その次に Fn + F2 が押された場合は,0 となります. 各イベント毎に固有の通し番号を振るためです.

この値は,例えばボタンを押す毎にバックライトの明るさを最大 -> 最小 -> 最大 -> ... と周期的に変化させたい時に使用することができます.

サンプル

configs/dot_jdmouse_event にサンプルのシェルスクリプトがあります. 参考に.

3.4 注意

VAIO C1 シリーズの CAPTURE ボタンでは,ボタンのプレス・リリースの度に イベントが発生します. また,半押し/深押しという2種類の操作があり,外部ハンドラで処理するの には面倒です.

と,jdmouse 側で 1 つのイベントにまとめられてハンドラが呼び出されます.

3.5 バグ

イベントハンドラ API での通し番号は,符号無し 32 ビット値です. つまり,UNIX 時刻と同様の問題を抱えており,この範囲を越えると 0 に戻っ てしまいます. が,jdmouse のデバッグに生涯全てを捧げるつもりでもなければ,このバグが 問題となる事態はまず無いでしょう.

4. blctl

バックライトの明るさの制御

4.1 コマンドライン

blctl [数値]

4.2 オプション

数値

バックライトの明るさを指定します. 数値は 0 〜 255 を指定することができます. 0 が最暗で 255 が最明です.

数値の指定の無い場合は,現在の設定値を標準出力へ出力します.

4.3 注意

いくつかの VAIO シリーズでは,設定値 100 で最明値となるものもあるそう です.

5. xzoom

X の画面のズームイン・ズームアウト

5.1 コマンドライン

xzoom [+|-]

5.2 オプション

+|-

`+' でズームイン,`-' でズームアウトします. オプションの無い場合はズームインします.

5.3 バグ

このプログラムの機能は,「右 Ctrl」「右 Alt」「テンキー + or -」の同時 押しイベントを uinput ドライバ経由で発生させることで実現しています. xmodmap コマンドなどでこれらのキーに別の機能を割り当てられている場合, ズームイン・ズームアウトは動作しません. また,X の設定で「これらのキーの同時でズームイン・ズームアウトしない」 よう設定されている場合も同様です.

6. acpi3

ACPI S3 (サスペンド)への移行

6.1 コマンドライン

acpi3

6.2 オプション

なし

6.3 注意

要するに

# echo -n 3 >/proc/acpi/sleep
と等価な動作をするプログラムです.

setuid ビットを立ててインストールすることにより,一般ユーザ権限でも実 行可能となりますが,コンピュータの運用状況によってはセキュリティホール となる可能性もあります.

そのような場合は sudo による管理を検討してください.