Fix:Idle event handler was called on every thread rather than thread assigned on
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / XplatUIWin32.cs
index efc464d5d124bb11c44f58f23b742727b2c59bac..65c0498ba67dcb6f05251a5249e00b756aa5473b 100644 (file)
@@ -1239,9 +1239,14 @@ namespace System.Windows.Forms {
                }
 
                internal override void RaiseIdle (EventArgs e)
-               {
-                       if (Idle != null)
-                               Idle (this, e);
+               {       
+                       int id = Thread.CurrentThread.ManagedThreadId;
+                       if (Idle_Threads != null && 
+                               Idle_Threads.ContainsKey (id) && 
+                               Idle_Threads [id] != null)
+                       {
+                               Idle_Threads [id] (this, e);
+                       }
                }
 
                internal override Keys ModifierKeys {
@@ -2021,18 +2026,27 @@ namespace System.Windows.Forms {
 
                private bool GetMessage(ref MSG msg, IntPtr hWnd, int wFilterMin, int wFilterMax, bool blocking) {
                        bool            result;
+                       bool            CheckIdle = blocking;
+
+                       ProcessNextMessage:
 
                        msg.refobject = 0;
                        if (RetrieveMessage(ref msg)) {
                                return true;
                        }
 
-                       if (blocking) {
+                       if (blocking && !CheckIdle) {
                                result = Win32GetMessage(ref msg, hWnd, wFilterMin, wFilterMax);
                        } else {
                                result = Win32PeekMessage(ref msg, hWnd, wFilterMin, wFilterMax, (uint)PeekMessageFlags.PM_REMOVE);
                                if (!result) {
-                                       return false;
+                                       if (CheckIdle) {
+                                               RaiseIdle (null);
+                                               CheckIdle = false;
+                                               goto ProcessNextMessage;
+                                       } else {
+                                               return false;
+                                       }
                                }
                        }
 
@@ -3323,7 +3337,6 @@ namespace System.Windows.Forms {
                        Win32SetForegroundWindow(handle);
                }
 
-               internal override event EventHandler Idle;
                #endregion      // Public Static Methods
 
                #region Win32 Imports