来自 man wmctrl:
wmctrl 是一个命令,可用于与与 EWMH/NetWM 规范兼容的 X 窗口管理器进行交互。wmctrl 可以向窗口管理器查询信息,它可以请求执行某些窗口管理操作。
具体问题
该wmctrl -d
命令可用于获取有关桌面(视口/工作区)的信息,该wmctrl -lG
命令列出所有窗口,包括它们的几何信息。
我如何(在 Unity 中与其他窗口管理器相比):
- 了解工作区的概况及其排列方式?
- 找出哪个是当前工作区?
- 从绝对意义上找出窗户的位置?
- 列出当前工作区中的窗口?
从命令行,使用这两个命令?
背景资料
wmctrl -d 命令
列出桌面。在(例如)Xubuntu 上,当我运行时wmctrl -d
,我可以在输出中清楚地看到哪个是当前工作区,以及工作区上的屏幕分辨率 (DG)。
0 - DG: 1024x600 VP: N/A WA: 0,31 1024x569 1
1 - DG: 1024x600 VP: N/A WA: 0,31 1024x569 2
2 - DG: 1024x600 VP: N/A WA: 0,31 1024x569 3
3 * DG: 1024x600 VP: 0,0 WA: 0,31 1024x569 4
当前工作区标有*
。
然而,在 Unity 上,输出wmctrl -d
只显示一个(非常大的)工作区,标有*
,无论哪个是当前“工作区”,例如:
0 * DG: 3360x2100 VP: 1680,0 WA: 65,24 1615x1026 N/A
来自:: 的 wmctrl -lG 命令man wmctrl
:列出由窗口管理器管理的窗口。:在 -l 操作的输出中包含几何信息
-l
-G-
当我wmctrl -lG
在(例如)Xubuntu 上运行时,每个工作区上都有一个鼠标垫窗口:
0x03400003 0 241 197 533 244 jacob-1001PX Untitled 1 - Mousepad
0x03400197 1 299 222 533 244 jacob-1001PX Untitled 2 - Mousepad
0x034001be 2 236 201 533 244 jacob-1001PX Untitled 3 - Mousepad
0x034001e3 3 283 228 533 244 jacob-1001PX Untitled 4 - Mousepad
这些信息很容易理解;从第二列,我们知道窗口所在的工作区、它的位置(x、y、第 3/4 列)和大小(x、y、第 5/6 列)。该位置是相对于它所在的工作空间给出的。
然而,在 Unity 上,情况就完全不同了。当我有四个工作区并在每个工作区上打开一个 gedit 窗口时:
0x03c03b81 0 468 -884 875 741 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
0x03c03e74 0 369 164 1111 741 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit
0x03c03f8e 0 -1269 214 1111 741 jacob-System-Product-Name Niet-opgeslagen document 3 - gedit
0x03c00085 0 -1376 -917 1111 741 jacob-System-Product-Name Niet-opgeslagen document 4 - gedit
有些窗口有负坐标,有些(可能)有超过我屏幕分辨率的坐标。
视口与工作区
正如这个回答中所指出的,Compiz/Unity 与其他窗口管理器之间存在本质区别。
如果我们看一下 Xubuntu (XFCE),所有的工作空间都是独立的空间。我们只需要知道窗口所在的工作空间,以及 x 和 y 坐标。基本上,除了“线性”顺序 1、2、3 等之外,没有对工作空间进行排序的矩阵。
这在 Unity 中是不同的,Unity 中实际上只有一个工作区。(跨越)工作区分为多个部分,称为视口。这些视口按行和列排列。
这样一来,一个窗口可能在所有视口上都是部分可见的:
不同于工作区:
wmctrl -d 的输出差异以及如何解释
要了解 的输出
wmctrl -lG
,我们应该了解它的“解剖结构”:由于 Unity 只有一个工作区,因此输出始终显示
*
on[2]
。我们如何知道视口是如何排列的以及当前的视口是什么?资料在
VP: 1680,0
([4]
)内。不仅仅是作为视口编号,而是作为 x 和 y 坐标。这些坐标可以是零或x
*屏幕的分辨率。要知道视口是如何设置的,我们还需要知道屏幕的分辨率(在 的帮助下xrandr
)。如何查明:
目前有多少视口以及它们是如何排列的:
查看
DG: 3360x2100
“Unity”示例中的 ,并知道我们的屏幕分辨率为 1680x1050,我们可以得出结论,视口有两列 (3360/1680) 和两行 (2100/1050)。这是当前工作区:
示例
屏幕的分辨率为 1680x1050。视口信息说
VP: 1680,0
。坐标显示为左上角,所以我们在第二列,第一行。绝对意义上的窗口所在的位置:
一旦我们知道哪个视口是当前视口,我们就可以定位窗口,在 的输出中查看它们的坐标
wmctrl -lG
[3]
:窗口名称
我们可以简单地定位窗口,原点在当前视口的左上角。
下面是一个屏幕分辨率为 1680x1050、视口为 2x2 的示例:
从视口 1 的角度看窗口坐标
viewport 4 视角下的窗口坐标
有了上面的信息和
wmctrl -lG
(the window coordinates, section[3]
) 的帮助,很简单:如果
然后一个窗口位于当前视口上。