From 5bdbc85a14447c9839f300072c4a3e3146f51585 Mon Sep 17 00:00:00 2001 From: Adam Moss Date: Wed, 21 Feb 2007 11:13:06 +0000 Subject: merge QA'd branch fixing SL-35450 Startup crash with non-english locales (linux client) svn merge svn+ssh://svn.lindenlab.com/svn/linden/release@58131 svn+ssh://svn.lindenlab.com/svn/linden/branches/moss/SL-35450-based-on-r58131 --- indra/llwindow/llwindowsdl.cpp | 23 +++++++++++++++++++---- indra/newview/llstartup.cpp | 21 +++++++++++++++++++-- 2 files changed, 38 insertions(+), 6 deletions(-) (limited to 'indra') diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp index 84c7d07085..865aba3cec 100644 --- a/indra/llwindow/llwindowsdl.cpp +++ b/indra/llwindow/llwindowsdl.cpp @@ -246,6 +246,14 @@ LLWindowSDL::LLWindowSDL(char *title, S32 x, S32 y, S32 width, mSDL_Display = NULL; #endif // LL_X11 +#if LL_GTK + // We MUST be the first to initialize GTK, i.e. we have to beat + // our embedded Mozilla to the punch so that GTK doesn't get badly + // initialized with a non-C locale and cause lots of serious random + // weirdness. + ll_try_gtk_init(); +#endif // LL_GTK + // Get the original aspect ratio of the main device. mOriginalAspectRatio = 1024.0 / 768.0; // !!! FIXME //(double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay); @@ -313,7 +321,7 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B { llinfos << "sdl_init() failed! " << SDL_GetError() << llendl; setupFailure("window creation error", "error", OSMB_OK); - return false; + return false; } SDL_version c_sdl_version; @@ -1000,7 +1008,7 @@ void LLWindowSDL::beforeDialog() #if LL_GTK // this is a good time to grab some GTK version information for - // diagnostics + // diagnostics, if not already done. ll_try_gtk_init(); #endif // LL_GTK @@ -1840,12 +1848,21 @@ void LLWindowSDL::gatherInput() // Pump GTK events so embedded Gecko doesn't starve. if (ll_try_gtk_init()) { + // Yuck, Mozilla's GTK callbacks play with the locale - push/pop + // the locale to protect it, as exotic/non-C locales + // causes our code lots of general critical weirdness + // and crashness. (SL-35450) + char *saved_locale = setlocale(LC_ALL, NULL); + // Do a limited number of pumps so SL doesn't starve! // FIXME - this should ideally be time-limited, not count-limited. gtk_main_iteration_do(0); // Always do one non-blocking pump for (int iter=0; iter<10; ++iter) if (gtk_events_pending()) gtk_main_iteration(); + + if (saved_locale) + setlocale(LC_ALL, saved_locale); } #endif // LL_GTK && LL_LIBXUL_ENABLED @@ -2336,9 +2353,7 @@ S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type) { S32 rtn = OSBTN_CANCEL; -#if LL_GTK ll_try_gtk_init(); -#endif // LL_GTK if(gWindowImplementation != NULL) gWindowImplementation->beforeDialog(); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index fc95ebd067..282de24060 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -464,12 +464,13 @@ BOOL idle_startup() #if LL_LIBXUL_ENABLED set_startup_status(0.48f, "Initializing embedded web browser...", gAgent.mMOTD.c_str()); display_startup(); + llinfos << "Initializing embedded web browser..." << llendl; #if LL_DARWIN // For Mac OS, we store both the shared libraries and the runtime files (chrome/, plugins/, etc) in // Second Life.app/Contents/MacOS/. This matches the way Firefox is distributed on the Mac. std::string profileBaseDir(gDirUtilp->getExecutableDir()); - #else + #elif LL_WINDOWS std::string profileBaseDir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) ); profileBaseDir += gDirUtilp->getDirDelimiter(); #ifdef LL_DEBUG @@ -477,8 +478,24 @@ BOOL idle_startup() #else profileBaseDir += "mozilla"; #endif + #else + std::string profileBaseDir( gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "" ) ); + profileBaseDir += gDirUtilp->getDirDelimiter(); + profileBaseDir += "mozilla"; #endif - LLMozLib::getInstance()->init( profileBaseDir, gDirUtilp->getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) ); + +#if LL_LINUX + // Yuck, Mozilla init plays with the locale - push/pop + // the locale to protect it, as exotic/non-C locales + // causes our code lots of general critical weirdness + // and crashness. (SL-35450) + char *saved_locale = setlocale(LC_ALL, NULL); +#endif // LL_LINUX + LLMozLib::getInstance()->init( profileBaseDir, gDirUtilp->getExpandedFilename( LL_PATH_MOZILLA_PROFILE, "" ) ); +#if LL_LINUX + if (saved_locale) + setlocale(LC_ALL, saved_locale); +#endif // LL_LINUX std::ostringstream codec; codec << "[Second Life " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD << "]"; -- cgit v1.2.3