2009-06-29
ウィンドウを透過してアクティブなウィンドウを目立たせる
ウィンドウマネージャ 「ion3」でアクティブなウィンドウ(ion3だとactiveなframe) を目立たせる方法。
インアクティブなウィンドウを透過処理で暗くして(輝度を下げる)、相対的にアクティブなウィンドウを目立たせます。
右下がアクティブなウィンドウ。他の上と左のウィンドウを暗くしている
おおまかな手順としては以下の4ステップです。
1. X.Org の透過機能を有効にする
2. 透過処理用のツール xcompmgr と transset-df をインストールする
3. ion3 の壁紙を暗いものに変更する
4. focustrans.rb スクリプトでインアクティブなウィンドウの透明度を変更する
X.Org の透過機能を有効にする
X.Org に Composite 機能を有効にして、X を再起動します。
グラフィックカードのドライバによっては上手く動作しないようです。Thinkpad T400 の Intel GM45 チップセットでは動作しました(VAIO type p の Intel GMA500では重たくて実用になりません)。
[/etc/X11/xorg.conf] # Extensions セクションに追加 Section "Extensions" Option "Composite" "Enable" EndSection
xcompmgr, transset-df のインストール
透過処理用のツール xcompmgr と transset をインストールします。
xcompmgr はウィンドウを「どう表示するか」を指定し、transset-df はウィンドウの透過度を指定する transset の拡張版です。
xcompmgr は Gentoo/Linux であれば portage でインストールできます。
# emerge xcompmgr
transset-df は portage にないので手動でインストールします。
transset-df(http://transset-df.forchheimer.se/) # wget http://transset-df.forchheimer.se/transset-df-6.tar.gz # make # make install # ls -l /usr/bin/transset-df
xcompmgr, transset-df の使い方
xcompmgr は選択したウィンドウを「どう表示するか」を指定します。
以下のように指定して起動すると、選択したウィンドウが MacOSX のように浮き上がるように表示されます。
また、ウィンドウに影が付きます。
$ xcompmgr -cCfF -r7 -o.65 -l-10 -t-8 -D7
transset-df は指定したウィンドウの透過度を指定します。xcompmgr を起動した状態でないと有効になりません。
$ transset-df 0.5
と実行するとマウスアイコンが「+」に変わりウィンドウを選択できるようになります。
この状態でウィンドウを選択すると、そのウィンドウが指定した透過度(上の例では 0.5)に変更されます(透過度は (薄)0.0〜1(濃)です)
transset-df では透過するウィンドウをポイントの他に、WindowID や WindowName などでも指定できます(後述のスクリプトでは WindowID で指定しています)。
ion3の壁紙を暗いものにする
ion3 自体には壁紙の機能がありません。
そこで、gnome の壁紙機能を使って壁紙を実現します(xm でやろうとしてうまくいきませんでした)。
# emerge gnome-control-center $ gnome-control-center 「外観設定」→ 「背景」 で暗い壁紙にします(garinは単色の黒にしています)。
インアクティブなウィンドウの透明度を変更するスクリプト
上の設定のままだと、暗い壁紙の上にちょっと動くウィンンドウが表示されるだけです。
そこで、かわいあつしさんのサイトにある「フォーカスの当たっていないウィンドウを透過するスクリプト」を使ってインアクティブなウィンドウを透過させます(つまり、背景の暗い壁紙と同化してウィンドウが暗くなる)。
ただ、「透過するウィンドウ」を設定ファイルで指定する必要があったり、ion3で使うと一部挙動がおかしかったり(mod_query.query_execを呼びだすと画面全体が暗くなる)したので、ion3用にRubyで書き直したものを以下に置いておきます。
focustrans.rb の使い方
はじめに xcompmgr を起動しておきます。garin は Mac のようにウィンドウがもわもわ動くのは嫌なので、なにも引数なしで起動します。
$ xcompmgr &
次に focustrans.rb を起動します。
$ focustrans.rb &
focustrans.rb は「アクティブなウィンドウ以外を透過」するではなく「インアクティブになった(さっきまでアクティブだった)ウィンドウを透過」します。
つまり、focustrans.rb を起動した時点ではどのウィンドウも透過されません。ウィンドウ間を移動することでそのウィンドウが透過されます。
focustrans.rb の設定
起動オプションはないので、設定の変更はファイルの中身を直接書き換えてください。
以下の3つは変数で指定できるようになっています。
[focustrans.rb] # アクティブウンドウの透明度 ACTIVE_OPACITY = 1.0 # インアクティブウィンドウの透明度 INACTIVE_OPACITY = 0.4 # チェックする間隔(秒) SLEEP_TIME = 0.1
既存のバグ
現時点でいくつかのバグが見つかっています。
- WGroup.set_fullscreen でフルスクリーンにした時に透過されない場合がある
- WGroup.set_fullscreen でフルスクリーンにしたあと別の Window に移動すると透過されない場合がある
- システムが高負荷の時に透過されない場合がある
もし、透過がうまくいかくなった時は他の frame に移動すると復帰する事があります。
それでも直らない場合は xcompmgr と focustrans.rb を kill して再度実行してみてください。
その他にバグを発見された方はコメント欄に報告お願いします。

