X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f32848c53f72a444cce8212feff60a2eecc52750..cdbd62d6ff290fd58acd1bc5574dfc79db3a6f70:/src/gtk/app.cpp?ds=sidebyside diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index f90decedb1..2bd616a4ba 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -2,7 +2,6 @@ // Name: src/gtk/app.cpp // Purpose: // Author: Robert Roebling -// Id: $Id$ // Copyright: (c) 1998 Robert Roebling, Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -26,7 +25,6 @@ #include #endif -#include "wx/gtk/private.h" #include "wx/apptrait.h" #include "wx/fontmap.h" @@ -38,7 +36,8 @@ #include #endif // wxUSE_LIBHILDON2 -#include +#include +#include "wx/gtk/private.h" //----------------------------------------------------------------------------- // link GnomeVFS @@ -86,7 +85,7 @@ static void wx_add_idle_hooks() } } // "size_allocate" hook - // Needed to match the behavior of the old idle system, + // Needed to match the behaviour of the old idle system, // but probably not necessary. { static bool hook_installed; @@ -125,7 +124,7 @@ bool wxApp::DoIdle() #if wxDEBUG_LEVEL // don't generate the idle events while the assert modal dialog is shown, - // this matches the behavior of wxMSW + // this matches the behaviour of wxMSW if (m_isInAssert) return false; #endif @@ -143,29 +142,26 @@ bool wxApp::DoIdle() #if wxUSE_THREADS wxMutexLocker lock(m_idleMutex); #endif - // if a new idle source was added during ProcessIdle - if (m_idleSourceId != 0) - { - // remove it - g_source_remove(m_idleSourceId); - m_idleSourceId = 0; - } - // Pending events can be added asynchronously, - // need to keep idle source if any have appeared - if (HasPendingEvents()) - needMore = true; - - // if more idle processing requested - if (needMore) + bool keepSource = false; + // if a new idle source has not been added, either as a result of idle + // processing above or by another thread calling WakeUpIdle() + if (m_idleSourceId == 0) { - // keep this source installed - m_idleSourceId = id_save; - return true; + // if more idle processing was requested or pending events have appeared + if (needMore || HasPendingEvents()) + { + // keep this source installed + m_idleSourceId = id_save; + keepSource = true; + } + else // add hooks and remove this source + wx_add_idle_hooks(); } - // add hooks and remove this source - wx_add_idle_hooks(); - return false; + // else remove this source, leave new one installed + // we must keep an idle source, otherwise a wakeup could be lost + + return keepSource; } //----------------------------------------------------------------------------- @@ -202,6 +198,10 @@ wxApp::~wxApp() bool wxApp::SetNativeTheme(const wxString& theme) { +#ifdef __WXGTK3__ + wxUnusedVar(theme); + return false; +#else wxString path; path = gtk_rc_get_theme_dir(); path += "/"; @@ -222,6 +222,7 @@ bool wxApp::SetNativeTheme(const wxString& theme) gtk_rc_reparse_all_for_settings(gtk_settings_get_default(), TRUE); return true; +#endif } bool wxApp::OnInitGui() @@ -229,6 +230,7 @@ bool wxApp::OnInitGui() if ( !wxAppBase::OnInitGui() ) return false; +#ifndef __WXGTK3__ // if this is a wxGLApp (derived from wxApp), and we've already // chosen a specific visual, then derive the GdkVisual from that if ( GetXVisualInfo() ) @@ -266,6 +268,7 @@ bool wxApp::OnInitGui() } } } +#endif #if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 if ( !GetHildonProgram() ) @@ -295,6 +298,7 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_) // gtk+ 2.0 supports Unicode through UTF-8 strings wxConvCurrent = &wxConvUTF8; +#ifdef __UNIX__ // decide which conversion to use for the file names // (1) this variable exists for the sole purpose of specifying the encoding @@ -304,9 +308,9 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_) if (encName.CmpNoCase(wxT("@locale")) == 0) encName.clear(); encName.MakeUpper(); -#if wxUSE_INTL if (encName.empty()) { +#if wxUSE_INTL // (2) if a non default locale is set, assume that the user wants his // filenames in this locale too encName = wxLocale::GetSystemEncodingName().Upper(); @@ -325,24 +329,17 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_) encName.clear(); } } +#endif // wxUSE_INTL // (3) finally use UTF-8 by default if ( encName.empty() ) encName = wxT("UTF-8"); wxSetEnv(wxT("G_FILENAME_ENCODING"), encName); } -#else - if (encName.empty()) - encName = wxT("UTF-8"); - - // if wxUSE_INTL==0 it probably indicates that only "C" locale is supported - // by the program anyhow so prevent GTK+ from calling setlocale(LC_ALL, "") - // from gtk_init_check() as it does by default - gtk_disable_setlocale(); -#endif // wxUSE_INTL static wxConvBrokenFileNames fileconv(encName); wxConvFileName = &fileconv; +#endif // __UNIX__ bool init_result; @@ -360,13 +357,17 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_) int argcGTK = argc_; + // Prevent gtk_init_check() from changing the locale automatically for + // consistency with the other ports that don't do it. If necessary, + // wxApp::SetCLocale() may be explicitly called. + gtk_disable_setlocale(); + #ifdef __WXGPE__ init_result = true; // is there a _check() version of this? gpe_application_init( &argcGTK, &argvGTK ); #else - init_result = gtk_init_check( &argcGTK, &argvGTK ); + init_result = gtk_init_check( &argcGTK, &argvGTK ) != 0; #endif - wxUpdateLocaleIsUtf8(); if ( argcGTK != argc_ ) { @@ -439,7 +440,7 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_) return false; } - // we can not enter threads before gtk_init is done + // we cannot enter threads before gtk_init is done gdk_threads_enter(); #if wxUSE_INTL @@ -527,6 +528,25 @@ void wxGUIAppTraits::MutexGuiLeave() } #endif // wxUSE_THREADS +/* static */ +bool wxApp::GTKIsUsingGlobalMenu() +{ + static int s_isUsingGlobalMenu = -1; + if ( s_isUsingGlobalMenu == -1 ) + { + // Currently we just check for this environment variable because this + // is how support for the global menu is implemented under Ubuntu. + // + // If we ever get false positives, we could also check for + // XDG_CURRENT_DESKTOP env var being set to "Unity". + wxString proxy; + s_isUsingGlobalMenu = wxGetEnv("UBUNTU_MENUPROXY", &proxy) && + !proxy.empty() && proxy != "0"; + } + + return s_isUsingGlobalMenu == 1; +} + #if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 // Maemo-specific method: get the main program object HildonProgram *wxApp::GetHildonProgram()