focustran.pl

GNOME-Shellとは関係のないWindow Makerの話題ばかりです。

focustran.pl、いいですね。
今風のWindow Managerに比べて地味っぽいWindow Makerですが、xcompmgrとtranssetを使えば影やらエフェクトやら透過などが実現できます。でも、いちいちWindowを個別指定して透過にするのは面倒なので、起動時のスクリプトで解決することが多いようです。
まあxtermなど限られたアプリだけ透過にするならそれでもいいのですが、アクティブと非アクティブのWindowで透明度の設定を切り替えるとなると、事は単純ではありません。
それで色々ググっていたら、やっぱり先人たちの成果がいくつか見つかりました。
私の環境ではCompositing (Page 1) / WM/DE Talk / CrunchBang Linux Forumsにありました、focustran.plが安定して動作しました。ちなみにオリジナルのスクリプトはtransset-dfで透過設定を実現していますけれど、今のubuntuではx11-appsに含まれるtranssetに変更する必要があります。
transsetに置き換えた実際のコードはこれ。


#!/usr/bin/perl -w

# This script is written by Andrei Perhinschi
# and is licensed under the GNU GPL license
# http://www.gnu.org/licenses/gpl.html

# Much thanks goes to Daniel Forchheimer (http://www.forchheimer.se/)
# for creating transset and the eutotrans
# script from which this script gets its inspiration

if ( !defined $ARGV[0] || !defined $ARGV[1] || !defined $ARGV[2] ) {
die “Usage: focustran <unfocused value> <focused value> <refresh value (secs)>\n”;
}

# default values
$trans_val = $ARGV[0];
$opaque_val = $ARGV[1];
$sleep_val = $ARGV[2];

# grab all window IDs
@win_ids = `xwininfo -root -all`;
foreach my $win_id ( @win_ids ) {
unless ( $win_id =~ /has\ no\ name/ || $win_id !~ /0x/ || $win_id =~ /Desktop/ ) {
$win_id =~ /\ \”/;
$win_id = “$`”;
$win_id =~ s/\s//g;
push @id_lines, $win_id;
}
}

print “ID_LINES:@id_lines\n”;

# make all windows transparent
foreach my $win_id ( @id_lines ) {
system ( “transset –id $win_id $trans_val” );
}

$old_id = 0;
# get currently focused window’s ID
while ( 1 ) {
my $active_id = `xprop -root  | grep “_NET_ACTIVE_WINDOW(WINDOW): window id # “`;
$active_id =~ /\#\s/;
$active_id = “$'”;
chomp $active_id;
# set active window to opaque_val and old window to trans_val
if ( $old_id ne $active_id ) {
system ( “transset –id $active_id $opaque_val” );
system ( “transset –id $old_id $trans_val” );
}
$old_id = $active_id;
print “active_ID:$active_id\n”;
select ( undef, undef, undef, $sleep_val );
}

使い方は実行権を付与してからfocustran.plをパスの通っているところ(/use/local/sbin)などに置いておいてターミナルから実行するだけですが、頻繁に設定を変更することはないので、私は~/GNUstep/Library/WindowMaker/autostartの最終行に次の通り追記しました。


sleep 2
xcompmgr n &
focustran.pl 0.65 0.95 0.2 &

sleepを入れているのは、tint2自身の透過機能とバッティングしないように、安定してからスクリプトを実行するためです。こうしないとtint2の透過設定がうまく働きませんでした。
オプションの数字の意味はコードに書いてあるとおりですが、focustran.plをオプション無しで実行すると

Usage: focustran <unfocused value> <focused value> <refresh value (secs)>

ということで、最初の2つは0〜1の間の数字を、3つ目はリフレッシュの時間を書きます。最初の2つを0にすると何もWindowが見えなくなって慌てますね、きっと。また、リフレッシュが極端に短いと負荷がかかるし無駄なのでホドホドに。
xcompmgrはオプションで影その他色々な設定ができますけれど、凝り過ぎると折角の「軽い」Window Managerとしてのメリットが無くなるハメになるのでお好みで。
ドロップダウンメニューなども透過になるのはご愛嬌です。

Ubuntu

Posted by yoshimi