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 = 100;
23 private static readonly int InitialLXEventSize = 10;
27 xqueue = new XQueue (InitialXEventSize);
28 lqueue = new XQueue (InitialLXEventSize);
34 return xqueue.Count + lqueue.Count;
39 public void Enqueue (XEvent xevent)
41 xqueue.Enqueue (xevent);
44 public void EnqueueLocked (XEvent xevent)
47 lqueue.Enqueue (xevent);
51 public XEvent Dequeue ()
53 if (xqueue.Count == 0) {
55 return lqueue.Dequeue ();
58 return xqueue.Dequeue ();
61 private class XQueue {
63 private XEvent [] xevents;
68 public XQueue (int size)
70 xevents = new XEvent [size];
77 public void Enqueue (XEvent xevent)
79 if (size == xevents.Length)
82 xevents [tail] = xevent;
83 tail = (tail + 1) % xevents.Length;
87 public XEvent Dequeue ()
90 throw new Exception ("Attempt to dequeue empty queue.");
91 XEvent res = xevents [head];
92 head = (head + 1) % xevents.Length;
99 int newcap = (xevents.Length * 2);
100 XEvent [] na = new XEvent [newcap];
101 xevents.CopyTo (na, 0);