wxGTK/wxGTK-2.8.7-race-fix.patch

110 lines
3.5 KiB
Diff

--- wxWidgets/src/gtk/app.cpp 2008/03/13 02:56:21 52464
+++ wxWidgets/src/gtk/app.cpp 2008/03/13 04:37:03 52465
@@ -174,59 +174,63 @@
if (!wxTheApp)
return false;
- bool moreIdles = false;
-
+ guint idleID_save;
+ {
+ // Allow another idle source to be added while this one is busy.
+ // Needed if an idle event handler runs a new event loop,
+ // for example by showing a dialog.
+#if wxUSE_THREADS
+ wxMutexLocker lock(gs_idleTagsMutex);
+#endif
+ idleID_save = wxTheApp->m_idleTag;
+ wxTheApp->m_idleTag = 0;
+ g_isIdle = true;
+ wxAddEmissionHook();
+ }
#ifdef __WXDEBUG__
// don't generate the idle events while the assert modal dialog is shown,
// this matches the behavior of wxMSW
- if (!wxTheApp->IsInAssert())
+ if (wxTheApp->IsInAssert())
+ return false;
#endif // __WXDEBUG__
- {
- guint idleID_save;
- {
- // Allow another idle source to be added while this one is busy.
- // Needed if an idle event handler runs a new event loop,
- // for example by showing a dialog.
-#if wxUSE_THREADS
- wxMutexLocker lock(gs_idleTagsMutex);
-#endif
- idleID_save = wxTheApp->m_idleTag;
- wxTheApp->m_idleTag = 0;
- g_isIdle = true;
- wxAddEmissionHook();
- }
- // When getting called from GDK's time-out handler
- // we are no longer within GDK's grab on the GUI
- // thread so we must lock it here ourselves.
- gdk_threads_enter();
-
- // Send idle event to all who request them as long as
- // no events have popped up in the event queue.
- do {
- moreIdles = wxTheApp->ProcessIdle();
- } while (moreIdles && gtk_events_pending() == 0);
+ // When getting called from GDK's time-out handler
+ // we are no longer within GDK's grab on the GUI
+ // thread so we must lock it here ourselves.
+ gdk_threads_enter();
- // Release lock again
- gdk_threads_leave();
-
- {
- // If another idle source was added, remove it
+ // Send idle event to all who request them as long as
+ // no events have popped up in the event queue.
+ bool moreIdles;
+ do {
+ moreIdles = wxTheApp->ProcessIdle();
+ } while (moreIdles && gtk_events_pending() == 0);
+
+ // Release lock again
+ gdk_threads_leave();
+
#if wxUSE_THREADS
- wxMutexLocker lock(gs_idleTagsMutex);
+ wxMutexLocker lock(gs_idleTagsMutex);
#endif
- if (wxTheApp->m_idleTag != 0)
- g_source_remove(wxTheApp->m_idleTag);
- wxTheApp->m_idleTag = idleID_save;
- g_isIdle = false;
- }
- }
+ // If another idle source was added, remove it
+ if (wxTheApp->m_idleTag != 0)
+ g_source_remove(wxTheApp->m_idleTag);
+ wxTheApp->m_idleTag = idleID_save;
+ g_isIdle = false;
- if (!moreIdles)
- {
#if wxUSE_THREADS
- wxMutexLocker lock(gs_idleTagsMutex);
+ if (wxPendingEventsLocker)
+ wxPendingEventsLocker->Enter();
#endif
+ // Pending events can be added asynchronously,
+ // need to keep idle source if any have appeared
+ moreIdles = moreIdles || (wxPendingEvents && !wxPendingEvents->IsEmpty());
+#if wxUSE_THREADS
+ if (wxPendingEventsLocker)
+ wxPendingEventsLocker->Leave();
+#endif
+ if (!moreIdles)
+ {
// Indicate that we are now in idle mode and event handlers
// will have to reinstall the idle handler again.
g_isIdle = true;