When mouse buttons or keyboard keys are grabbed, events will be sent to the grabbing client rather than the normal client who would have received the event. If the keyboard or pointer is in asynchronous mode, further mouse and keyboard events will continue to be processed. If the keyboard or pointer is in synchronous mode, no further events are processed until the grabbing client allows them (see XAllowEvents()). The keyboard or pointer is considered frozen during this interval. The event that triggered the grab can also be replayed.
Note that the logical state of a device (as seen by client applications) may lag the physical state if device event processing is frozen.
There are two kinds of grabs:
active and passive.
An active grab occurs when a single client grabs the keyboard and/or pointer
explicitly (see
XGrabPointer()
and
XGrabKeyboard()).
A passive grab occurs when clients grab a particular keyboard key
or pointer button in a window,
and the grab will activate when the key or button is actually pressed.
Passive grabs are convenient for implementing reliable pop-up menus.
For example, you can guarantee that the pop-up is mapped
before the up pointer button event occurs by
grabbing a button requesting synchronous behavior.
The down event will trigger the grab and freeze further
processing of pointer events until you have the chance to
map the pop-up window.
You can then allow further event processing.
The up event will then be correctly processed relative to the
pop-up window.
For many operations,
there are functions that take a time argument.
The X server includes a timestamp in various events.
One special time, called
CurrentTime,
represents the current server time.
The X server maintains the time when the input focus was last changed,
when the keyboard was last grabbed,
when the pointer was last grabbed,
or when a selection was last changed.
Your
application may be slow reacting to an event.
You often need some way to specify that your
request should not occur if another application has in the meanwhile
taken control of the keyboard, pointer, or selection.
By providing the timestamp from the event in the request,
you can arrange that the operation not take effect
if someone else has performed an operation in the meanwhile.
A timestamp is a time value, expressed in milliseconds.
It typically is the time since the last server reset.
Timestamp values wrap around (after about 49.7 days).
The server, given its current time is represented by timestamp T,
always interprets timestamps from clients by treating half of the timestamp
space as being later in time than T.
One timestamp value, named
CurrentTime,
is never generated by the server.
This value is reserved for use in requests to represent the current server time.
For many functions in this section,
you pass pointer event mask bits.
The valid pointer event mask bits are:
ButtonPressMask,
ButtonReleaseMask,
EnterWindowMask,
LeaveWindowMask,
PointerMotionMask,
PointerMotionHintMask,
Button1MotionMask,
Button2MotionMask,
Button3MotionMask,
Button4MotionMask,
Button5MotionMask,
ButtonMotionMask,
and
KeymapStateMask.
For other functions in this section,
you pass keymask bits.
The valid keymask bits are:
ShiftMask,
LockMask,
ControlMask,
Mod1Mask,
Mod2Mask,
Mod3Mask,
Mod4Mask,
and
Mod5Mask.
To grab the pointer, use
XGrabPointer().
To ungrab the pointer, use
XUngrabPointer().
To change an active pointer grab, use
XChangeActivePointerGrab().
To grab a pointer button, use
XGrabButton().
To ungrab a pointer button, use
XUngrabButton().
Next: Keyboard Grabbing
Christophe Tronche, ch@tronche.com