2007-04-25 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / XEventQueue.cs
index f450b6496cf62924bb5e3eb3281b8845a865757f..11391af1a7279093caeaea71e177f8d3447a5adb 100644 (file)
@@ -37,7 +37,9 @@ namespace System.Windows.Forms {
                private XQueue          xqueue;
                private XQueue          lqueue; // Events inserted from threads other then the main X thread
                private PaintQueue      paint;  // Paint-only queue
+               internal ArrayList      timer_list;
                private Thread          thread;
+               private bool            dispatch_idle;
 
                private static readonly int InitialXEventSize = 100;
                private static readonly int InitialLXEventSize = 10;
@@ -47,7 +49,9 @@ namespace System.Windows.Forms {
                        xqueue = new XQueue (InitialXEventSize);
                        lqueue = new XQueue (InitialLXEventSize);
                        paint = new PaintQueue(InitialPaintSize);
+                       timer_list = new ArrayList ();
                        this.thread = thread;
+                       this.dispatch_idle = true;
                }
 
                public int Count {
@@ -72,6 +76,11 @@ namespace System.Windows.Forms {
 
                public void Enqueue (XEvent xevent)
                {
+                       if (Thread.CurrentThread != thread) {
+                               Console.WriteLine ("Hwnd.Queue.Enqueue called from a different thread without locking.");
+                               Console.WriteLine (Environment.StackTrace);
+                       }
+
                        xqueue.Enqueue (xevent);
                }
 
@@ -84,6 +93,11 @@ namespace System.Windows.Forms {
 
                public XEvent Dequeue ()
                {
+                       if (Thread.CurrentThread != thread) {
+                               Console.WriteLine ("Hwnd.Queue.Dequeue called from a different thread without locking.");
+                               Console.WriteLine (Environment.StackTrace);
+                       }
+
                        if (xqueue.Count == 0) {
                                lock (lqueue) {
                                        return lqueue.Dequeue ();
@@ -92,6 +106,30 @@ namespace System.Windows.Forms {
                        return xqueue.Dequeue ();
                }
 
+               public XEvent Peek()
+               {
+                       if (Thread.CurrentThread != thread) {
+                               Console.WriteLine ("Hwnd.Queue.Peek called from a different thread without locking.");
+                               Console.WriteLine (Environment.StackTrace);
+                       }
+
+                       if (xqueue.Count == 0) {
+                               lock (lqueue) {
+                                       return lqueue.Peek ();
+                               }
+                       }                               
+                       return xqueue.Peek();
+               }
+
+               public bool DispatchIdle {
+                       get {
+                               return dispatch_idle;
+                       }
+                       set {
+                               dispatch_idle = value;
+                       }
+               }
+
                public class PaintQueue {
 
                        private ArrayList       hwnds;
@@ -191,6 +229,13 @@ namespace System.Windows.Forms {
                                return res;
                        }
 
+                       public XEvent Peek() {
+                               if (size < 1) {
+                                       throw new Exception ("Attempt to peek at empty queue");
+                               }
+                               return xevents[head];
+                       }
+
                        private void Grow ()
                        {
                                int newcap = (xevents.Length * 2);