Bug 379590 - Run event loop while Tracker is up
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Tracker.java b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Tracker.java
index adc11d4..99e0e40 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Tracker.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/cocoa/org/eclipse/swt/widgets/Tracker.java
@@ -840,6 +840,9 @@
 	while (tracking && !cancelled) {
 		display.addPool();
 		try {
+			if (parent != null && parent.isDisposed ()) break;
+			display.runSkin ();
+			display.runDeferredLayouts ();
 			NSEvent event = application.nextEventMatchingMask(0, NSDate.distantFuture(), OS.NSDefaultRunLoopMode, true);
 			if (event == null) continue;
 			int type = (int)/*64*/event.type();
@@ -884,6 +887,7 @@
 				clientCursor.handle.set();
 				display.lockCursor = true;
 			}
+			display.runAsyncMessages (false);
 		} finally {
 			display.removePool();
 		}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java
index 812ce78..099cbf0 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tracker.java
@@ -709,14 +709,18 @@
 
 	/* Tracker behaves like a Dialog with its own OS event loop. */
 	GdkEvent gdkEvent = new GdkEvent();
+	Display display = this.display;
 	while (tracking) {
 		if (parent != null && parent.isDisposed ()) break;
 		int /*long*/ eventPtr;
 		while (true) {
+			display.runSkin ();
+			display.runDeferredLayouts ();
 			eventPtr = OS.gdk_event_get ();
 			if (eventPtr != 0) {
 				break;
 			} else {
+				display.runAsyncMessages (false);
 				try { Thread.sleep(50); } catch (Exception ex) {}
 			}
 		}
@@ -744,6 +748,7 @@
 				OS.gtk_main_do_event (eventPtr);
 		}
 		OS.gdk_event_free (eventPtr);
+		display.runAsyncMessages (false);
 	}
 	if (!isDisposed ()) {
 		update ();
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tracker.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tracker.java
index b660abb..a181d6e 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tracker.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tracker.java
@@ -606,13 +606,13 @@
 					drawRectangles (rectangles, stippled);
 				}
 			}
+			display.runAsyncMessages (false);
 		}
 		if (mouseDown) OS.ReleaseCapture ();
 		if (!isDisposed()) {
 			update ();
 			drawRectangles (rectangles, stippled);
 		}
-		display.runAsyncMessages (false);
 	} finally {
 		/*
 		* Cleanup: If a transparent window was created in order to capture events then