2 // System.Windows.Forms.XEventQueue
5 // Jackson Harper (jackson@ximian.com)
7 // Copyright (C) Novell, Inc (http://www.novell.com)
11 using System.Threading;
12 using System.Collections;
15 namespace System.Windows.Forms {
17 internal class XEventQueue {
19 private XQueue xqueue;
20 private XQueue lqueue; // Events inserted from threads other then the main X thread
22 private static readonly int InitialXEventSize = 50;
23 private static readonly int InitialLXEventSize = 10;
27 xqueue = new XQueue (InitialXEventSize);
28 lqueue = new XQueue (InitialLXEventSize);
32 get { return xqueue.Count + lqueue.Count; }
35 public void Enqueue (XEvent xevent)
37 xqueue.Enqueue (xevent);
40 public void EnqueueLocked (XEvent xevent)
43 lqueue.Enqueue (xevent);
47 public XEvent Dequeue ()
49 if (xqueue.Count == 0) {
51 return lqueue.Dequeue ();
54 return xqueue.Dequeue ();
57 private class XQueue {
59 private XEvent [] xevents;
64 public XQueue (int size)
66 xevents = new XEvent [size];
73 public void Enqueue (XEvent xevent)
75 if (size == xevents.Length)
78 xevents [tail] = xevent;
79 tail = (tail + 1) % xevents.Length;
83 public XEvent Dequeue ()
86 throw new Exception ("Attempt to dequeue empty queue.");
87 XEvent res = xevents [head];
88 head = (head + 1) % xevents.Length;
95 int newcap = (xevents.Length * 2);
96 XEvent [] na = new XEvent [newcap];
97 xevents.CopyTo (na, 0);