Hatena::ブログ(Diary)

がりん日記

お知らせ:2009.10.01
「がりん日記」の内容は、順次 http://garin.jp の「ドキュメント」に移行します。
このページは閉鎖される予定です。

2009-06-29

ウィンドウを透過してアクティブなウィンドウを目立たせる

ウィンドウマネージャ 「ion3」でアクティブなウィンドウ(ion3だとactiveなframe) を目立たせる方法。

インアクティブなウィンドウを透過処理で暗くして(輝度を下げる)、相対的にアクティブなウィンドウを目立たせます。

f:id:garin:20090629225153j:image

右下がアクティブなウィンドウ。他の上と左のウィンドウを暗くしている

おおまかな手順としては以下の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  
既存のバグ

現時点でいくつかのバグが見つかっています。

  1. WGroup.set_fullscreen でフルスクリーンにした時に透過されない場合がある
  2. WGroup.set_fullscreen でフルスクリーンにしたあと別の Window に移動すると透過されない場合がある
  3. システムが高負荷の時に透過されない場合がある

もし、透過がうまくいかくなった時は他の frame に移動すると復帰する事があります。

それでも直らない場合は xcompmgr と focustrans.rb を kill して再度実行してみてください。

その他にバグを発見された方はコメント欄に報告お願いします。