int XNextEvent ( register Display *dpy, register XEvent *event) { register _XQEvent *qelt; LockDisplay(dpy); /* Delete unclaimed cookies */ _XFreeEventCookies(dpy); if (dpy->head == NULL) _XReadEvents(dpy); qelt = dpy->head; *event = qelt->event; _XDeq(dpy, NULL, qelt); _XStoreEventCookie(dpy, event); UnlockDisplay(dpy); return 0; }
int XPeekIfEvent ( register Display *dpy, register XEvent *event, Bool (*predicate)( Display* /* display */, XEvent* /* event */, char* /* arg */ ), char *arg) { register _XQEvent *prev, *qelt; unsigned long qe_serial = 0; LockDisplay(dpy); prev = NULL; while (1) { for (qelt = prev ? prev->next : dpy->head; qelt; prev = qelt, qelt = qelt->next) { if(qelt->qserial_num > qe_serial && (*predicate)(dpy, &qelt->event, arg)) { XEvent copy; *event = qelt->event; if (_XCopyEventCookie(dpy, &event->xcookie, ©.xcookie)) { _XStoreEventCookie(dpy, ©); *event = copy; } UnlockDisplay(dpy); return 0; } } if (prev) qe_serial = prev->qserial_num; _XReadEvents(dpy); if (prev && prev->qserial_num != qe_serial) /* another thread has snatched this event */ prev = NULL; } }
int XWindowEvent ( register Display *dpy, Window w, /* Selected window. */ long mask, /* Selected event mask. */ register XEvent *event) /* XEvent to be filled in. */ { register _XQEvent *prev, *qelt; unsigned long qe_serial = 0; LockDisplay(dpy); /* Delete unclaimed cookies */ _XFreeEventCookies(dpy); prev = NULL; while (1) { for (qelt = prev ? prev->next : dpy->head; qelt; prev = qelt, qelt = qelt->next) { if ((qelt->event.xany.window == w) && (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 0; } } if (prev) qe_serial = prev->qserial_num; _XReadEvents(dpy); if (prev && prev->qserial_num != qe_serial) /* another thread has snatched this event */ prev = NULL; } }