X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb65642cd4f27c7ecfbb642043364ac10b9f672c..0b7e6e7da208b6a95fb23cb50286a09dc90d96d2:/src/gtk1/app.cpp diff --git a/src/gtk1/app.cpp b/src/gtk1/app.cpp index bd85f4f6a2..7b9962d165 100644 --- a/src/gtk1/app.cpp +++ b/src/gtk1/app.cpp @@ -95,14 +95,22 @@ bool wxYield() if (has_idle) { - /* re-add idle handler */ - wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL ); + /* re-add idle handler (very low priority) */ + wxTheApp->m_idleTag = gtk_idle_add_priority( 500, wxapp_idle_callback, (gpointer) NULL ); } + // disable log flushing from here because a call to wxYield() shouldn't + // normally result in message boxes popping up &c + wxLog::Suspend(); + /* 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()) { } + while (wxTheApp->ProcessIdle()) + ; + + // let the logs be flashed again + wxLog::Resume(); return TRUE; } @@ -169,9 +177,9 @@ void wxapp_install_idle_handler() 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). */ + idle time). Very low priority. */ - wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL ); + wxTheApp->m_idleTag = gtk_idle_add_priority( 500, wxapp_idle_callback, (gpointer) NULL ); g_isIdle = FALSE; } @@ -380,9 +388,7 @@ void wxApp::OnIdle( wxIdleEvent &event ) /* flush the logged messages if any */ #if wxUSE_LOG - wxLog *log = wxLog::GetActiveTarget(); - if (log != NULL && log->HasPendingMessages()) - log->Flush(); + wxLog::FlushActive(); #endif // wxUSE_LOG } @@ -559,7 +565,8 @@ void wxApp::CleanUp() // wxEntry //----------------------------------------------------------------------------- -int wxEntry( int argc, char *argv[] ) + +int wxEntryStart( int argc, char *argv[] ) { #if wxUSE_THREADS /* GTK 1.2 up to version 1.2.3 has broken threads */ @@ -595,6 +602,55 @@ int wxEntry( int argc, char *argv[] ) return -1; } + return 0; +} + + +int wxEntryInitGui() +{ + int retValue = 0; + + if ( !wxTheApp->OnInitGui() ) + retValue = -1; + + wxRootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL ); + gtk_widget_realize( wxRootWindow ); + + return retValue; +} + + +void wxEntryCleanup() +{ +#if wxUSE_LOG + // flush the logged messages if any + wxLog *log = wxLog::GetActiveTarget(); + if (log != NULL && log->HasPendingMessages()) + log->Flush(); + + // continuing to use user defined log target is unsafe from now on because + // some resources may be already unavailable, so replace it by something + // more safe + wxLog *oldlog = wxLog::SetActiveTarget(new wxLogStderr); + if ( oldlog ) + delete oldlog; +#endif // wxUSE_LOG + + wxApp::CleanUp(); + + gdk_threads_leave(); +} + + + +int wxEntry( int argc, char *argv[] ) +{ + int err; + + err = wxEntryStart(argc, argv); + if (err) + return err; + if (!wxTheApp) { wxCHECK_MSG( wxApp::GetInitializerFunction(), -1, @@ -627,13 +683,8 @@ int wxEntry( int argc, char *argv[] ) wxStripExtension( name ); wxTheApp->SetAppName( name ); - int retValue = 0; - - if ( !wxTheApp->OnInitGui() ) - retValue = -1; - - wxRootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL ); - gtk_widget_realize( wxRootWindow ); + int retValue; + retValue = wxEntryInitGui(); // Here frames insert themselves automatically into wxTopLevelWindows by // getting created in OnInit(). @@ -677,23 +728,7 @@ int wxEntry( int argc, char *argv[] ) } } -#if wxUSE_LOG - // flush the logged messages if any - wxLog *log = wxLog::GetActiveTarget(); - if (log != NULL && log->HasPendingMessages()) - log->Flush(); - - // continuing to use user defined log target is unsafe from now on because - // some resources may be already unavailable, so replace it by something - // more safe - wxLog *oldlog = wxLog::SetActiveTarget(new wxLogStderr); - if ( oldlog ) - delete oldlog; -#endif // wxUSE_LOG - - wxApp::CleanUp(); - - gdk_threads_leave(); + wxEntryCleanup(); return retValue; }