* Mono.Posix.dll.sources: Rename Mono.Posix to Mono.Unix.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / XEventQueue.cs
1 //
2 // System.Windows.Forms.XEventQueue
3 //
4 // Author(s):
5 //  Jackson Harper (jackson@ximian.com)
6 //
7 // Copyright (C) Novell, Inc (http://www.novell.com)
8 //
9
10 using System;
11 using System.Threading;
12 using System.Collections;
13
14
15 namespace System.Windows.Forms {
16
17         internal class XEventQueue {
18
19                 private XQueue xqueue;
20                 private XQueue lqueue;  // Events inserted from threads other then the main X thread
21
22                 private static readonly int InitialXEventSize = 50;
23                 private static readonly int InitialLXEventSize = 10;
24
25                 public XEventQueue ()
26                 {
27                         xqueue = new XQueue (InitialXEventSize);
28                         lqueue = new XQueue (InitialLXEventSize);
29                 }
30
31                 public int Count {
32                         get { return xqueue.Count + lqueue.Count; }
33                 }
34
35                 public void Enqueue (XEvent xevent)
36                 {
37                         xqueue.Enqueue (xevent);
38                 }
39
40                 public void EnqueueLocked (XEvent xevent)
41                 {
42                         lock (lqueue) {
43                                 lqueue.Enqueue (xevent);
44                         }
45                 }
46
47                 public XEvent Dequeue ()
48                 {
49                         if (xqueue.Count == 0) {
50                                 lock (lqueue) {
51                                         return lqueue.Dequeue ();
52                                 }
53                         }
54                         return xqueue.Dequeue ();
55                 }
56
57                 private class XQueue {
58
59                         private XEvent [] xevents;
60                         private int head;
61                         private int tail;
62                         private int size;
63                         
64                         public XQueue (int size)
65                         {
66                                 xevents = new XEvent [size];
67                         }
68
69                         public int Count {
70                                 get { return size; }
71                         }
72
73                         public void Enqueue (XEvent xevent)
74                         {
75                                 if (size == xevents.Length)
76                                         Grow ();
77                                 
78                                 xevents [tail] = xevent;
79                                 tail = (tail + 1) % xevents.Length;
80                                 size++;
81                         }
82
83                         public XEvent Dequeue ()
84                         {
85                                 if (size < 1)
86                                         throw new Exception ("Attempt to dequeue empty queue.");
87                                 XEvent res = xevents [head];
88                                 head = (head + 1) % xevents.Length;
89                                 size--;
90                                 return res;
91                         }
92
93                         private void Grow ()
94                         {
95                                 int newcap = (xevents.Length * 2);
96                                 XEvent [] na = new XEvent [newcap];
97                                 xevents.CopyTo (na, 0);
98                                 xevents = na;
99                                 head = 0;
100                                 tail = head + size;
101                         }
102                 }
103         }
104 }
105