来自 man wmctrl:
wmctrl 是一个可用于与兼容 EWMH/NetWM 规范的 X Window 管理器交互的命令。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
: 列出窗口管理器正在管理的窗口。
-G-
:在 -l 操作的输出中包含几何信息
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
有些窗口有负坐标,有些(可能)有超出我的屏幕分辨率的坐标。
答案1
视口与工作空间
正如指出的那样这个答案,Compiz/Unity与其他窗口管理器有着本质的区别。
如果我们看看 Xubuntu (XFCE),所有工作区都是独立空间。我们需要知道的只是窗口所在的工作区以及 x 和 y 坐标。基本上,除了“线性”顺序 1、2、3 等之外,没有工作区排序的矩阵。
这在 Unity 中有所不同,实际上只有一工作区。(跨越)工作区被划分为多个部分,称为视口。这些视口按行和列排列。
这样,一个窗口就有可能在所有视口中部分可见:
与工作空间不同:
wmctrl -d 输出的差异以及如何解释
要理解 的输出wmctrl -lG
,我们应该了解它的“结构”:
- 桌面编号(第一个 = 0)
- 当前桌面标记(如果是当前桌面(工作区),则为“*”,如果不是,则为“-”)
- 桌面几何(尺寸桌面 xy )
- 视口位置(桌面上的位置;参见 Unity)
- 工作区几何形状为(桌面的“可用”大小,减去面板等;第一列是从左/上开始的 px)
- 桌面名称(可能包含多个空格)
由于 Unity 只有一个工作区,因此输出总是显示一个*
。[2]
我们如何知道视口是如何排列的以及当前视口是什么?
信息位于VP: 1680,0
( [4]
) 中。不仅仅是视口编号,还有 x 和 y 坐标。这些坐标可以是零或x
*屏幕的分辨率。要了解视口的设置方式,我们还需要知道屏幕的分辨率(借助xrandr
)。
如何查找:
当前有多少个视口以及如何排列:
查看
DG: 3360x2100
“Unity”示例,并知道我们的屏幕分辨率是 1680x1050,我们可以得出结论,有两列视口(3360/1680)和两行(2100/1050)。这是当前工作区:
一个例子
屏幕分辨率为 1680x1050。视口信息为VP: 1680,0
。坐标显示为左上角,因此我们位于第二列第一行。窗户位于绝对感觉:
一旦我们知道哪个视口是当前视口,我们就可以定位窗口,查看输出中的坐标
wmctrl -lG
[3]
:
- 窗口 ID
- 桌面编号(在 Unity 上:如指出的那样始终为 0)
- 窗口坐标,从当前视口 (xy) 的角度来看
- 窗口大小,从(wh)的角度来看
- 计算机名称
窗口名称
我们可以简单地定位窗口,原点位于当前视口的左上角。
下面是屏幕分辨率为 1680x1050、视口为 2x2 的示例:
从视口 1 的角度来看窗口坐标
从视口 4 的角度来看窗口坐标
- 当前工作区中的窗口有哪些:
有了以上信息和
wmctrl -lG
(窗口坐标,部分[3]
)的帮助,非常简单:如果
- 窗口的 x 坐标介于 0 和屏幕(水平)分辨率之间,和
- 窗口的 y 坐标介于 0 和屏幕(垂直)分辨率之间
那么窗口就位于当前视口上。