Seite 1 von 1

Xlib - grab_pointer() blockiert Mausklicks

Verfasst: Montag 28. Februar 2011, 11:53
von Barabbas
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