关于 wmctrl
使用wmctrl
(默认未安装),我们可以获取有关窗口的信息,包括它们的 ID、它们的几何形状、它们所属的 pid 等。我们还可以移动或者调整大小窗口有多个命令。然而,在某些方面,它的行为似乎不合逻辑。我的问题是关于移动窗户wmctrl
:
获取资讯
当我运行命令时:
wmctrl -lG
我获得有关下图中窗口的以下信息:
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
不应该移动窗口,但它确实
答案1
发生的情况是,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
答案2
我遇到了同样的问题并且找到了解决方法。
情况
我的情况是基于安装了 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()
然后,您可以关闭窗口装饰、移动窗口以及打开窗口装饰。