XGrabKey: Passive grabs on a key by multiple clients

Peter Hutterer peter.hutterer at who-t.net
Sun Aug 7 23:22:58 PDT 2011


On Sun, Aug 07, 2011 at 10:45:03PM -0400, edmund brown wrote:
> Greetings!
> 
> I am using the following basic code in a client to grab and act on
> a single specific "hotkey":
> 
> /* Only one key is grabbed by the client (no other XGrabKey() call) */
> XGrabKey(dpy, hotkeycode, 0,
>     DefaultRootWindow(dpy), True, GrabModeAsync, GrabModeAsync);
> 
> for(i=0; i < MAX_HITS; i++) { /* Main event loop */
>   XNextEvent(dpy, &ev);
>   if (ev.type == KeyPress || ev.type == KeyRelease) {
>     /*
>      * Got an active grab on the hotkey at this point, but this
>      * active grab is auto-terminated at key release (RTFM).
>      */
>     printf("Key event %d: keycode=%d\n", i, ev.xkey.keycode);
>   }
> }
> 
> When this client is started but the hotkey has not been pressed yet,
> the execution blocks at the XNextEvent() call in the very first pass
> through the loop (i==0).  If a second instance of the client is now
> started (with no occurrence of the hotkey still), its XGrabKey() call
> returns a BadAccess error, which is what I had expected.
> 
> Now suppose that we hit the hotkey a few times (with the first client
> as the only one running), so that the loop is traversed a few times.
> (The client keeps receiving the hotkey hits globally, irrespective of
> focus, so the hotkey seems to remain in a passive grab by the client.)
> We then stop hitting the hotkey, so that execution again blocks at the
> XNextEvent() call in the loop, but with i > 0.  But now if a second
> instance of the client is again started, its XGrabKey() call (on the
> same hotkey) does not see the BadAccess error any more!  In fact,
> the second client this time is able to successfully install a passive
> grab on the hotkey, _overriding_ the first client's grab, and all
> subsequent hotkey presses go to the second client, irrespective
> of focus.  (If the second client is terminated, the first client's
> passive grab seems to be restored, as subsequent presses of the
> hotkey are sent to the first client again.)
> 
> Note that all this happens irrespective of focus target.
> 
> Q:  I am fairly new to Xlib programming and find it puzzling that
> other clients are able to override passive grabs on a key by
> previously running clients.  Is this a feature?

it's a bug, see
https://bugs.freedesktop.org/show_bug.cgi?id=39545

Cheers,
  Peter



More information about the xorg mailing list