Schwierigkeiten mit Xlib und Popen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hi!

Ich beschaffe mir mit einem Skript mittels Xlib die Namen und ID's aller aktuell offenen Fenster. Jetzt soll mit Popen ein beliebiges (grafisches) Programm aufgerufen und nur dessen Name und ID zurückgegeben werden. Komischerweise wird das Fenster für das Programm zwar geöffnet, aber es erscheint kein neuer Eintrag in der Liste (müsste als letzter Eintrag erscheinen). Jemand ne Idee, was ich falsch mache? Ich nutze hier XFCE als Fenstermanager, falls das von Belang ist. Hier mal das Skript:

Code: Alles auswählen

from subprocess import Popen

from Xlib.display import Display
from Xlib.X import AnyPropertyType

Popen(['gnome-terminal'])
display = Display()
screen = display.screen()
root = screen.root
win_list = display.intern_atom('_NET_CLIENT_LIST')
list_content = root.get_full_property(win_list, AnyPropertyType)
win_ids = [win_id for win_id in list_content.value] # gesonderte LC, weil spaeter auf das letzte Element zugegriffen werden soll
for win_id in win_ids:
    name = display.create_resource_object('window', win_id).get_wm_name()
    print win_id, name
Sebastian
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Bist du dir sicher, dass das Fenster tatsächlich schon existiert, wenn der Ausgabe-Code ausgeführt wird?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich habe herausgefunden, dass es bei mir ab time.sleep(0.31) geht, bei 0.3 noch nicht. Aber optimal finde ich das nicht wirklich. Ich habe es deshalb mit einer Endlos-Schleife probiert:

Code: Alles auswählen

from subprocess import Popen
from time import sleep

from Xlib.display import Display
from Xlib.X import AnyPropertyType

Popen(['gnome-terminal'])
display = Display()
screen = display.screen()
root = screen.root
win_list = display.intern_atom('_NET_CLIENT_LIST')
before = root.get_full_property(win_list, AnyPropertyType).value[-1]
while True:
    recent_id = root.get_full_property(win_list, AnyPropertyType).value[-1]
    if recent_id != before:
        break
name = display.create_resource_object('window', recent_id).get_wm_name()
print recent_id, name
Aber hier wird mir wieder das falsche Fenster angezeigt. Ist der Aufbau meiner Schleife vielleicht falsch?

Sebastian
Antworten