|
|
1.1 ! root 1: #include "copyright.h" ! 2: ! 3: /* $Header: XIfEvent.c,v 11.8 87/09/11 08:09:02 toddb Exp $ */ ! 4: /* Copyright Massachusetts Institute of Technology 1986 */ ! 5: ! 6: #define NEED_EVENTS ! 7: #include "Xlibint.h" ! 8: ! 9: extern _XQEvent *_qfree; ! 10: ! 11: /* ! 12: * Flush output and (wait for and) return the next event matching the ! 13: * predicate in the queue. ! 14: */ ! 15: ! 16: XIfEvent (dpy, event, predicate, arg) ! 17: register Display *dpy; ! 18: Bool (*predicate)(); /* function to call */ ! 19: register XEvent *event; ! 20: char *arg; ! 21: { ! 22: register _XQEvent *qelt, *prev; ! 23: ! 24: LockDisplay(dpy); ! 25: _XFlush (dpy); ! 26: /* ! 27: * first must search queue to find if any events match. ! 28: * If so, then remove from queue. ! 29: */ ! 30: prev = NULL; ! 31: qelt = dpy->head; ! 32: while (qelt) { ! 33: if ((*predicate)(dpy, &qelt->event, arg)) { ! 34: *event = qelt->event; ! 35: if (prev) { ! 36: if ((prev->next = qelt->next) == NULL) ! 37: dpy->tail = prev; ! 38: } else { ! 39: if ((dpy->head = qelt->next) == NULL) ! 40: dpy->tail = NULL; ! 41: } ! 42: qelt->next = _qfree; ! 43: _qfree = qelt; ! 44: dpy->qlen--; ! 45: UnlockDisplay(dpy); ! 46: return; ! 47: } ! 48: qelt = (prev = qelt)->next; ! 49: } ! 50: ! 51: ! 52: /* if the queue is empty, read as many events as possible ! 53: and enqueue them */ ! 54: while (1) { ! 55: char buf[BUFSIZE]; ! 56: long pend_not_register; /* because can't "&" a register variable */ ! 57: register long pend; ! 58: register xEvent *ev; ! 59: XEvent scratch; ! 60: ! 61: /* find out how much data can be read */ ! 62: if (BytesReadable(dpy->fd, (char *)&pend_not_register) < 0) ! 63: (*_XIOErrorFunction)(dpy); ! 64: pend = pend_not_register; ! 65: ! 66: /* must read at least one xEvent; if none is pending, then ! 67: we'll just block waiting for it */ ! 68: if (pend < sizeof(xEvent)) ! 69: pend = sizeof (xEvent); ! 70: ! 71: /* but we won't read more than the max buffer size */ ! 72: if (pend > BUFSIZE) ! 73: pend = BUFSIZE; ! 74: ! 75: /* round down to an integral number of XReps */ ! 76: pend = (pend / sizeof (xEvent)) * sizeof (xEvent); ! 77: ! 78: _XRead (dpy, buf, pend); ! 79: for (ev = (xEvent *) buf; pend > 0; ev++, pend -= sizeof(xEvent)) ! 80: if (ev->u.u.type == X_Error) ! 81: _XError (dpy, (xError *) ev); ! 82: else { ! 83: /* it's an event packet; enqueue it if not predicate */ ! 84: (*dpy->event_vec[ev->u.u.type & 0177])(dpy, &scratch, ev); ! 85: if ((*predicate)(dpy, &scratch, arg)) { ! 86: ev++; /* Enqueue remaining events */ ! 87: pend -= sizeof(xEvent); ! 88: for (; pend > 0; ev++, pend -= sizeof(xEvent)) ! 89: if (ev->u.u.type == X_Error) ! 90: _XError (dpy, (xError *) ev); ! 91: else ! 92: _XEnq (dpy, ev); ! 93: *event = scratch; ! 94: UnlockDisplay(dpy); ! 95: return; ! 96: } ! 97: _XEnq (dpy, ev); ! 98: } ! 99: } ! 100: } ! 101:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.