如何使用命令将应用程序从工作区1切换到2


12

有什么方法可以在命令行上将在一个工作区中运行的应用程序切换到另一个?我使用Ubuntu 10.04

UPDATE1
根据以下建议

 wmctrl -l
0x02200003 -1 bond Bottom Expanded Edge Panel
0x02200049 -1 bond Top Expanded Edge Panel
0x02000020  0 bond x-nautilus-desktop
0x04e00004  0 bond bond@bond: ~
0x0482a380  0 bond OMG! Ubuntu! | wmctrl - Chromium
0x05000072  0 bond how to shift applications from workspace 1 to 2 using command - Ask Ubuntu - Stack Exchange - Google Chrome

现在当我键入

wmctrl -r :OMG! Ubuntu! | wmctrl - Chromium: -t 2 No window was specified.

那么如何正确使用它呢,上面的错误是什么呢?


我尝试过的UPDATE2

wmctrl -r 0x05000072 -t 2

但是窗户没有任何作用,它们仍留在相同的工作空间中。


我已使用有关-r和-i的更好信息来更新我的答案。如果-r参数包含空格,则应将其括在“引号”中。如果-r的参数是窗口ID,则还需要在命令行上指定-i。

Answers:


14

如果您正在使用像Metacity(Unity 2-d)这样的兼容窗口管理器,则可以使用wmctrl将窗口切换到另一个桌面。语法为wmctrl -r :ACTIVE: -t <DESKTOP>。您还可以使用更改当前桌面wmctrl -s <DESKTOP>。桌面编号从0开始。一行上是:

wmctrl -r :ACTIVE: -t 1; wmctrl -s 1

如果要将活动窗口以外的窗口切换到另一桌面,请使用标题中的文本作为-r的参数。例如:

wmctrl -r "Chromium" -t 1

另外,您可以使用wmctrl -l列出可用窗口并将ID号传递给-r而不是特殊字符串:ACTIVE:。传递ID时,还需要添加-i。例如:

$ wmctrl -l
0x03e00189  0 hostname Ask Ubuntu - Chromium
$ wmctrl -i -r 0x03e00189 -t 2

(wmctrl可以通过安装在Ubuntu上sudo apt-get install wmctrl。)目前,不幸的是,这似乎不适用于标准Unity。


@skyblue很好的信息。看不清楚的一件事是我如何知道桌面窗口是否不存在,以及我正在寻找的是假设chrome正在运行,并且我希望chrome从当前桌面切换到另一桌面然后如何运行为了这。
注册用户

如果您使用的是Chrome浏览器(标题中带有“铬”的浏览器,则wmctrl -r "Chromium" -t 1只要使用与Unity-2d兼容的窗口管理器,就可以在他的答案中用作天蓝色提及。)
John S Gruber

3

这是我的脚本,可以实现您的要求:https : //github.com/norswap/wmov/blob/master/wmov.sh

以当前形式,它可以将窗口(通过将不区分大小写的字符串与子字符串标题进行匹配来wmctrl -r选择),例如通过选择明确的桌面编号或通过指示当前桌面的方向来将窗口发送到其他桌面桌面。

例如:

./wmov.sh mov "Google Chrome" 3 # sends Chrome to desktop 3 (bottom left)
./mov.sh mov Skype right # sends Skype to the desktop to the right of
                         # the current desktop (if any)

它确实按照desgua的帖子所述工作。它还具有将窗口发送到其他工作区的功能。


我喜欢这种解决方案,因为它可以识别部分窗口名称匹配的窗口,当程序根据上下文修改其部分名称时特别有用。通过名称调用窗口比查找其PID更容易。缺点是,如果名称中有多个带有相同字符串的窗口,则无法预测wmov.sh将抓取哪个窗口。
Andrew P.

3

可以使用进行此操作xdotool但是如果您使用的是compiz该解决方案,则可能不适用,因此请记住这一点。

要将特定窗口(活动窗口)切换到其他工作区,可以使用

xdotool getactivewindow set_desktop_for_window 1

或者对于脚本,您可能需要使用以下命令将特定程序的窗口切换到给定的工作区:

xdotool search --class firefox set_desktop_for_window %@ 1

