这类似于Quickly place a window to another screen using only the keyboard,但我希望能够使用命令行(这样我需要做的就是从 bash 历史记录中调用命令行)。
例如,发送
- 所有的 gnome 终端窗口
eDP1
, - 所有 Emacs 窗口到
VGA1
, 和 - 所有 Chrome 窗口
HDMI1
(并在移动后最大化它们 - 但不是疯狂的F11方式,正常的窗口管理器式最大化)。
我想通过可执行文件名称指定窗口。
这类似于Quickly place a window to another screen using only the keyboard,但我希望能够使用命令行(这样我需要做的就是从 bash 历史记录中调用命令行)。
例如,发送
eDP1
,VGA1
, 和HDMI1
(并在移动后最大化它们 - 但不是疯狂的F11方式,正常的窗口管理器式最大化)。
我想通过可执行文件名称指定窗口。
通过(屏幕)名称将特定窗口类的所有窗口移动到特定屏幕
下面的脚本将通过屏幕名称将属于特定
WM_CLASS
(应用程序)的窗口发送到特定屏幕。脚本中以及下文进一步说明了如何完成此操作。该脚本假定屏幕是水平排列的,并且或多或少是顶部对齐的(差异 < 100 PX)。
剧本
如何使用
该脚本同时需要
wmctrl
和xdotool
:将下面的脚本复制到一个空文件中,另存为
move_wclass.py
通过命令运行它:
例如:
对于
WM_CLASS
,您可以使用部分,WM_CLASS
如示例中所示。屏幕的名称必须是准确且完整的名称。它是如何完成的(概念)
解释主要是关于概念,而不是关于编码。
在 xrandr 的输出中,对于每个连接的屏幕,都有一个字符串/行,如下所示:
此行向我们提供有关屏幕位置及其名称的信息,如此处所述。
该脚本列出了所有屏幕的信息。
wmctrl -l
当脚本以屏幕和窗口类作为参数运行时,它会查找屏幕的 (x-) 位置,查找某个类的所有窗口 ( -id 's)(借助xprop -id <window_id>
.随后,脚本将所有窗口一个接一个地移动到目标屏幕上的某个位置(使用
wmctrl -ir <window_id> -e 0,<x>,<y>,<width>,<height>
)并将其最大化(使用xdotool windowsize 100% 100%
)。笔记
该脚本在我运行它的测试中运行良好。在 Unity 上使用
wmctrl
,甚至xdotool
,可能会有一些顽固的特性,但有时需要通过实验而不是推理来解决。如果您可能遇到异常,请提及。我已经将 @jacobs python 代码重写为简单的 bash 并使其工作(我在 ubuntu 16 cinnamon 上测试过)。
我不得不补充
remove,maximized_vert, remove,maximized_horz
说窗户没有移动。sudo apt-get install xdotool wmctrl
/path/to/script.sh "window-name" "monitor-name"
作为记录,这里是我用来组合这个问题和恢复多显示器设置的方法:
您需要使用wmctrl 0.3 或更高版本(因为我的请求请求)。
根据@AndrzejPiszczek 的回答,这里有一种将所有窗口移动到特定屏幕的方法: