(* Copyright (C) 1992, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* *) (* by Steve Glassman, Mark Manasse and Greg Nelson *) (* Last modified on Mon Feb 24 13:59:46 PST 1992 by muller *) (* modified on Fri Sep 13 5:03:38 PDT 1991 by msm *) <*PRAGMA LL*> UNSAFE INTERFACE XEventQueue; (* = RingBuffer(XEvent) *) IMPORT X; TYPE T = RECORD lo, hi: CARDINAL := 0; buff : REF ARRAY OF X.XEvent := NIL END; (* buff[lo..hi-1] circularly are the active entries; lo = hi => the queue is empty; lo # hi => buff # NIL. *) CONST Empty = T{0, 0, NIL}; <*INLINE*> PROCEDURE IsEmpty (READONLY rb: T): BOOLEAN; (* Return whether rb is empty. *) PROCEDURE Insert (VAR rb: T; READONLY e: X.XEvent); (* Insert e into rb, extending rb if necessary. *) EXCEPTION Exhausted; PROCEDURE Remove (VAR rb: T): X.XEvent RAISES {Exhausted}; (* Raise the exception if rb is empty, else remove the oldest element of rb and return it. *) PROCEDURE Peek (VAR rb: T): X.XEvent RAISES {Exhausted}; (* Like Remove, but leave the returned element at the head of the queue. *) END XEventQueue.