-gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
-{
- // 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();
-
- wxapp_uninstall_thread_wakeup();
-
- // unblock other threads wishing to do some GUI things
- wxMutexGuiLeave();
-
- g_mainThreadLocked = TRUE;
-
- // wake up other threads
- wxUsleep( 1 );
-
- // block other thread again
- wxMutexGuiEnter();
-
- g_mainThreadLocked = FALSE;
-
- wxapp_install_thread_wakeup();
-
- // release lock again
- gdk_threads_leave();
-
- return TRUE;
-}
-
-#endif // wxUSE_THREADS
-
-} // extern "C"
-
-#if wxUSE_THREADS
-
-static int g_threadUninstallLevel = 0;
-
-void wxapp_install_thread_wakeup()
-{
- g_threadUninstallLevel++;
-
- if (g_threadUninstallLevel != 1) return;
-
- if (wxTheApp->m_wakeUpTimerTag) return;
-
- wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 50, wxapp_wakeup_timerout_callback, (gpointer) NULL );
-}
-
-void wxapp_uninstall_thread_wakeup()
-{
- g_threadUninstallLevel--;
-
- if (g_threadUninstallLevel != 0) return;
-
- if (!wxTheApp->m_wakeUpTimerTag) return;
+ // Pending events can be added asynchronously,
+ // need to keep idle source if any have appeared
+ needMore = needMore || HasPendingEvents();