wxYield() patch from stable tree.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9079 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2001-01-11 18:54:10 +00:00
parent 10bd072488
commit 99ba739f6a
2 changed files with 36 additions and 24 deletions

View File

@@ -82,25 +82,27 @@ void wxExit()
bool wxYield() bool wxYield()
{ {
bool has_idle = (wxTheApp->m_idleTag != 0); #ifdef __WXDEBUG__
static bool s_inYield = FALSE;
if (s_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) );
s_inYield = TRUE;
#endif
if (has_idle) if (!g_isIdle)
{ {
/* We need to temporarily remove idle callbacks or the loop will // We need to remove idle callbacks or the loop will
never finish. */ // never finish.
gtk_idle_remove( wxTheApp->m_idleTag ); gtk_idle_remove( wxTheApp->m_idleTag );
wxTheApp->m_idleTag = 0; wxTheApp->m_idleTag = 0;
g_isIdle = TRUE;
} }
while (gtk_events_pending()) while (gtk_events_pending())
gtk_main_iteration(); gtk_main_iteration();
if (has_idle)
{
/* re-add idle handler (very low priority) */
wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL );
}
// disable log flushing from here because a call to wxYield() shouldn't // disable log flushing from here because a call to wxYield() shouldn't
// normally result in message boxes popping up &c // normally result in message boxes popping up &c
wxLog::Suspend(); wxLog::Suspend();
@@ -113,6 +115,10 @@ bool wxYield()
// let the logs be flashed again // let the logs be flashed again
wxLog::Resume(); wxLog::Resume();
#ifdef __WXDEBUG__
s_inYield = FALSE;
#endif
return TRUE; return TRUE;
} }
@@ -199,6 +205,8 @@ void wxapp_install_idle_handler()
{ {
wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
g_isIdle = FALSE;
if (g_pendingTag == 0) if (g_pendingTag == 0)
g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL ); g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL );
@@ -209,8 +217,6 @@ void wxapp_install_idle_handler()
idle time). Very low priority. */ idle time). Very low priority. */
wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL ); wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL );
g_isIdle = FALSE;
} }
#if wxUSE_THREADS #if wxUSE_THREADS

View File

@@ -82,25 +82,27 @@ void wxExit()
bool wxYield() bool wxYield()
{ {
bool has_idle = (wxTheApp->m_idleTag != 0); #ifdef __WXDEBUG__
static bool s_inYield = FALSE;
if (s_inYield)
wxFAIL_MSG( wxT("wxYield called recursively" ) );
s_inYield = TRUE;
#endif
if (has_idle) if (!g_isIdle)
{ {
/* We need to temporarily remove idle callbacks or the loop will // We need to remove idle callbacks or the loop will
never finish. */ // never finish.
gtk_idle_remove( wxTheApp->m_idleTag ); gtk_idle_remove( wxTheApp->m_idleTag );
wxTheApp->m_idleTag = 0; wxTheApp->m_idleTag = 0;
g_isIdle = TRUE;
} }
while (gtk_events_pending()) while (gtk_events_pending())
gtk_main_iteration(); gtk_main_iteration();
if (has_idle)
{
/* re-add idle handler (very low priority) */
wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL );
}
// disable log flushing from here because a call to wxYield() shouldn't // disable log flushing from here because a call to wxYield() shouldn't
// normally result in message boxes popping up &c // normally result in message boxes popping up &c
wxLog::Suspend(); wxLog::Suspend();
@@ -113,6 +115,10 @@ bool wxYield()
// let the logs be flashed again // let the logs be flashed again
wxLog::Resume(); wxLog::Resume();
#ifdef __WXDEBUG__
s_inYield = FALSE;
#endif
return TRUE; return TRUE;
} }
@@ -199,6 +205,8 @@ void wxapp_install_idle_handler()
{ {
wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
g_isIdle = FALSE;
if (g_pendingTag == 0) if (g_pendingTag == 0)
g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL ); g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL );
@@ -209,8 +217,6 @@ void wxapp_install_idle_handler()
idle time). Very low priority. */ idle time). Very low priority. */
wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL ); wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL );
g_isIdle = FALSE;
} }
#if wxUSE_THREADS #if wxUSE_THREADS