+// the callback functions must be extern "C" to comply with GTK+ declarations
+extern "C"
+{
+
+static gint wxapp_pending_callback( gpointer WXUNUSED(data) )
+{
+ if (!wxTheApp) return TRUE;
+
+ // 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();
+
+ // Sent idle event to all who request them.
+ wxTheApp->ProcessPendingEvents();
+
+ g_pendingTag = 0;
+
+ // Flush the logged messages if any.
+#if wxUSE_LOG
+ wxLog::FlushActive();
+#endif // wxUSE_LOG
+
+ // 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;
+}
+
+static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
+{
+ 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()