bool wxApp::DoIdle() { guint id_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(m_idleMutex); #endif id_save = m_idleSourceId; m_idleSourceId = 0; wx_add_idle_hooks(); #if wxDEBUG_LEVEL // don't generate the idle events while the assert modal dialog is shown, // this matches the behaviour of wxMSW if (m_isInAssert) return false; #endif } gdk_threads_enter(); bool needMore; do { ProcessPendingEvents(); needMore = ProcessIdle(); } while (needMore && gtk_events_pending() == 0); gdk_threads_leave(); #if wxUSE_THREADS wxMutexLocker lock(m_idleMutex); #endif // if a new idle source was added during ProcessIdle if (m_idleSourceId != 0) { // remove it g_source_remove(m_idleSourceId); m_idleSourceId = 0; } // Pending events can be added asynchronously, // need to keep idle source if any have appeared if (HasPendingEvents()) needMore = true; // if more idle processing requested if (needMore) { // keep this source installed m_idleSourceId = id_save; return true; } // add hooks and remove this source wx_add_idle_hooks(); return false; }
bool wxApp::DoIdle() { guint id_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(m_idleMutex); #endif id_save = m_idleSourceId; m_idleSourceId = 0; wx_add_idle_hooks(); #if wxDEBUG_LEVEL // don't generate the idle events while the assert modal dialog is shown, // this matches the behaviour of wxMSW if (m_isInAssert) return false; #endif } gdk_threads_enter(); bool needMore; do { ProcessPendingEvents(); needMore = ProcessIdle(); } while (needMore && gtk_events_pending() == 0); gdk_threads_leave(); #if wxUSE_THREADS wxMutexLocker lock(m_idleMutex); #endif bool keepSource = false; // if a new idle source has not been added, either as a result of idle // processing above or by another thread calling WakeUpIdle() if (m_idleSourceId == 0) { // if more idle processing was requested or pending events have appeared if (needMore || HasPendingEvents()) { // keep this source installed m_idleSourceId = id_save; keepSource = true; } else // add hooks and remove this source wx_add_idle_hooks(); } // else remove this source, leave new one installed // we must keep an idle source, otherwise a wakeup could be lost return keepSource; }
// Checking for pending events requires first removing our idle source, // otherwise it will cause the check to always return true. bool wxApp::EventsPending() { #if wxUSE_THREADS wxMutexLocker lock(m_idleMutex); #endif if (m_idleSourceId != 0) { g_source_remove(m_idleSourceId); m_idleSourceId = 0; wx_add_idle_hooks(); } return gtk_events_pending() != 0; }