110 lines
3.5 KiB
Diff
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;
|
|
|