+ if (!wxTheApp)
+ return TRUE;
+
+#ifdef __WXDEBUG__
+ // don't generate the idle events while the assert modal dialog is shown,
+ // this completely confuses the apps which don't expect to be reentered
+ // from some safely-looking functions
+ if ( wxTheApp->IsInAssert() )
+ {
+ return TRUE;
+ }
+#endif // __WXDEBUG__
+
+ // 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();
+
+ // Indicate that we are now in idle mode and event handlers
+ // will have to reinstall the idle handler again.
+ g_isIdle = TRUE;
+ wxTheApp->m_idleTag = 0;
+
+ // Send idle event to all who request them as long as
+ // no events have popped up in the event queue.
+ while (wxTheApp->ProcessIdle() && (gtk_events_pending() == 0))
+ ;
+
+ // Release lock again
+ gdk_threads_leave();
+
+ // Return FALSE to indicate that no more idle events are
+ // to be sent (single shot instead of continuous stream).
+ return FALSE;
+}
+
+#if wxUSE_THREADS
+
+static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout )
+{
+ gint res;
+ gdk_threads_enter();
+
+ wxMutexGuiLeave();
+ g_mainThreadLocked = TRUE;
+
+ res = poll( (struct pollfd*) ufds, nfds, timeout );
+
+ wxMutexGuiEnter();
+ g_mainThreadLocked = FALSE;
+
+ gdk_threads_leave();
+
+ return res;
+}
+
+#endif // wxUSE_THREADS
+
+} // extern "C"
+
+void wxapp_install_idle_handler()
+{
+ wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
+
+ g_isIdle = FALSE;
+
+ if (g_pendingTag == 0)
+ g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL );
+
+ // This routine gets called by all event handlers
+ // indicating that the idle is over. It may also
+ // get called from other thread for sending events
+ // to the main thread (and processing these in
+ // idle time). Very low priority.
+ wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL );
+}