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();
}
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;
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
// 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,