sevilwm-0.9.0
なんか最近欲しいなーと思っていた、 window の位置を記憶するとかそのへんをやろうかという試みを。色々適当なところ多いんで今度なおす。
http://shinh.skr.jp/tmp/sevilwm-0.9.0.tgz
やりたいことはまぁ色々あったんですが、とりあえずランタイムに window の位置やらキー設定を変えたい(こっちは未実装)というのがありました。しかしまぁスクリプト言語組み込むとかは sevilwm 的に好みじゃないので以下のようなものになりました。
/tmp/sevilwm_$DISPLAY というディレクトリを作って、その下に unix domain socket を配置してあります。こっから情報が取れます。
% ruby unixclient.rb /tmp/sevilwm_$DISPLAY/info % ruby unixclient.rb /tmp/sevilwm_$DISPLAY/windows % ruby unixclient.rb /tmp/sevilwm_$DISPLAY/config_keys.def
など。 unixclient.rb は配布パッケージにつけておいたけど、 unixcat とか telnet -u がある環境ではそっち使っても良いかと。で /tmp/sevilwm_:0.0/ctrl に命令を送り込むと状態を変えれるようにしようかと。
% ruby unixclient.rb /tmp/sevilwm_$DISPLAY/ctrl VDESK(2) WIN("mlterm", 0, 30, 1, 564, 340, 1, 0, '\0') SHUTDOWN()
などとして vdesk の変更やら window の移動なんかができます。
でまぁ重要なのは WIN(...) っていうのは /tmp/sevilwm_$DISPLAY/windows が吐くフォーマットと一致してるので、ここから取得したものを再度喰わせれば状態の復帰ができます。あとはまぁちょっとスクリプト書けば focus のあたってる window をスクリプトで適当な位置に移動する…とかも書けると思います。
あと window の初期位置の設定も /tmp/sevilwm_$DISPLAY/windows の出力でできるようになっていて、これを config_win.def って名前で吐いてやって再コンパイルすればいいようになっているはずです。詳しくは config_win.def を参照。
あ、あとは CLICK_FOCUS がデフォになってて、ソースを統一しました。 CLICK_FOCUS いやな人は Makefile 修正してください。
TODO:
- バグとか適当に書いた部分をなおす
- ctrl に config_key.def を喰わせられるように
- config_win.def を吐けるように (confdata.o みたいなのを objcopy で作ればすぐできる)
- たぶん Ruby で unixclient.rb よりは便利なフロントエンドを書く
- info の吐いてる情報はこれで十分?
- ctrl にもっと機能を。具体的にはコマンドラインフラグで渡してるヤツとか
- ignores を入出力できるように
- つか ev_wm_restart するとコマンドラインフラグ忘れるのはなんとかすべき
- ev_wm_restart した時に window の順序が逆転するのをなんとかできるならする。(まぁ2回再起動すればなんか元に戻るんだが)
- ドキュメントとか
- コネクションのタイムアウト
- クライアントがソケットのバッファサイズ以上のものを出力させておいてそれを受け取らない…とかすると window manager が止まってしまう気がするので、 select で write もチェックした方が良いと言えば良い
ipc.c のいくつかの部分と (config_key.def を出力するとか)、いじろうというきっかけを下さった mitake さんに感謝。
まだもう少しはやる気が残ってそうなので希望とかあったら教えてくださるとすごく喜びます。