GUIプログラムを起動すると、そのウィンドウが現在アクティブなデスクトップ(基本的にはランダムなデスクトップ)に表示されます。
特定のデスクトップに表示させるにはどうすればよいですか?たとえば、起動時に特定のプログラムを起動してデスクトップに配布したいとします。
一部のプログラムを常に特定のデスクトップで起動するように、openboxの構成ファイルを既に設定しました。
理想的には次のようになります。
start_on_desktop 1 gnome-terminal --tab -e program1 --tab -e program2
start_on_desktop 2 gnome-terminal --tab -e program3 --tab -e program4
start_on_desktop 3 firefox
他のデスクトップで同じプログラムを起動できるはずです。
また、デスクトップXでプログラムを起動してからデスクトップYに切り替えると、突然XにあるはずのプログラムがYに表示されます。多くのプログラムを起動してデスクトップを頻繁に切り替えると、混乱してしまい、必要になります。それらを一緒に収集し、正気に再配布します。
また、最初の最初のgnome-terminalをデスクトップ3に配置したいのですが、後続のgnome-terminalを、gnome-terminalを起動するキーストローク(これもopenboxで構成されています)を押したデスクトップに配置したいと思います。
試してください devilspie :
Devil's Pieは、作成時にウィンドウを検出し、ウィンドウを一連のルールに一致させるように構成できます。ウィンドウがルールに一致する場合、そのウィンドウで一連のアクションを実行できます。たとえば、X-Chatで作成されたすべてのウィンドウをすべてのワークスペースに表示させることができますが、メインのGkrellm1ウィンドウはページャーまたはタスクリストに表示されません。
wmctrl
を使用してスクリプトを実行する最初のパスを次に示します。
Metacityで動作しますが、EWMHにも準拠しているため、Openboxでも動作するはずです。
GNUスリープに依存します。それがない場合は、tries
を10
に変更し、sleeptime
を1
に変更します。
start_on_desktop
#!/bin/sh
if test $# -lt 2
then
echo "Usage: start_on_desktop <desktop> <command> [<command args>...]" 1>&2
exit 2
fi
desktop=$1
shift
"$@"&
pid=$!
tries=100
sleeptime=0.1
while test $tries -gt 0
do
sleep $sleeptime
windows=$(wmctrl -l -p)
while read _id _desktop _pid _rest
do
_ppid=$(ps -o ppid= -p $_pid)
if test "$_pid" = "$pid" -o "$_ppid" = "$pid"
then
id=$_id
break 2
fi
done <<EOF
$windows
EOF
tries=$((tries - 1))
done
if test -n "$id"
then
wmctrl -i -r "$id" -t "$desktop"
exit $?
else
echo "Window not found" 1>&2
exit 1
fi
そして、これが現在のデスクトップを見つけるためのスクリプトです。
current_desktop
#!/bin/sh
desktops=$(wmctrl -d)
while read id stat rest
do
if test "$stat" = "*"
then
echo $id
exit 0
fi
done <<EOF
$desktops
EOF
echo "Cannot determine current desktop" 1>&2
exit 1
このように使用すると、起動に時間がかかるアプリケーションを、起動したデスクトップに戻すことができます。
start_on_desktop $(current_desktop) <firefox or Eclipse or whatever>
4つのstart_on_desktop
行を.Xclients
または.xsession
に配置すると思います。