Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
	}
}