9.4 Grabbing the Keyboard and Pointer

There are times when a program might want to bypass the normal keyboard or pointer event propagation path in order to get input independent of the position of the pointer. This is the purpose of grabbing the keyboard and pointer. There are routines to grab the keyboard (XGrabKeyboard()) or the pointer (XGrabPointer()), or to arrange that they become grabbed when a certain combination of keys and/or buttons is pressed (XGrabButton(), XGrabKey()). There are corresponding calls to ungrab (XUngrabButton(), XUngrabKey(), XUngrabKeyboard(), XUngrabPointer()), and there is one call to change the characteristics of a pointer grab (XChangeActivePointerGrab()).

One of the most common situations where grabbing takes place is with button events. Most applications want both a ButtonPress and a ButtonRelease, so that they can compare the two positions. Since this is such a common desire, the server automatically grabs the pointer between the ButtonPress and ButtonRelease if both are selected, so that you do not have to make an explicit grab.

One reason for grabbing a device is so that you can handle a series of events contiguously without fear of intervening events. But when you grab a device, no other application can receive input from that device. Therefore, it is something to do only when absolutely necessary.

The routines that grab take several arguments that tailor the input response in these ways:

  • When the pointer is grabbed, the cursor may be confined ...

Get XLIB Programming Manual, Rel. 5, Third Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.