Ich muss die Position und Größe des Fensters ermitteln, kann aber nicht herausfinden, wie. Zum Beispiel, wenn ich versuche:

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

Ich bekomme so etwas:

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

Ich muss die Position und Größe des Fensters ermitteln, daher ist mein Problem: "y", "x" und "border_width" sind immer 0; Schlimmer noch, "Höhe" und "Breite" werden ohne Fensterrahmen zurückgegeben.

In diesem Fall habe ich auf meinem X-Bildschirm (seine Abmessungen sind 4400 x 2560) x = 1280, y = 0, Breite = 1440, Höhe = 2560 erwartet.

Mit anderen Worten, ich suche nach einem Python-Äquivalent für:

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

Wenn Sie der Meinung sind, dass Xlib nicht das ist, was ich möchte, können Sie eine Nicht-Xlib-Lösung in Python anbieten, wenn die Fenster-ID als Argument verwendet werden kann (wie im obigen Bash-Skript). Offensichtliche Problemumgehung für die Verwendung der Ausgabe des Bash-Skripts in Python-Code fühlt sich nicht richtig an.

7
Lissanro Rayen 8 Okt. 2012 im 08:00

3 Antworten

Beste Antwort

Sie verwenden wahrscheinlich den Reparenting-Fenstermanager und haben aufgrund dieser ID-Fenster null x und y. Überprüfen Sie die Koordinaten des übergeordneten Fensters (das der Fenstermanager-Frame ist).

2
Andrey Sidorov 12 Okt. 2012 im 07:11

Folgendes habe ich mir ausgedacht: Das scheint gut zu funktionieren:

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)

Vollständiges Beispiel hier.

0
mgalgs 7 Dez. 2019 im 00:16

Liss hat die folgende Lösung als Kommentar veröffentlicht ::

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()

Ich kopiere es hier, weil Antworten enthalten sollten die tatsächliche Antwort und um Link Rot zu verhindern.

1
Denilson Sá Maia 3 Sept. 2015 im 21:24