jdmouse は SONY VAIO シリーズのジョグダイヤル・アプリケーションキーなどを使うためのプログラムです.
以下,PCG-C1XE 上で実装・確認した機能です.
X 上でホイールマウスのホイールとして使用することができます.
CAPTURE ボタンで登録したプログラムを実行することができます. CAPTURE ボタンは浅押し・深押しを判別します.
バックライトの明るさを調整することができます.
サウンドデバイスのメインボリュームを調整することができます.
Fn キー+ファンクションキーなどとのイベントで,登録したプログラムを実行します.
以下,プログラムのカスタマイズにより実装(できるだろうと思う)される機能です.
どの機種に搭載されているかはわからないのですが,ドライバのヘッダファイルにそれらしきマクロがあるので,きっとあるのでしょう.
まず,sonypi デバイスドライバの設定をします. このドライバは,標準の Linux カーネル (2.4.6 以降)に附属しています. ドライバのインストールについて詳しくは,/usr/src/linux/Documentation/sonypi.txt に説明があります.
ハードウェアの直接制御は,このドライバが行ないます. jdmouse プログラムは,このドライバを通じて,イベントの取得やバックライトの制御等を行なっています.
make *config のメニューの中では,「Character devices」−「Sony Vaio Programmable I/O Control Device support」になります. モジュールとしてコンパイルし,ドライバファイルをインストールします.
まず,sonypi デバイスドライバで使用するマイナー番号を決める必要があります.
cat /proc/misc
を実行し,240 〜 255 のうちで,空いている番号を調べ,この中から sonypi デバイスドライバ用のマイナー番号を選んで下さい.
そして,
alias char-major-10-マイナー番号 sonypi
options sonypi minor=マイナー番号 (その他オプション)
と /etc/modules.conf ファイルに追加します.
たとえば,250 番を sonypi デバイスドライバに割り当てる場合,
alias char-major-10-250 sonypi
options sonypi minor=250
とします.
options sonypi …
の行に追加できる(というか,するべき)オプションは(カーネル 2.4.19 の場合)
デバイスファイルのマイナー番号を指定します. sonypi ドライバにはまだ正式なデバイス番号が割り当てられていないようで,このようなオプションがあります. デフォルト(未指定時)は -1 (自動割り当て)です.
ここでは,240 〜 255 の値を指定することをお勧めします. というのは,この範囲は linux では「Reserved for local use」という割り当てになっているので,他のドライバとかち合う可能性が少ないからです.
自動割り当てとした場合,63 番に割り当てられることが多いようです. これは,「ドライバを組み込んだ時に空いている番号を割り振ってもらう」という登録方法です. このため,他にも自動割り当てを受けているドライバが存在する場合,番号の対応が狂ってしまいます.
C1 シリーズのようにカメラを搭載している場合は camera=1 を追加して下さい. デフォルトは 0 (カメラなし)です.
VAIO のモデルによっては,fnkeyinit=1 を指定しないと Fn キーイベントが有効にならないモデルがある,そうです. (というか,私の持っている C1XE がこれに該当するようです.) ただし,この場合,カーネルの ACPI サポートは無効にしておく必要があります.
デフォルトは 0 です.
C1XE の場合このオプションを有効にすると,Fn+ESC,Fn+F12 のサスペンドやハイバネートが効かなくなってしまいます. ここらはマシンの利用状態に応じていろいろ悩んで下さい :-)
未知のイベントをカーネルメッセージとして出力するそうです. デフォルトは 0 (メッセージ出力無し)です.
これは 0 で良いでしょう.
以前の sonypi ドライバとの互換性のある動作をするためのスイッチだそうです. デフォルトは 0 です.
これも 0 で良いでしょう.
ジョグダイヤルの無い機種の場合,nojogdial=1 を指定すると,(デバイスドライバ側で)イベントをより正しく判断するようになるそうです. デフォルトは 0 (ジョグダイヤルあり)です.
ジョグダイヤルの無い機種では nojogdial=1 を指定しておくと良いでしょう.
デバイスドライバと通信するためのファイルエントリを作成します. メジャー番号は 10 (misc device),マイナー番号は, /etc/modules.conf の節で使うと決めた番号です.
例えば,マイナー番号が 250 の場合は
mknod /dev/jdmouse c 10 250
と実行します.
jdmouse プログラムから X サーバへの通信は,FIFO (ネームドパイプ)を用います. この FIFO を
mkfifo /dev/jdmouse
と作成してやります.
XFree86 4.x の場合です.
/etc/X11/XF86Config-4 を以下のように変更し,X を再起動します.
Section "ServerLayout"
…
InputDevice "Mouse99" "SendCoreEvents" # この行追加
…
EndSection
…
# ここから
Section "InputDevice"
Identifier "Mouse99"
Driver "mouse"
Option "Device" "/dev/jdmouse"
Option "Protocol" "IMPS/2"
Option "ZAxisMapping" "4 5"
Option "AlwaysCore"
EndSection
#ここまで追加
とりあえずコンパイル済みの jdmouse プログラムも同梱しています. コンパイル環境は Linux-2.4.19, VineLinux 2.6 です. プログラムとしては,基本的な枯れた機能しか使っていないので,再コンパイルしなくても動作するとは思います.
コンパイルする時は,src ディレクトリで
make clean
make
でおっけー,です.
インストールスクリプトは特に用意していないので,適当にパスの通っているディレクトリにコピーして下さい.
jdmouse プログラムのコマンドラインオプションです.
デバッグモード. イベント番号などを標準出力に出力します. イベント番号の調査や動作確認に使用することができるでしょう.
sonypi デバイスドライバのデバイスファイル名. デフォルトは /dev/sonypi. 通常は指定する必要はないでしょう.
マウスイベントを出力する FIFO ファイル名. デフォルトは /dev/jdmouse. これも通常は指定する必要はないでしょう.
サウンドカードのミキサデバイスファイル名. デフォルトは /dev/mixer. これも通常は指定する必要はないでしょう.
使い方を出力して終了.
コマンドラインでいろいろカスタマイズできるといいのかもしれませんが,機能を増やしたら結構複雑になってきたので,ほとんどの機能についてはコンパイル時決め打ちということにしてしまいました.
デフォルトの動作は以下の通りです.
上下の回転は,ホイールマウスのホイールの上下回転になります. クリックは,マウスの左ボタンクリックになります.
また,サウンドのマスターボリューム調整やバックライト輝度調整時は,ホイールの上下が値の上下になります. この場合はホイールとしては機能しません.
浅押しで mpg123 プログラムを一時停止させます. もう一度浅押しで再開します.
深押しでは,DPMS を強制的に起動し,画面を消灯します.
サウンドのマスターボリュームのミュート・ミュート解除を繰り返します.
ジョグダイヤルでサウンドのマスターボリュームの調整ができます. ウィンドウズとは違って,画面中央にアイコンは出てきません. あしからず.
おそらく「今現在,調整モードかどうかわかんない」という状態になってしまうと思います. そういう場合は,マウスポインタをルートウィンドウ上に持っていき,ジョグダイヤルをクリックしてみましょう. これで確実に調整モードから脱することができます. vi での ESC, Emacs での C-g みたいなもんです.
ジョグダイヤルでバックライトの輝度調整ができます. 調整状態からの脱出法などは,サウンドのマスターボリュームの調整と同様です.
バックライト輝度の最大値と最小値の設定を繰り返します.
ソースファイルを直接編集することによってカスタマイズする,ということにしました.
カスタマイズ項目をコマンドラインオプションで持つには複雑過ぎるし,設定ファイルから読み込むことにすると,パーサが必要だし. パーサなんか入れた日には「飴より笹のほうが高く付く」ようなプログラムになってしまいます.
この手のプログラムは,軽快なのがいちばん.
以上,「ソース直接編集」の言い訳でした.
プログラム先頭の /* ----- configure section begin ----- */
と /* ----- configure section end ----- */
で囲まれた区間を編集,です :-)
それでは,各項目の説明を.
通常は変更する必要はないでしょう.
sonypi ドライバのデバイスファイル名のデフォルト値.
マウスイベント出力 FIFO ファイル名のデフォルト値.
サウンドデバイスのミキサのデバイスファイル名のデフォルト値.
ええと,#define … のオプションを無効にするには,行頭に // を追加して下さい. ただし,#define 名前 値 とある部分は無効にしてはいけません. 「C なんてわかんな〜い」という方のために,念のため :-)
CAPTURE ボタンで半離し(深く押し込んでから半分離す)の時に発生するイベントの設定. これを設定すると,SONYPI_EVENT_PKEY_P1 のイベントも CAPTURE ボタンの半離しと認識されます.
私の C1XE では,この時に SONYPI_EVENT_CAPTURE_PARTIALRELEASED ではなく,なぜか SONYPI_EVENT_PKEY_P1 のイベントが発生してしまうため,現物合わせ,です. jdmouse -d を実行してみて,CAPTURE ボタン半離しで 10 ではなく 32 と出力される場合は,指定して下さい.
バックライト輝度をジョグダイヤルで調整する場合の,1 ステップ毎の値の増減値. この値を大きくすると,ジョグダイヤルの回転に対し輝度の増減が大きくなります.
サウンドボリューム調整時の 1 ステップ毎の値の増減値. この値を大きくすると,ジョグダイヤルの回転に対し,音量のの増減が大きくなります.
ジョグダイヤルのクリックをマウスのどのボタンに割り当てるか設定します. JOGDIAL_CLICK_BUTTON1, JOGDIAL_CLICK_BUTTON2, JOGDIAL_CLICK_BUTTON3 のうちのいずれか 1 つだけを有効にして下さい.
マウス左ボタン
(正しく設定された X では)マウスの真ん中ボタン,もしくはマウスの左右ボタンの同時押し,もしくはホイールのクリック.
マウス右ボタン.
*capture_half_command[] は CAPTURE ボタン半押し,*capture_deep_command[] は,CAPTURE ボタン深押しのときに実行されるコマンドを設定しています.
複数のコマンドがある場合,ボタンの押下ごとにコマンドが順番に実行されます. デフォルトの例では
const char *capture_half_command[] = {
"killall -STOP mpg123",
"killall -CONT mpg123",
"",
};
となっていますが,この場合,
killall -STOP mpg123
killall -CONT mpg123
killall -STOP mpg123
killall -CONT mpg123
また,特に「いつも同じコマンドを実行して欲しい」という場合は
const char *capture_deep_command[] = {
"xset dpms force off",
"",
};
と,コマンド行を 1 行だけ登録することで実現できます.
なお,最後の "",
は必ず入れて下さい.
プログラム中では「コマンド行はこれでおしまい」という目印にしています.
ここでは例として「Fn+1 で画面の背景色を変更する」という機能を追加してみます.
#ifdef CYCLIC_EXAMPLE
で囲まれた部分を参照してみて下さい.
と,これだけで終わらせるのもそっけないので,説明しましょう.
ここらは CAPTURE ボタンの動作 と同様,イベントの発生毎に順番にコマンドを実行します.
const char *fn_1_command[] = {
"xsetroot -solid gray",
"xsetroot -solid seagreen4",
"xsetroot -solid black",
"",
};
プログラム最後の方の switch 文の中です.
#ifdef CYCLIC_EXAMPLE
case SONYPI_EVENT_FNKEY_1: {
static int index = 0;
index = cyclic_command ( index, fn_1_command );
break;
}
#endif
case のラベル値には,sonypi ドライバから渡されるイベント番号を指定します.
このマクロは /usr/include/linux/sonypi.h
に定義されています.
ここでは,{ } で条件式の無いブロックを切って,このブロックの中でのみ有効な静的変数 index を定義しています. これだと,プログラムの他の部分との変数名の整合性を心配すること無く,変数を使用することができます.
cyclic_command という関数は,前の方に定義されていますが,動作は
と,まぁ,理屈はともかく,イベントに対して任意のコマンドを実行する,という処理をこれだけの変更で追加することができます.
ネタが無いなぁ…
まぁ,自身の問題意識と発想を元に,好きなようにプログラムをいじって下さい. というあたりでお茶を濁そう :-)