]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/evtloop.cpp
No changes, move wxStreamTempInputBuffer to a header file.
[wxWidgets.git] / src / gtk / evtloop.cpp
index 0ebb864e69f3f6a240478e66232d79ad78eff1e7..d104d82f0c7c09935b9901ef1d25a620f85e2998 100644 (file)
@@ -50,26 +50,43 @@ wxGUIEventLoop::wxGUIEventLoop()
     m_exitcode = 0;
 }
 
-int wxGUIEventLoop::Run()
+int wxGUIEventLoop::DoRun()
 {
-    // event loops are not recursive, you need to create another loop!
-    wxCHECK_MSG( !IsRunning(), -1, "can't reenter a message loop" );
+    guint loopLevel = gtk_main_level();
 
-    wxEventLoopActivator activate(this);
+    // This is placed inside of a loop to take into account nested
+    // event loops.  For example, inside this event loop, we may receive
+    // Exit() for a different event loop (which we are currently inside of)
+    // That Exit() will cause this gtk_main() to exit so we need to re-enter it.
+    while ( !m_shouldExit )
+    {
+        gtk_main();
+    }
 
-    gtk_main();
+    // Force the enclosing event loop to also exit to see if it is done in case
+    // that event loop had Exit() called inside of the just ended loop. If it
+    // is not time yet for that event loop to exit, it will be executed again
+    // due to the while() loop on m_shouldExit().
+    //
+    // This is unnecessary if we are the top level loop, i.e. loop of level 0.
+    if ( loopLevel )
+    {
+        gtk_main_quit();
+    }
 
     OnExit();
 
     return m_exitcode;
 }
 
-void wxGUIEventLoop::Exit(int rc)
+void wxGUIEventLoop::ScheduleExit(int rc)
 {
-    wxCHECK_RET( IsRunning(), "can't call Exit() if not running" );
+    wxCHECK_RET( IsInsideRun(), wxT("can't call ScheduleExit() if not started") );
 
     m_exitcode = rc;
 
+    m_shouldExit = true;
+
     gtk_main_quit();
 }
 
@@ -239,9 +256,7 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
     case GDK_SELECTION_REQUEST:
     case GDK_SELECTION_NOTIFY:
     case GDK_SELECTION_CLEAR:
-#if GTK_CHECK_VERSION(2,6,0)
     case GDK_OWNER_CHANGE:
-#endif
         cat = wxEVT_CATEGORY_CLIPBOARD;
         break;
 
@@ -357,6 +372,11 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess)
         gtk_main_iteration();
     gdk_event_handler_set ((GdkEventFunc)gtk_main_do_event, NULL, NULL);
 
+    // Process all pending events too, this is consistent with wxMSW behaviour
+    // and the behaviour of wxGTK itself in the previous versions.
+    if ( wxTheApp )
+        wxTheApp->ProcessPendingEvents();
+
     if (eventsToProcess != wxEVT_CATEGORY_CLIPBOARD)
     {
         // It's necessary to call ProcessIdle() to update the frames sizes which
@@ -365,7 +385,7 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess)
         // call ProcessIdle() only once since this is not meant for longish
         // background jobs (controlled by wxIdleEvent::RequestMore() and the
         // return value of Processidle().
-        ProcessIdle();      // ProcessIdle() also calls ProcessPendingEvents()
+        ProcessIdle();
     }
     //else: if we are inside ~wxClipboardSync() and we call ProcessIdle() and
     //      the user app contains an UI update handler which calls wxClipboard::IsSupported,