8

我需要找到窗口位置和大小,但我不知道如何。例如,如果我尝试:

id.get_geometry()    # "id" is Xlib.display.Window

我得到这样的东西:

data = {'height': 2540,
'width': 1440,
'depth': 24,
'y': 0, 'x': 0,
'border_width': 0
'root': <Xlib.display.Window 0x0000026a>
'sequence_number': 63}

我需要找到窗口位置和大小,所以我的问题是:“y”、“x”和“border_width”始终为 0;更糟糕的是,“高度”和“宽度”在没有窗框的情况下返回。

在这种情况下,在我的 X 屏幕上(其尺寸为 4400x2560),我期望 x=1280,y=0,width=1440,height=2560。

换句话说,我正在寻找 python 等价物:

#!/bin/bash
id=$1
wmiface framePosition $id
wmiface frameSize $id

如果您认为 Xlib 不是我想要的,请随意在 python 中提供非 Xlib 解决方案,如果它可以将窗口 id 作为参数(如上面的 bash 脚本)。在 python 代码中使用 bash 脚本的输出的明显解决方法感觉不对。

4

3 回答 3

3

您可能正在使用 reparenting 窗口管理器,并且由于这个 id 窗口的 x 和 y 为零。检查父窗口的坐标(这是窗口管理器框架)

于 2012-10-12T07:11:02.647 回答
2

Liss 发布了以下解决方案作为评论

from ewmh import EWMH
ewmh = EWMH()

def frame(client):
    frame = client
    while frame.query_tree().parent != ewmh.root:
        frame = frame.query_tree().parent
    return frame

for client in ewmh.getClientList():
    print frame(client).get_geometry()

我在这里复制它是因为答案应该包含实际答案,并防止链接腐烂

于 2015-09-03T21:24:22.957 回答
0

这是我想出的似乎效果很好的方法:

from collections import namedtuple

import Xlib.display


disp = Xlib.display.Display()
root = disp.screen().root

MyGeom = namedtuple('MyGeom', 'x y height width')


def get_absolute_geometry(win):
    """
    Returns the (x, y, height, width) of a window relative to the top-left
    of the screen.
    """
    geom = win.get_geometry()
    (x, y) = (geom.x, geom.y)
    while True:
        parent = win.query_tree().parent
        pgeom = parent.get_geometry()
        x += pgeom.x
        y += pgeom.y
        if parent.id == root.id:
            break
        win = parent
    return MyGeom(x, y, geom.height, geom.width)

完整的例子在这里

于 2019-12-07T00:16:11.050 回答