我需要找到窗口位置和大小,但我无法弄清楚如何.例如,如果我尝试:
id.get_geometry() # "id" is Xlib.display.Window
Run Code Online (Sandbox Code Playgroud)
我得到这样的东西:
data = {'height': 2540,
'width': 1440,
'depth': 24,
'y': 0, 'x': 0,
'border_width': 0
'root': <Xlib.display.Window 0x0000026a>
'sequence_number': 63}
Run Code Online (Sandbox Code Playgroud)
我需要找到窗口位置和大小,所以我的问题是:"y","x"和"border_width"总是0; 更糟糕的是,"高度"和"宽度"在没有窗框的情况下返回.
在这种情况下,在我的X屏幕上(其尺寸为4400x2560)我预期x = 1280,y = 0,宽度= 1440,高度= 2560.
换句话说,我正在寻找python等价物:
#!/bin/bash
id=$1
wmiface framePosition $id
wmiface frameSize $id
Run Code Online (Sandbox Code Playgroud)
如果您认为Xlib不是我想要的,请随意在python中提供非Xlib解决方案,如果它可以将window id作为参数(如上面的bash脚本).在python代码中使用bash脚本输出的明显解决方法感觉不对.
我想改变一个窗口的位置。我的问题是窗口可以最大化,这不允许更改其大小和位置(窗口可以属于任何应用程序)。我使用 KDE4。
我尝试使用ewmh Python 模块。在我的情况下,当窗口最大化时,我只想将它从一台显示器移动到另一台显示器,并保持最大化。我需要取消最大化它以设置其几何形状,因此我尝试使用ewmh.setWmState()
to set _NET_WM_STATE_MAXIMIZED_VERT
, _NET_WM_STATE_MAXIMIZED_HORZ
to 0
, then取消最大化它ewmh.display.flush()
。
有时我可以配置以前最大化的窗口的位置和大小,有时不能。出于某种原因,它不能可靠地工作,如果我只是从单显示器切换到三显示器,则特别有可能无法最大化窗口xrandr
.
请注意,取消最大化总是有效的,(通常)不起作用的是之后更改窗口位置(或大小)。
我也尝试在终端中执行此操作。这是重现我的问题的最简单方法。首先,获取$WID
某个最大化窗口的窗口 ID ( )。然后:
wmctrl -i -r $WID -b remove,maximized_vert,maximized_horz
wmctrl -i -r $WID -e 0,1280,50,1250,1250
Run Code Online (Sandbox Code Playgroud)
但是第二个命令什么也不做,除非我在运行它之前手动移动或调整窗口大小。与 不同ewmh
,wmctrl
如果窗口最大化,则永远不会按预期工作。wmctrl
成功取消最大化窗口,但之后无法更改其位置或大小。
这在单监视器和三监视器 X 屏幕状态下均可重现。
此问题似乎并非特定于任何特定工具。例如,如果窗口只是未最大化但未手动移动/调整大小,则 xdotool 也无法更改窗口大小/位置。
到目前为止,我发现的唯一可靠的解决方法是手动、使用ewmh
或取消最大化窗口,wmctrl
然后手动更改窗口大小或手动稍微移动它。只有这样,我才能始终使用ewmh
或移动或调整其大小wmctrl
。但显然这不是可接受的解决方案。
即使窗口当前最大化,是否有可靠的方法来设置窗口几何形状?首选通过 Python 的方法,但使用 shell 命令的解决方案也可以。