导致wmctrl窗口移动命令偏差的原因

关于wmctrl

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

获取资讯

当我运行命令时:

 wmctrl -lG 

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

 0x04200085 0 746 443 468 205 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit 

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

移动/调整窗口大小

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

 wmctrl -ir 0x04200085 -e 0,746,443,468,205 

偏差

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

尽管在脚本中可以很好地补偿偏差,但我不理解原因的事实并不令人满意,所以问题是:

造成这种偏差的原因究竟是什么?

使用wmctrl -lG输出中的精确坐标移动窗口不应移动窗口,但确实如此

在此处输入图像描述

在此处输入图像描述

发生的事情是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 

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

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

如你所见,它是一个不同的窗口; X位置向左开始2px(702-2),总宽度大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 

编辑:其他信息。

桌面几何,视口和工作区

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

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 

我有同样的问题,可以找到一个解决方法。


情况

我的情况是基于安装了Compiz的Mate 16.04(激活gtk窗口管理器)

我使用连接到键绑定的脚本将窗口放在预定义的位置。 如果我没有使用最大化选项,则此脚本将失败。


分析

可以通过打开和设置(compiz)中的窗口装饰来打开和关闭问题。


解决方法

可以使用python为特定窗口打开和关闭窗口装饰(使用键绑定可以方便地使用活动窗口)。

 #!/usr/bin/python from gtk.gdk import * import gtk.gdk import time import sys w = gtk.gdk.get_default_root_window().get_screen().get_active_window() w.set_decorations(0) #use 1 to turn on decorations window_process_all_updates() gtk.gdk.flush() 

然后你可以关闭窗户装饰,移动窗户,并打开窗户装饰。