此命令搜索并找到firefox窗口,然后将其转移到工作区1,在其中它们将显示为最小。要返回firefox默认桌面,只需在命令末尾将1替换为0。要将另一个窗口发送到另一个工作区,只需firefox用另一个程序名称替换即可。

%@代表从--search参数传递的窗口非常关键,就好像您没有传递任何窗口一样。

有关更多信息,请参见man xdotoolUbuntu联机帮助页。


2

如果您正在使用compiz,请在此处查看compiz Wiki。那里有几个例子。查看“ put”插件。

./compiz-dbus-send.py put put_viewport_right_key

1

首先,冒号是:ACTIVE:魔术令牌的一部分,用于指示活动窗口。您通常不想要它。其次,您需要引用带空格的字符串。

您还可以获取窗口ID(0x...每行的开头),并使用该ID 而不是使标题起作用。

$ wmctrl -r 'OMG! Ubuntu! | wmctrl - Chromium' -t 2 # wherever it is, move it to 2
$ wmctrl -r 0x0482a380 -t 2 # same thing

获取窗口ID的另一种方法是运行xwininfo,然后单击所需ID的窗口。
geekosaur 2011年

我尝试了您的方法,但对所讨论的窗口没有任何影响。
注册用户

@注册用户:什么窗口管理器?(wmctrl -m
geekosaur 2011年

抱歉,延迟回复wmctrl -m名称:compiz类:N / A PID:N / A窗口管理器的“显示桌面”模式:OFF
注册用户

嗯 根据使用Compiz插件的建议,我将猜测Compiz实际上并未实现完整的EWMH规范,因此wmctrl将无法正常工作。(特别是,它必须PropertyChange在根窗口上侦听特定属性的事件,然后对这些属性的内容进行操作。)
geekosaur 2011年

0

通过稍微修改作为此问题的解决方案给出的脚本,以下代码将给定的窗口“带”到当前工作区(在compiz中):

#!/bin/bash

SCREEN_W=$(xwininfo -root | sed -n 's/^  Width: \(.*\)$/\1/p')
SCREEN_H=$(xwininfo -root | sed -n 's/^  Height: \(.*\)$/\1/p')

NAME="$1"

wmctrl -xlG | awk -v NAME="$NAME" '$7==NAME {print $1}' | while read WINS; do wmctrl -ir "$WINS" -e "0,0,0,$SCREEN_W,$SCREEN_H"; done

exit 0

如果需要一个任意的工作空间,那么就需要添加/减去相应的$SCREEN_W/ $SCREEN_H,这是工作空间离目标窗口多次的次数。


0

尝试:

wmctrl -r “window name(or any string in the title)” -t `wmctrl -d | grep “workspace name” | cut -d" " -f1`

让我解释一下:在wmctrl的帮助下显示

    -r <WIN> -t <DESK>   Move the window to the specified desktop.
    <DESK>               A desktop number. Desktops are counted from zero.
    <WIN>          This argument specifies the window. By default it's
                   interpreted as a string. The string is matched
                   against the window titles and the first matching
                   window is used. The matching isn't case sensitive
                   and the string may appear in any position
                   of the title.

                   The -i option may be used to interpret the argument
                   as a numerical window ID represented as a decimal
                   number. If it starts with "0x", then
                   it will be interpreted as a hexadecimal number.

wmctrl -d 可以列出所有工作区,我的计算机现在显示如下:

0-DG:1600x900 VP:不适用WA:0,0 1600x868代码
1 * DG:1600x900 VP:0,0 WA:0,0 1600x868播放 
2-DG:1600x900 VP:N / A WA:0.011x868研究

*表示当前工作空间

顺便说一句,wmctrl -l就是列出所有窗口(您已经知道),现在在我的计算机中它们是:

0x05400008 1个用户-LinuxMint终端
0x03a0008e 0用户-LinuxMint Mozilla Firefox


因为“ DESK”必须是数字,所以我用grep “workspace name” | cut -d" " -f1它来获得它。

例如,如果我想将Firefox移至工作区“代码”,则可以使用:

wmctrl -r "firefox" -t 0 

要么

wmctrl -r "moz" -t `wmctrl -d | grep "code" | cut -d" " -f1`

wmctrl -r -i 0x03a0008e -t `wmctrl -d | grep "code" | cut -d" " -f1`

只需为我工作一次,我不知道为什么!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.