The XIfEvent
function completes only when the specified predicate procedure returns
True for an event, which indicates an event in the queue matches. XIfEvent
flushes the output buffer if it blocks waiting for additional events.
XIfEvent removes the matching event from the queue and copies the structure
into the client-supplied XEvent structure.

When the predicate procedure
finds a match, XCheckIfEvent copies the matched event into the client-supplied
XEvent structure and returns True. (This event is removed from the
queue.) If the predicate procedure finds no match, XCheckIfEvent returns
False, and the output buffer will have been flushed. All earlier events
stored in the queue are not discarded.

The XPeekIfEvent function returns
only when the specified predicate procedure returns True for an event.
After the predicate procedure finds a match, XPeekIfEvent copies the
matched event into the client-supplied XEvent structure without removing
the event from the queue. XPeekIfEvent flushes the output buffer if it
blocks waiting for additional events.

Each of these functions requires you
to pass a predicate procedure that determines if an event matches what
you want. Your predicate procedure must decide if the event is useful without
calling any Xlib functions. If the predicate directly or indirectly causes
the state of the event queue to change, the result is not defined. If Xlib
has been initialized for threads, the predicate is called with the display
locked and the result of a call by the predicate to any Xlib function that
locks the display is not defined unless the caller has first called XLockDisplay.

The predicate procedure and its associated arguments are:

Bool (*predicate)(Display
*display, XEvent *event, XPointer arg)

Specifies the connection to the
X server.

Specifies the XEvent structure.

Specifies the argument passed
in from the XIfEvent, XCheckIfEvent, or XPeekIfEvent function.

The
predicate procedure is called once for each event in the queue until it
finds a match. After finding a match, the predicate procedure must return
True. If it did not find a match, it must return False.