X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb65642cd4f27c7ecfbb642043364ac10b9f672c..dd00f3f6fa06de66a8c5dedb0494eecc66633994:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index bd85f4f6a2..65460281f1 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -29,7 +29,7 @@ #include "wx/image.h" #if wxUSE_THREADS -#include "wx/thread.h" + #include "wx/thread.h" #endif #include @@ -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( 1000, 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( 1000, wxapp_idle_callback, (gpointer) NULL ); g_isIdle = FALSE; } @@ -242,7 +250,7 @@ wxApp::wxApp() m_topWindow = (wxWindow *) NULL; m_exitOnFrameDelete = TRUE; - m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL ); + m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL ); #if wxUSE_THREADS m_wakeUpTimerTag = 0; @@ -276,8 +284,13 @@ bool wxApp::OnInitGui() if ((gdk_visual_get_best() != gdk_visual_get_system()) && (m_useBestVisual)) { +#ifdef __WXGTK20__ + /* seems gtk_widget_set_default_visual no longer exists? */ + GdkVisual* vis = gtk_widget_get_default_visual(); +#else GdkVisual* vis = gdk_visual_get_best(); gtk_widget_set_default_visual( vis ); +#endif GdkColormap *colormap = gdk_colormap_new( vis, FALSE ); gtk_widget_set_default_colormap( colormap ); @@ -380,9 +393,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 } @@ -409,7 +420,7 @@ bool wxApp::SendIdleEvents( wxWindow* win ) wxIdleEvent event; event.SetEventObject(win); - win->ProcessEvent(event); + win->GetEventHandler()->ProcessEvent(event); win->OnInternalIdle(); @@ -559,14 +570,21 @@ 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 */ - if ((gtk_major_version == 1) && +#ifdef __VMS__ + if ((vms_gtk_major_version() == 1) && + (vms_gtk_minor_version() == 2) && + (vms_gtk_micro_version() < 4)) +#else + if ((gtk_major_version == 1) && (gtk_minor_version == 2) && (gtk_micro_version < 4)) - { +#endif + { printf( "wxWindows warning: GUI threading disabled due to outdated GTK version\n" ); } else @@ -577,7 +595,10 @@ int wxEntry( int argc, char *argv[] ) gtk_set_locale(); -#if wxUSE_WCHAR_T +#if defined(__WXGTK20__) + // gtk+ 2.0 supports Unicode through UTF-8 strings + wxConvCurrent = &wxConvUTF8; +#elif wxUSE_WCHAR_T if (!wxOKlibc()) wxConvCurrent = &wxConvLocal; #else if (!wxOKlibc()) wxConvCurrent = (wxMBConv*) NULL; @@ -595,6 +616,53 @@ 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 = wxEntryStart(argc, argv); + if (err) + return err; + if (!wxTheApp) { wxCHECK_MSG( wxApp::GetInitializerFunction(), -1, @@ -627,13 +695,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 +740,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; }