Missing events sometimes
peter.hutterer at who-t.net
Thu Oct 27 15:44:59 PDT 2011
On Tue, Oct 25, 2011 at 10:16:17AM +0200, Olivier Fourdan wrote:
> I have been facing a bug in the xfce  window manager xfwm4 , for
> a very long time, no doubt the fault is with my code yet I fail to
> find the fix.
> Sometimes, when the system is heavily loaded and/or swapping
> intensively, the event loop does not get the ButtonReleasse or
> KeyRelease events it's waiting to exit the event loop.
> The logic used in the code is the following:
> 1. For keyboard, it installs a passive grab in sync mode on keyboard, ie:
> XGrabKey (dpy, keycode, modifier, w, TRUE, GrabModeAsync, GrabModeSync);
> 2. For buttons, same with Sync mode on pointer
> XGrabButton (dpy, button, modifier, w, FALSE,
> ButtonPressMask|ButtonReleaseMask, GrabModeSync, GrabModeAsync, None,
> 3. Then when the user activates a keyboard shortcut or moves a window
> usign the mouse, the window manager installs an active grab on the
> keyboard / pointer using the timestamp of the event:
> XGrabKeyboard (dpy, root, TRUE, GrabModeAsync, GrabModeAsync, timestamp)
> XGrabPointer (dpy, root, FALSE, PointerMotionMask |
> ButtonMotionMask | ButtonReleaseMask | LeaveWindowMask,
> GrabModeAsync, GrabModeAsync, root, cursor, timestamp);
> 4. Then enters an event loop processing events, until a KeyRelease
> event (in the case of a keyboard shortcut) or a ButtonRelease is
> received (in the case of a mouse op).
> Using this logic, the code sometimes (when the system is loaded or
> swapping) remains in the event loop because the ButtonRelease or
> KeyRelease event is not received in the event loop, so I guess it's
> consumed somehow before the code enters the event loop, but how?
I'm not sure on the actual code but there's a race condition for both - if
the release event happens before the server receives/processes the
GrabKey/Pointer request you may drop the event on the floor. This shouldn't
happen since you should get it delivered based on the passive grab either
way but there's a chance the client drops it.
Try swapping the passive grab to sync and see if that avoids it.
> As I said, there's probably a flaw somewhere in the logic, but I fail
> to find it (also because of the nature of the probl;em it's quite hard
> to reproduce and therefore investigate and test), so I am open to any
put a delay in before XGrabPointer in the client and click fast (so that the
release happens before the request). this way you can easily verify if it is
that race condition or something else.
More information about the xorg