bool wxYield()
{
- /* it's necessary to call ProcessIdle() to update the frames sizes which
- might have been changed (it also will update other things set from
- OnUpdateUI() which is a nice (and desired) side effect) */
- while (wxTheApp->ProcessIdle()) { }
-
-#if 0
- for ( wxWindowList::Node *node = wxTopLevelWindows.GetFirst();
- node;
- node = node->GetNext() )
- {
- wxWindow *win = node->GetData();
- win->OnInternalIdle();
- }
-#endif
-
- if (wxTheApp->m_idleTag)
+ bool has_idle = (wxTheApp->m_idleTag != 0);
+
+ if (has_idle)
{
/* We need to temporarily remove idle callbacks or the loop will
never finish. */
gtk_idle_remove( wxTheApp->m_idleTag );
wxTheApp->m_idleTag = 0;
+ }
- while (gtk_events_pending())
- gtk_main_iteration();
+ while (gtk_events_pending())
+ gtk_main_iteration();
+ /* it's necessary to call ProcessIdle() to update the frames sizes which
+ might have been changed (it also will update other things set from
+ OnUpdateUI() which is a nice (and desired) side effect) */
+ while (wxTheApp->ProcessIdle()) { }
+
+ if (has_idle)
+ {
/* re-add idle handler */
wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
}
- else
- {
- while (gtk_events_pending())
- gtk_main_iteration();
- }
-
+
return TRUE;
}
gint wxapp_idle_callback( gpointer WXUNUSED(data) )
{
if (!wxTheApp) return TRUE;
-
+
#if (GTK_MINOR_VERSION > 0)
/* when getting called from GDK's idle handler we
are no longer within GDK's grab on the GUI
g_isIdle = FALSE;
}
-/*
#if wxUSE_THREADS
-static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
+
+/* forward declaration */
+static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) );
+
+void wxapp_install_thread_wakeup()
+{
+ if (wxTheApp->m_wakeUpTimerTag) return;
+
+ wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 100, wxapp_wakeup_timerout_callback, (gpointer) NULL );
+}
+
+void wxapp_uninstall_thread_wakeup()
{
+ if (!wxTheApp->m_wakeUpTimerTag) return;
+
gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag );
wxTheApp->m_wakeUpTimerTag = 0;
+}
+
+static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
+{
+ wxapp_uninstall_thread_wakeup();
#if (GTK_MINOR_VERSION > 0)
// when getting called from GDK's time-out handler
GDK_THREADS_LEAVE ();
#endif
- wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
+ wxapp_install_thread_wakeup();
return TRUE;
}
#endif
-*/
//-----------------------------------------------------------------------------
// wxApp
m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
-/*
#if wxUSE_THREADS
- m_wakeUpTimerTag = gtk_timeout_add( 20, wxapp_wakeup_timerout_callback, (gpointer) NULL );
+ m_wakeUpTimerTag = 0;
+ wxapp_install_thread_wakeup();
#endif
-*/
m_colorCube = (unsigned char*) NULL;
}
{
if (m_idleTag) gtk_idle_remove( m_idleTag );
-/*
#if wxUSE_THREADS
- if (m_wakeUpTimerTag) gtk_timeout_remove( m_wakeUpTimerTag );
+ wxapp_uninstall_thread_wakeup();
#endif
-*/
if (m_colorCube) free(m_colorCube);
}
void wxApp::OnIdle( wxIdleEvent &event )
{
- static bool inOnIdle = FALSE;
+ static bool s_inOnIdle = FALSE;
/* Avoid recursion (via ProcessEvent default case) */
- if (inOnIdle)
+ if (s_inOnIdle)
return;
- inOnIdle = TRUE;
+ s_inOnIdle = TRUE;
#if wxUSE_THREADS
/* Resend in the main thread events which have been prepared in other
if (needMore)
event.RequestMore(TRUE);
- inOnIdle = FALSE;
+ s_inOnIdle = FALSE;
}
bool wxApp::SendIdleEvents()
wxIdleEvent event;
event.SetEventObject(win);
- win->OnInternalIdle();
-
win->ProcessEvent(event);
+ win->OnInternalIdle();
+
if (event.MoreRequested())
needMore = TRUE;