小编Lis*_*yen的帖子

使用Xlib在python中获取窗口位置和大小

我需要找到窗口位置和大小,但我无法弄清楚如何.例如,如果我尝试:

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脚本输出的明显解决方法感觉不对.

python xlib

6
推荐指数
1
解决办法
4046
查看次数

如何移动或调整 X11 窗口的大小(即使它们已最大化)?

我想改变一个窗口的位置。我的问题是窗口可以最大化,这不允许更改其大小和位置(窗口可以属于任何应用程序)。我使用 KDE4。


我尝试使用ewmh Python 模块。在我的情况下,当窗口最大化时,我只想将它从一台显示器移动到另一台显示器,并保持最大化。我需要取消最大化它以设置其几何形状,因此我尝试使用ewmh.setWmState()to set _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_MAXIMIZED_HORZto 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)

但是第二个命令什么也不做,除非我在运行它之前手动移动或调整窗口大小。与 不同ewmhwmctrl如果窗口最大化,则永远不会按预期工作。wmctrl成功取消最大化窗口,但之后无法更改其位置或大小。

这在单监视器和三监视器 X 屏幕状态下均可重现。

此问题似乎并非特定于任何特定工具。例如,如果窗口只是未最大化但未手动移动/调整大小,则 xdotool 也无法更改窗口大小/位置。


到目前为止,我发现的唯一可靠的解决方法是手动、使用ewmh或取消最大化窗口,wmctrl然后手动更改窗口大小或手动稍微移动它。只有这样,我才能始终使用ewmh或移动或调整其大小wmctrl。但显然这不是可接受的解决方案。

即使窗口当前最大化,是否有可靠的方法来设置窗口几何形状?首选通过 Python 的方法,但使用 shell 命令的解决方案也可以。

python linux x11 shell window

5
推荐指数
1
解决办法
3761
查看次数

标签 统计

python ×2

linux ×1

shell ×1

window ×1

x11 ×1

xlib ×1