int XPending (register Display *dpy) { int ret_val; LockDisplay(dpy); if (dpy->qlen) ret_val = dpy->qlen; else ret_val = _XEventsQueued (dpy, QueuedAfterFlush); UnlockDisplay(dpy); return ret_val; }
int XEventsQueued ( register Display *dpy, int mode) { int ret_val; LockDisplay(dpy); if (dpy->qlen || (mode == QueuedAlready)) ret_val = dpy->qlen; else ret_val = _XEventsQueued (dpy, mode); UnlockDisplay(dpy); return ret_val; }
Bool XCheckMaskEvent ( register Display *dpy, long mask, /* Selected event mask. */ register XEvent *event) /* XEvent to be filled in. */ { register _XQEvent *prev, *qelt; unsigned long qe_serial = 0; int n; /* time through count */ LockDisplay(dpy); /* Delete unclaimed cookies */ _XFreeEventCookies(dpy); prev = NULL; for (n = 3; --n >= 0;) { for (qelt = prev ? prev->next : dpy->head; qelt; prev = qelt, qelt = qelt->next) { if ((qelt->event.type < GenericEvent) && (_Xevent_to_mask[qelt->event.type] & mask) && ((qelt->event.type != MotionNotify) || (mask & AllPointers) || (mask & AllButtons & qelt->event.xmotion.state))) { *event = qelt->event; _XDeq(dpy, prev, qelt); UnlockDisplay(dpy); return True; } } if (prev) qe_serial = prev->qserial_num; switch (n) { case 2: _XEventsQueued(dpy, QueuedAfterReading); break; case 1: _XFlush(dpy); break; } if (prev && prev->qserial_num != qe_serial) /* another thread has snatched this event */ prev = NULL; } UnlockDisplay(dpy); return False; }
Bool XCheckTypedEvent ( register Display *dpy, int type, /* Selected event type. */ register XEvent *event) /* XEvent to be filled in. */ { register _XQEvent *prev, *qelt; unsigned long qe_serial = 0; int n; /* time through count */ LockDisplay(dpy); /* Delete unclaimed cookies */ _XFreeEventCookies(dpy); prev = NULL; for (n = 3; --n >= 0;) { for (qelt = prev ? prev->next : dpy->head; qelt; prev = qelt, qelt = qelt->next) { if (qelt->event.type == type) { *event = qelt->event; _XDeq(dpy, prev, qelt); _XStoreEventCookie(dpy, event); UnlockDisplay(dpy); return True; } } if (prev) qe_serial = prev->qserial_num; switch (n) { case 2: _XEventsQueued(dpy, QueuedAfterReading); break; case 1: _XFlush(dpy); break; } if (prev && prev->qserial_num != qe_serial) /* another thread has snatched this event */ prev = NULL; } UnlockDisplay(dpy); return False; }
/** Check existing events in queue to find if any match. If so, return. * If not, flush buffer and see if any more events are readable. If one * matches, return. If all else fails, tell the user no events found. */ Bool XCheckNotMaskEvent (Display *dpy, long mask, XEvent *event) { register _XQEvent *prev, *qelt; unsigned long qe_serial = 0; int n; /* time through count */ LockDisplay(dpy); prev = NULL; for (n = 3; --n >= 0;) { for (qelt = prev ? prev->next : dpy->head; qelt; prev = qelt, qelt = qelt->next) { if (qelt->event.type >= LASTEvent || !(_Xevent_to_mask[qelt->event.type] & mask)) { *event = qelt->event; _XDeq(dpy, prev, qelt); UnlockDisplay(dpy); return True; } } if (prev) qe_serial = prev->qserial_num; switch (n) { case 2: _XEventsQueued(dpy, QueuedAfterReading); break; case 1: _XFlush(dpy); break; } if (prev && prev->qserial_num != qe_serial) /* another thread has snatched this event */ prev = NULL; } UnlockDisplay(dpy); return False; }