在Gnome中的不同工作区中打开应用程序

时间:2010-07-28 08:35:07

标签: x11 gnome workspace

鉴于我是一个懒惰的混蛋,我尝试编写一个Bash脚本,可以立即打开不同桌面上的每日应用程序。这个脚本应该在Gnome中工作。 到目前为止我写过:

#!/bin/bash
firefox &
thunderbird &
/usr/bin/netbeans --locale en &
amsn &
gnome-terminal &
sleep 2
wmctrl -r firefox -t 0 && wmctrl -r netbeans -t 1 && wmctrl -r gnome-terminal -t 2 && wmctrl -r amsn -t 6 && wmctrl -r thunderbird -t 7

但是,它不起作用。我的应用程序已打开,但不会将其分配给我指定的桌面:(。

编辑:我将睡眠值改为15 ...只有firefox& netbeans被正确分配,其余部分在我从...执行脚本的工作区中打开。

5 个答案:

答案 0 :(得分:5)

感谢Akira评论,我终于成功地使其工作(脚本在启动时像魅力一样运行)以下是新代码:

#!/bin/bash
wmctrl -n 8

firefox &
thunderbird &
/usr/bin/netbeans --locale en &
amsn &
gnome-terminal &
sleep 15

wmctrl -r firefox -t 0
wmctrl -r netbeans -t 1 
wmctrl -r terminal -t 2 
wmctrl -r amsn -t 6 
wmctrl -r thunderbird -t 7

#focus on terminal
wmctrl -a terminal 

答案 1 :(得分:2)

checkout DevilsPie,它会监视窗口的创建并采取相应的行动。

Devil's Pie可以配置为在创建窗口时检测窗口,并将窗口与一组规则匹配。如果窗口符合规则,则可以在该窗口上执行一系列操作。例如,我可以使X-Chat创建的所有窗口都显示在所有工作空间中,并且主Gkrellm1窗口不会出现在寻呼机或任务列表中。

或者您可以使用能够在内部执行相同操作的窗口管理器,例如。 fluxbox

答案 2 :(得分:2)

在dconf-editor中:

org->gnome->shell->extensions->auto-move-windows
here is what it should look like:
['firefox.desktop:1','pidgin.desktop:2']

答案 3 :(得分:0)

你使用什么图形前端? 例如,当您使用ubuntu与gnome和compiz时,您可以在

中设置窗口位置
  

系统>偏好设置> CompizConfig设置管理器>窗口管理>放置窗口

答案 4 :(得分:0)

此脚本将检查是否需要更改工作区、切换到工作区、启动应用程序、等待窗口创建并切换回原始命名空间。 由于它使用 wmctrl -l 来检查是否创建了新窗口,因此它可以处理快速启动和慢速启动的应用程序,而无需等待静态的几秒钟。

我称这个脚本为 start-on-workspace

用法:start-on-workspace <Workspace> <command> [argument...

#!/bin/sh -e
# get the target ns
target=$(($1 - 1))
shift

# get the current ns
current=$(wmctrl -d | grep '*' | cut -d' ' -f1)
if [ $current != target ]; then
    # switch to target ns
    wmctrl -s $target
fi

# get a checksum of currently running windows
a=$(wmctrl -l | cut -d' ' -f1 | sha1sum | cut -d' ' -f1)
b=$a

# start the app
$@ &

# wait until there is a change on the window list
while [ $a = "$b" ]; do
    a=$(wmctrl -l | cut -d' ' -f1 | sha1sum | cut -d' ' -f1)
    sleep 0.1
done

# switch back to the origin namespace if needed
if [ $current != target ]; then
    wmctrl -s $current
fi