wmctrl窗口移动命令出现偏差是什么原因

Jac*_*ijm 14 command-line window-manager unity wmctrl

关于 wmctrl

使用wmctrl(默认情况下未安装),我们可以获取有关窗口的信息、它们的 id、它们的几何形状、它们所属的 pid 等。我们还可以使用几个命令移动调整窗口大小。然而,在某些方面,它的行为似乎不合逻辑。我的问题是关于移动窗口wmctrl以下方式:

获取资讯

当我运行命令时:

wmctrl -lG
Run Code Online (Sandbox Code Playgroud)

我得到(ao)关于下图中窗口的以下信息:

0x04200085  0 746  443  468  205  jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
Run Code Online (Sandbox Code Playgroud)

在第 3-5 列中,几何信息告诉我们 x/y 坐标和宽度/高度。

移动/调整窗口大小

当我将这些坐标放在wmctrl命令中以移动/调整窗口大小时,它应该什么都不做,因为坐标没有改变:

wmctrl -ir 0x04200085 -e 0,746,443,468,205
Run Code Online (Sandbox Code Playgroud)

偏差

但是,下面的图片显示窗口向下移动(准确地说是 28px)。我假设原因是wmctrl 窗口移动命令是用工作区域(屏幕减去面板高度)wmctrl -lG计算的,而命令是用总屏幕大小计算的。然后仍然无法解释 4px(面板高 24px)。

虽然偏差可以在脚本中很好地得到补偿,但我不明白原因的事实并不令人满意,所以问题是:

这种偏差的确切原因是什么?


在输出中移动具有精确坐标wmctrl -lG的窗口不应移动窗口,但它会

在此处输入图片说明

在此处输入图片说明

小智 20

发生的事情是 wmctrl 正在返回装饰内窗口的几何形状(即不包括标题栏和边框),但使用较大的窗口位置进行移动。

(删除了一些命令输出行:xdotool可能未安装)

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x04000040
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950
Run Code Online (Sandbox Code Playgroud)

下一个命令提示输入感兴趣的窗口并返回包含所有装饰的父窗口,并根据使用的窗口主题而有所不同。

$ xdotool selectwindow
25166060

$ xdotool getwindowgeometry 0x18000ec
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977
Run Code Online (Sandbox Code Playgroud)

如您所见,这是一个不同的窗口;X 位置开始向左 (702-2) 2px,总宽度大 4px (900+2+2),因为右边框也是 2px。Y 更高(在顶部边框(如果有)和标题栏之上);由于所有这些加上底部边框,高度更大。

wmctrl 将父窗口移动到子窗口所需的 [X,Y] 位置;宽度和高度正确应用于子项,如下面的“之前和之后”所示。

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

$ wmctrl -ir 0x04000040 -e 0,702,23,900,950   # <----- "MOVE/RESIZE" *****

$ wmctrl -lG
0x04000040  0 704  46   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 702,23 (screen: 0)    <----- Desired [X,Y] applied to parent
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 704,46 (screen: 0)
  Geometry: 900x950               <----- Desired [W,H] applied to child
Run Code Online (Sandbox Code Playgroud)

编辑:附加信息。

桌面几何、视口和工作区

$ wmctrl -d    # (KDE)
0  * DG: 1680x1050  VP: 0,0  WA: 0,0 1680x1015  Desktop 1
Run Code Online (Sandbox Code Playgroud)
$ xdotool -v
xdotool version 3.20140217.1
Run Code Online (Sandbox Code Playgroud)

https://github.com/jordansissel/xdotool

回复:@Sneetsher 在评论中提示

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Run Code Online (Sandbox Code Playgroud)

  • @JacobVlijm,`xprop` 似乎显示了装饰填充:`_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6` 和`_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6`。检查可能会有所帮助。 (3认同)