X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/176d98241020d28c8b7c9220389139e8dbf6a8ea..dc4689ef73c1046e49978fcd0a929f3dd975fbb9:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 9be1cb13bf..e68e9654d6 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -135,7 +135,7 @@ bool wxApp::Yield(bool onlyIfNeeded) // We need to remove idle callbacks or the loop will // never finish. - RemoveIdleSource(); + SuspendIdleCallback(); #if wxUSE_LOG // disable log flushing from here because a call to wxYield() shouldn't @@ -208,44 +208,45 @@ static inline void wxAddEmissionHook() static gint wxapp_idle_callback( gpointer WXUNUSED(data) ) { + // this does not look possible, but just in case... if (!wxTheApp) return false; + bool moreIdles = false; + #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 false; + // this matches the behavior of wxMSW + if (!wxTheApp->IsInAssert()) #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(); + + // Send idle event to all who request them as long as + // no events have popped up in the event queue. + do { + moreIdles = wxTheApp->ProcessIdle(); + } while (moreIdles && gtk_events_pending() == 0); + + // Release lock again + gdk_threads_leave(); + } - // 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. + if (!moreIdles) { #if wxUSE_THREADS wxMutexLocker lock(gs_idleTagsMutex); #endif + // 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; - } - - bool moreIdles; - // Send idle event to all who request them as long as - // no events have popped up in the event queue. - while ( (moreIdles = wxTheApp->ProcessIdle()) && gtk_events_pending() == 0) - ; - - // Release lock again - gdk_threads_leave(); - - if (!moreIdles) wxAddEmissionHook(); + } // Return FALSE if no more idle events are to be sent return moreIdles; @@ -281,7 +282,7 @@ int wxPoll(wxPollFd *ufds, unsigned int nfds, int timeout) unsigned int i; for ( i = 0; i < nfds; i++ ) { - wxASSERT_MSG( ufds[i].fd < wxFD_SETSIZE, _T("fd out of range") ); + wxASSERT_MSG( ufds[i].fd < FD_SETSIZE, _T("fd out of range") ); if ( ufds[i].events & G_IO_IN ) wxFD_SET(ufds[i].fd, &readfds); @@ -344,6 +345,9 @@ static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout ) void wxapp_install_idle_handler() { + if (wxTheApp == NULL) + return; + #if wxUSE_THREADS wxMutexLocker lock(gs_idleTagsMutex); #endif @@ -428,24 +432,38 @@ bool wxApp::OnInitGui() // chosen a specific visual, then derive the GdkVisual from that if (m_glVisualInfo != NULL) { - // seems gtk_widget_set_default_visual no longer exists? GdkVisual* vis = gtk_widget_get_default_visual(); GdkColormap *colormap = gdk_colormap_new( vis, FALSE ); gtk_widget_set_default_colormap( colormap ); } - - // On some machines, the default visual is just 256 colours, so - // we make sure we get the best. This can sometimes be wasteful. - else - if ((gdk_visual_get_best() != gdk_visual_get_system()) && (m_useBestVisual)) { - /* seems gtk_widget_set_default_visual no longer exists? */ - GdkVisual* vis = gtk_widget_get_default_visual(); - - GdkColormap *colormap = gdk_colormap_new( vis, FALSE ); - gtk_widget_set_default_colormap( colormap ); + // On some machines, the default visual is just 256 colours, so + // we make sure we get the best. This can sometimes be wasteful. + if (m_useBestVisual) + { + if (m_forceTrueColour) + { + GdkVisual* visual = gdk_visual_get_best_with_both( 24, GDK_VISUAL_TRUE_COLOR ); + if (!visual) + { + wxLogError(wxT("Unable to initialize TrueColor visual.")); + return false; + } + GdkColormap *colormap = gdk_colormap_new( visual, FALSE ); + gtk_widget_set_default_colormap( colormap ); + } + else + { + if (gdk_visual_get_best() != gdk_visual_get_system()) + { + GdkVisual* visual = gdk_visual_get_best(); + GdkColormap *colormap = gdk_colormap_new( visual, FALSE ); + gtk_widget_set_default_colormap( colormap ); + } + } + } } return true; @@ -491,7 +509,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv) // of the filenames for GTK+ programs, so use it if it is set wxString encName(wxGetenv(_T("G_FILENAME_ENCODING"))); encName = encName.BeforeFirst(_T(',')); - if (encName == _T("@locale")) + if (encName.CmpNoCase(_T("@locale")) == 0) encName.clear(); encName.MakeUpper(); #if wxUSE_INTL @@ -599,6 +617,8 @@ void wxApp::OnAssertFailure(const wxChar *file, const wxChar* cond, const wxChar *msg) { + + // block wx idle events while assert dialog is showing m_isInAssert = true; wxAppBase::OnAssertFailure(file, line, func, cond, msg); @@ -608,7 +628,7 @@ void wxApp::OnAssertFailure(const wxChar *file, #endif // __WXDEBUG__ -void wxApp::RemoveIdleSource() +void wxApp::SuspendIdleCallback() { #if wxUSE_THREADS wxMutexLocker lock(gs_idleTagsMutex);