Unity中wmctrl -d和wmctrl -lG之间到底有什么关系?

Jac*_*ijm 5 command-line window-manager unity workspaces wmctrl

来自 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
Run Code Online (Sandbox Code Playgroud)

当前工作区标有*

然而,在 Unity 上, 的输出wmctrl -d仅显示一个(非常大的)工作空间,并用 标记*,无论当前“工作空间”是哪个,例如:

0  * DG: 3360x2100  VP: 1680,0  WA: 65,24 1615x1026  N/A
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这些信息很容易理解;从第二列中,我们知道窗口所在的工作区、其位置(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
Run Code Online (Sandbox Code Playgroud)

有些窗口的坐标为负,有些(可能)的坐标超出了我的屏幕分辨率。

Jac*_*ijm 4

视口与工作区

正如这个答案所指出的,Compiz/Unity 和其他窗口管理器之间存在本质区别。

如果我们看看 Xubuntu (XFCE),所有工作空间都是独立的空间。我们需要知道的是窗口所在的工作空间以及 x 和 y 坐标。基本上,除了“lineair”顺序 1、2、3 等之外,不存在对工作空间进行排序的矩阵。

这在 Unity 中有所不同,Unity 实际上只有一个工作区。(跨度)工作空间分为多个部分,称为视口。这些视口按行和列排列。

这样,一个窗口可能在所有视口上部分可见:

在此输入图像描述

与工作空间不同:

在此输入图像描述

wmctrl -d 输出的差异以及如何解释

要理解 的输出wmctrl -lG,我们应该了解它的“解剖结构”:

在此输入图像描述

  1. 桌面号码(第一个 = 0)
  2. 当前桌面标记(如果是当前桌面(工作区)则为“*”,否则为“-”)
  3. 桌面几何形状(桌面xy的大小)
  4. 视口位置(桌面上的位置;参见 Unity
  5. 工作区几何形状(桌面的“可用”大小,减去面板等;第一列是距左/上的 px)
  6. 桌面的名称(可能包含多个空格)

由于 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]

在此输入图像描述

  1. 窗口 ID
  2. 桌面编号(在 Unity 上:如所指出的始终为 0)
  3. 窗口坐标,从当前视口的角度(xy)
  4. 窗口大小,从(wh)的角度
  5. 计算机名称
  6. 窗口名称

    我们可以简单地定位窗口,原点位于当前视口的左上角。

    下面是屏幕分辨率为 1680x1050、视口 2x2 的示例:

    从视口 1 的角度来看的窗口坐标

    在此输入图像描述

    视口 4 角度的窗口坐标

    在此输入图像描述

    • 这是当前工作区上的窗口:

    有了上面的信息和wmctrl -lG(窗口坐标,部分[3])的帮助,非常简单:

    如果

    1. 窗口的 x 坐标介于 0 和屏幕(水平)分辨率之间,并且
    2. 窗口的 y 坐标介于 0 和屏幕(垂直)分辨率之间

    然后一个窗口位于当前视口上。