Xlib - grab_pointer() blockiert Mausklicks

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo zusammen,

ich möchte mich global über Mausbewegungen informieren lassen und wollte dazu das Xlib nutzen.

Zur Zeit sieht mein Code wie folgt aus:

Code: Alles auswählen

from Xlib.display import Display
from Xlib import X, XK

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


root.grab_pointer(
                True,
                X.PointerMotionMask,
                X.GrabModeAsync, X.GrabModeAsync,
                X.NONE, X.NONE,
                X.CurrentTime
            )
             
#~ display.allow_events(X.GrabModeAsync, X.CurrentTime)
while 1:
    event = root.display.next_event()

    if event.type == X.MotionNotify:
        print event.root_x, event.root_y
Achtung: Momentan kann dieser Code euer System blockieren!

So wie ich die Dokumentation verstanden habe, müsste der Parameter "True" der Funktion grab_pointer() dafür sorgen, dass die Events trotz meines "Dazwischenfunkens" korrekt an die jeweiligen Client-Fenster durchgereicht werden. Werden sie aber nicht: Ich kann die Maus zwar noch bewegen, Mausklicks werden aber ignoriert. Ich kann das Programm nur noch über die Tastatur beenden (STRG+C).

Hat jemand von euch eine Idee, wo das Problem liegen könnte? Prinzipiell könnte ich die Mausposition ja auch wie folgt auslesen:

Code: Alles auswählen

while 1:
    data = Display().screen().root.query_pointer()._data
    print data["root_x"], data["root_y"]
    time.sleep(0.001) 
Das ist aber mMn. ein denkbar schlechter Ansatz. Die erste Variante besticht halt dadurch, dass next_event() blockiert und ich so recht effizient über Mausbewegungen "benachrichtigt" werde, statt fortwährend pollen zu müssen.

Danke schonmal für mögliche Hinweise.

Besten Gruß,

brb

//edit:
Ich habe eine Lösung gefunden: Nicht key_grab() oder pointer_grab() sind, was ich suche, sondern die Record-Extension des Xlibs. Beispiel findet sich hier
Antworten