当我启动 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 终端位于桌面 3 上,但我还希望后续 gnome 终端位于我按下启动 gnome 终端的按键(也在 openbox 中配置)的桌面上。
答案1
尝试魔鬼派:
Devil's Pie 可以配置为在创建窗口时检测窗口,并将窗口与一组规则进行匹配。如果窗口与规则匹配,它可以对该窗口执行一系列操作。例如,我可以让 X-Chat 创建的所有窗口出现在所有工作区中,而主 Gkrellm1 窗口不会出现在寻呼机或任务列表中。
答案2
这是使用 执行该操作的脚本的第一次传递wmctrl
。
对我来说,它可以与 Metacity 一起使用,并且应该可以在 Openbox 中使用,因为它也符合 EWMH 标准。
依赖于 GNU sleep。如果没有,请将 更改tries
为10
并将sleeptime
更改为1
。
从桌面启动
#!/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
下面是一个用于找出当前桌面的脚本。
当前桌面
#!/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>
我猜你会把四行放在或start_on_desktop
中。.Xclients
.xsession