summaryrefslogtreecommitdiff
path: root/indra/newview/llappviewer.cpp
diff options
context:
space:
mode:
authorSteven Bennetts <steve@lindenlab.com>2009-06-21 08:04:56 +0000
committerSteven Bennetts <steve@lindenlab.com>2009-06-21 08:04:56 +0000
commit9ec432034dc3c45d7ce763eb02dae4cc7f6b8da8 (patch)
tree4a505c1e0919af52800b3ffb3eaf135e7d6f9ce6 /indra/newview/llappviewer.cpp
parent351ebe9fcb76f3b99c2957004bb8493a904869ee (diff)
merge -r 122421-124917 viewer-2.0.0-2 -> viewer-2.0.0-3
ignore-dead-branch
Diffstat (limited to 'indra/newview/llappviewer.cpp')
-rw-r--r--indra/newview/llappviewer.cpp592
1 files changed, 352 insertions, 240 deletions
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b66b514597..ce66bb6180 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -30,9 +30,10 @@
* $/LicenseInfo$
*/
-
#include "llviewerprecompiledheaders.h"
+
#include "llappviewer.h"
+
#include "llprimitive.h"
#include "llversionviewer.h"
@@ -44,19 +45,20 @@
#include "llviewerimagelist.h"
#include "llgroupmgr.h"
#include "llagent.h"
+#include "llagentwearables.h"
#include "llwindow.h"
#include "llviewerstats.h"
#include "llmd5.h"
#include "llpumpio.h"
#include "llimpanel.h"
#include "llmimetypes.h"
+#include "llslurl.h"
#include "llstartup.h"
#include "llfocusmgr.h"
#include "llviewerjoystick.h"
-#include "llfloaterjoystick.h"
+#include "llallocator.h"
#include "llares.h"
#include "llcurl.h"
-#include "llfloatersnapshot.h"
#include "llviewerwindow.h"
#include "llviewerdisplay.h"
#include "llviewermedia.h"
@@ -64,14 +66,20 @@
#include "llviewerobjectlist.h"
#include "llworldmap.h"
#include "llmutelist.h"
+#include "lluicolortable.h"
#include "llurldispatcher.h"
#include "llurlhistory.h"
#include "llfirstuse.h"
#include "llrender.h"
-
+#include "lllocationhistory.h"
+#include "llfasttimerview.h"
#include "llweb.h"
#include "llsecondlifeurls.h"
+// Linden library includes
+#include "llmemory.h"
+
+// Third party library includes
#include <boost/bind.hpp>
#if LL_WINDOWS
@@ -105,7 +113,6 @@
#include "llviewermenu.h"
#include "llselectmgr.h"
#include "lltrans.h"
-#include "lluitrans.h"
#include "lltracker.h"
#include "llviewerparcelmgr.h"
#include "llworldmapview.h"
@@ -116,9 +123,7 @@
#include "lldebugview.h"
#include "llconsole.h"
#include "llcontainerview.h"
-#include "llfloaterstats.h"
#include "llhoverview.h"
-#include "llfloatermemleak.h"
#include "llsdserialize.h"
@@ -139,12 +144,16 @@
#include "llvoavatar.h"
#include "llfolderview.h"
#include "lltoolbar.h"
-#include "llframestats.h"
#include "llagentpilot.h"
#include "llsrv.h"
#include "llvovolume.h"
#include "llflexibleobject.h"
#include "llvosurfacepatch.h"
+#include "llviewerfloaterreg.h"
+#include "llcommandlineparser.h"
+#include "llfloatermemleak.h"
+#include "llfloatersnapshot.h"
+#include "llinventoryview.h"
// includes for idle() idleShutdown()
#include "llviewercontrol.h"
@@ -161,11 +170,6 @@
#include "llviewerthrottle.h"
#include "llparcel.h"
-
-#include "llinventoryview.h"
-
-#include "llcommandlineparser.h"
-
// *FIX: These extern globals should be cleaned up.
// The globals either represent state/config/resource-storage of either
// this app, or another 'component' of the viewer. App globals should be
@@ -181,10 +185,6 @@
////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
//
-#if LL_WINDOWS && LL_LCD_COMPILE
- #include "lllcd.h"
-#endif
-
//----------------------------------------------------------------------------
// viewer.cpp - these are only used in viewer, should be easily moved.
@@ -285,11 +285,22 @@ static std::string gLaunchFileOnQuit;
const char* const VIEWER_WINDOW_CLASSNAME = "Second Life";
//----------------------------------------------------------------------------
+
+// List of entries from strings.xml to always replace
+static std::set<std::string> default_trans_args;
+void init_default_trans_args()
+{
+ default_trans_args.insert("SECOND_LIFE"); // World
+ default_trans_args.insert("SECOND_LIFE_VIEWER");
+ default_trans_args.insert("SECOND_LIFE_GRID");
+ default_trans_args.insert("SECOND_LIFE_SUPPORT");
+}
+
+//----------------------------------------------------------------------------
// File scope definitons
const char *VFS_DATA_FILE_BASE = "data.db2.x.";
const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
-static std::string gSecondLife;
static std::string gWindowTitle;
std::string gLoginPage;
@@ -366,7 +377,6 @@ static void settings_to_globals()
MENU_BAR_HEIGHT = gSavedSettings.getS32("MenuBarHeight");
MENU_BAR_WIDTH = gSavedSettings.getS32("MenuBarWidth");
- STATUS_BAR_HEIGHT = gSavedSettings.getS32("StatusBarHeight");
LLCOMBOBOX_HEIGHT = BTN_HEIGHT - 2;
LLCOMBOBOX_WIDTH = 128;
@@ -388,10 +398,9 @@ static void settings_to_globals()
LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections");
LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius");
- gFrameStats.setTrackStats(gSavedSettings.getBOOL("StatsSessionTrackFrameStats"));
gAgentPilot.mNumRuns = gSavedSettings.getS32("StatsNumRuns");
gAgentPilot.mQuitAfterRuns = gSavedSettings.getBOOL("StatsQuitAfterRuns");
- gAgent.mHideGroupTitle = gSavedSettings.getBOOL("RenderHideGroupTitle");
+ gAgent.setHideGroupTitle(gSavedSettings.getBOOL("RenderHideGroupTitle"));
gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");
gAllowTapTapHoldRun = gSavedSettings.getBOOL("AllowTapTapHoldRun");
@@ -408,7 +417,7 @@ static void settings_modify()
LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors");
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4]
- gDebugGL = gSavedSettings.getBOOL("RenderDebugGL");
+ gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;
gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");
#if LL_VECTORIZE
@@ -446,6 +455,38 @@ static void settings_modify()
#endif
}
+class LLFastTimerLogThread : public LLThread
+{
+public:
+ std::string mFile;
+
+ LLFastTimerLogThread() : LLThread("fast timer log")
+ {
+ if(LLFastTimer::sLog)
+ {
+ mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance.slp");
+ }
+ if(LLFastTimer::sMetricLog)
+ {
+ mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric.slp");
+ }
+ }
+
+ void run()
+ {
+ std::ofstream os(mFile.c_str());
+
+ while (!LLAppViewer::instance()->isQuitting())
+ {
+ LLFastTimer::writeLog(os);
+ os.flush();
+ ms_sleep(32);
+ }
+
+ os.close();
+ }
+};
+
void LLAppViewer::initGridChoice()
{
// Load up the initial grid choice from:
@@ -497,8 +538,6 @@ bool LLAppViewer::sendURLToOtherInstance(const std::string& url)
LLAppViewer* LLAppViewer::sInstance = NULL;
const std::string LLAppViewer::sGlobalSettingsName = "Global";
-const std::string LLAppViewer::sPerAccountSettingsName = "PerAccount";
-const std::string LLAppViewer::sCrashSettingsName = "CrashSettings";
LLTextureCache* LLAppViewer::sTextureCache = NULL;
LLWorkerThread* LLAppViewer::sImageDecodeThread = NULL;
@@ -513,11 +552,15 @@ LLAppViewer::LLAppViewer() :
mPurgeOnExit(false),
mSecondInstance(false),
mSavedFinalSnapshot(false),
+ mForceGraphicsDetail(false),
mQuitRequested(false),
mLogoutRequestSent(false),
mYieldTime(-1),
mMainloopTimeout(NULL),
- mAgentRegionLastAlive(false)
+ mAgentRegionLastAlive(false),
+ mFastTimerLogThread(NULL),
+ mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)),
+ mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE))
{
if(NULL != sInstance)
{
@@ -558,8 +601,13 @@ bool LLAppViewer::init()
//
// OK to write stuff to logs now, we've now crash reported if necessary
//
- if (!initConfiguration())
+
+ init_default_trans_args();
+
+ if (!initConfiguration())
return false;
+
+ mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling"));
// *NOTE:Mani - LLCurl::initClass is not thread safe.
// Called before threads are created.
@@ -612,35 +660,37 @@ bool LLAppViewer::init()
LLError::setPrintLocation(true);
}
- // Load art UUID information, don't require these strings to be declared in code.
- std::string colors_base_filename = gDirUtilp->findSkinnedFilename("colors_base.xml");
- LL_DEBUGS("InitInfo") << "Loading base colors from " << colors_base_filename << LL_ENDL;
- gColors.loadFromFileLegacy(colors_base_filename, FALSE, TYPE_COL4U);
-
- // Load overrides from user colors file
- std::string user_colors_filename = gDirUtilp->findSkinnedFilename("colors.xml");
- LL_DEBUGS("InitInfo") << "Loading user colors from " << user_colors_filename << LL_ENDL;
- if (gColors.loadFromFileLegacy(user_colors_filename, FALSE, TYPE_COL4U) == 0)
- {
- LL_DEBUGS("InitInfo") << "Cannot load user colors from " << user_colors_filename << LL_ENDL;
- }
-
// Widget construction depends on LLUI being initialized
- LLUI::initClass(&gSavedSettings,
- &gSavedSettings,
- &gColors,
+ LLUI::settings_map_t settings_map;
+ settings_map["config"] = &gSavedSettings;
+ settings_map["color"] = &gSavedSkinSettings;
+ settings_map["ignores"] = &gWarningSettings;
+ settings_map["floater"] = &gSavedSettings; // *TODO: New settings file
+ settings_map["account"] = &gSavedPerAccountSettings;
+
+ LLUI::initClass(settings_map,
LLUIImageList::getInstance(),
ui_audio_callback,
&LLUI::sGLScaleFactor);
+
+ // Setup paths and LLTrans after LLUI::initClass has been called
+ LLUI::setupPaths();
+ LLTrans::parseStrings("strings.xml", default_trans_args);
+
LLWeb::initClass(); // do this after LLUI
LLTextEditor::setURLCallbacks(&LLWeb::loadURL,
&LLURLDispatcher::dispatchFromTextEditor,
&LLURLDispatcher::dispatchFromTextEditor);
- LLUICtrlFactory::getInstance()->setupPaths(); // update paths with correct language set
/////////////////////////////////////////////////
+
+ LLToolMgr::getInstance(); // Initialize tool manager if not already instantiated
+
+ LLViewerFloaterReg::registerFloaters();
+
+ /////////////////////////////////////////////////
//
// Load settings files
//
@@ -692,18 +742,8 @@ bool LLAppViewer::init()
if (!initCache())
{
std::ostringstream msg;
- msg <<
- gSecondLife << " is unable to access a file that it needs.\n"
- "\n"
- "This can be because you somehow have multiple copies running, "
- "or your system incorrectly thinks a file is open. "
- "If this message persists, restart your computer and try again. "
- "If it continues to persist, you may need to completely uninstall " <<
- gSecondLife << " and reinstall it.";
- OSMessageBox(
- msg.str(),
- LLStringUtil::null,
- OSMB_OK);
+ msg << LLTrans::getString("MBUnableToAccessFile");
+ OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
return 1;
}
@@ -820,6 +860,7 @@ bool LLAppViewer::init()
bool LLAppViewer::mainLoop()
{
+ LLMemType mt1(LLMemType::MTYPE_MAIN);
mMainloopTimeout = new LLWatchdogTimeout();
// *FIX:Mani - Make this a setting, once new settings exist in this branch.
@@ -837,7 +878,6 @@ bool LLAppViewer::mainLoop()
LLVoiceChannel::initClass();
LLVoiceClient::init(gServicePump);
- LLMemType mt1(LLMemType::MTYPE_MAIN);
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
@@ -853,12 +893,12 @@ bool LLAppViewer::mainLoop()
// Handle messages
while (!LLApp::isExiting())
{
- LLFastTimer::reset(); // Should be outside of any timer instances
+ LLFastTimer::nextFrame(); // Should be outside of any timer instances
try
{
- LLFastTimer t(LLFastTimer::FTM_FRAME);
pingMainloopTimeout("Main:MiscNativeWindowEvents");
-
+
+ if (gViewerWindow)
{
LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
gViewerWindow->mWindow->processMiscNativeEvents();
@@ -866,6 +906,7 @@ bool LLAppViewer::mainLoop()
pingMainloopTimeout("Main:GatherInput");
+ if (gViewerWindow)
{
LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
if (!restoreErrorTrap())
@@ -907,6 +948,7 @@ bool LLAppViewer::mainLoop()
&& !gViewerWindow->getShowProgress()
&& !gFocusMgr.focusLocked())
{
+ LLMemType mjk(LLMemType::MTYPE_JOY_KEY);
joystick->scanJoystick();
gKeyboard->scanKeyboard();
}
@@ -920,6 +962,7 @@ bool LLAppViewer::mainLoop()
if (gAres != NULL && gAres->isInitialized())
{
+ LLMemType mt_ip(LLMemType::MTYPE_IDLE_PUMP);
pingMainloopTimeout("Main:ServicePump");
LLFastTimer t4(LLFastTimer::FTM_PUMP);
gAres->process();
@@ -947,12 +990,6 @@ bool LLAppViewer::mainLoop()
pingMainloopTimeout("Main:Snapshot");
LLFloaterSnapshot::update(); // take snapshots
-
-#if LL_LCD_COMPILE
- // update LCD Screen
- pingMainloopTimeout("Main:LCD");
- gLcdScreen->UpdateDisplay();
-#endif
}
}
@@ -963,6 +1000,7 @@ bool LLAppViewer::mainLoop()
// Sleep and run background threads
{
+ LLMemType mt_sleep(LLMemType::MTYPE_SLEEP);
LLFastTimer t2(LLFastTimer::FTM_SLEEP);
bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads");
@@ -974,7 +1012,7 @@ bool LLAppViewer::mainLoop()
// yield cooperatively when not running as foreground window
if ( gNoRender
- || !gViewerWindow->mWindow->getVisible()
+ || (gViewerWindow && !gViewerWindow->mWindow->getVisible())
|| !gFocusMgr.getAppHasFocus())
{
// Sleep if we're not rendering, or the window is minimized.
@@ -990,12 +1028,12 @@ bool LLAppViewer::mainLoop()
}
}
- if (gRandomizeFramerate)
+ if (mRandomizeFramerate)
{
ms_sleep(rand() % 200);
}
- if (gPeriodicSlowFrame
+ if (mPeriodicSlowFrame
&& (gFrameCount % 10 == 0))
{
llinfos << "Periodic slow frame - sleeping 500 ms" << llendl;
@@ -1221,22 +1259,26 @@ bool LLAppViewer::cleanup()
llinfos << "Shutting down." << llendflush;
// Destroy the UI
- gViewerWindow->shutdownViews();
+ if( gViewerWindow)
+ gViewerWindow->shutdownViews();
// Clean up selection managers after UI is destroyed, as UI may be observing them.
// Clean up before GL is shut down because we might be holding on to objects with texture references
LLSelectMgr::cleanupGlobals();
// Shut down OpenGL
- gViewerWindow->shutdownGL();
+ if( gViewerWindow)
+ {
+ gViewerWindow->shutdownGL();
+
+ // Destroy window, and make sure we're not fullscreen
+ // This may generate window reshape and activation events.
+ // Therefore must do this before destroying the message system.
+ delete gViewerWindow;
+ gViewerWindow = NULL;
+ llinfos << "ViewerWindow deleted" << llendflush;
+ }
- // Destroy window, and make sure we're not fullscreen
- // This may generate window reshape and activation events.
- // Therefore must do this before destroying the message system.
- delete gViewerWindow;
- gViewerWindow = NULL;
- llinfos << "ViewerWindow deleted" << llendflush;
-
// viewer UI relies on keyboard so keep it aound until viewer UI isa gone
delete gKeyboard;
gKeyboard = NULL;
@@ -1256,12 +1298,6 @@ bool LLAppViewer::cleanup()
// gDXHardware.cleanup();
//#endif // LL_WINDOWS
-#if LL_LCD_COMPILE
- // shut down the LCD window on a logitech keyboard, if there is one
- delete gLcdScreen;
- gLcdScreen = NULL;
-#endif
-
LLVolumeMgr* volume_manager = LLPrimitive::getVolumeManager();
if (!volume_manager->cleanup())
{
@@ -1303,8 +1339,10 @@ bool LLAppViewer::cleanup()
// Must do this after all panels have been deleted because panels that have persistent rects
// save their rects on delete.
- gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
-
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
+
+ //*FIX: don't overwrite user color tweaks with *all* colors
+ gSavedSkinSettings.saveToFile(gSavedSettings.getString("SkinningSettingsFile"), TRUE);
// PerAccountSettingsFile should be empty if no use has been logged on.
// *FIX:Mani This should get really saved in a "logoff" mode.
gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("PerAccountSettingsFile"), TRUE);
@@ -1314,8 +1352,11 @@ bool LLAppViewer::cleanup()
// save all settings, even if equals defaults
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
+ std::string warnings_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Warnings"));
+ gWarningSettings.saveToFile(warnings_settings_filename, TRUE);
+
gSavedSettings.cleanup();
- gColors.cleanup();
+ gSavedSkinSettings.cleanup();
gCrashSettings.cleanup();
// Save URL history file
@@ -1360,6 +1401,7 @@ bool LLAppViewer::cleanup()
sTextureCache->shutdown();
sTextureFetch->shutdown();
sImageDecodeThread->shutdown();
+
delete sTextureCache;
sTextureCache = NULL;
delete sTextureFetch;
@@ -1367,6 +1409,31 @@ bool LLAppViewer::cleanup()
delete sImageDecodeThread;
sImageDecodeThread = NULL;
+ LLLocationHistory::getInstance()->save();
+ delete mFastTimerLogThread;
+ mFastTimerLogThread = NULL;
+
+ if (LLFastTimerView::sAnalyzePerformance)
+ {
+ llinfos << "Analyzing performance" << llendl;
+
+ if(LLFastTimer::sLog)
+ {
+ LLFastTimerView::doAnalysis(
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance_baseline.slp"),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance.slp"),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance_report.csv"));
+ }
+ if(LLFastTimer::sMetricLog)
+ {
+ LLFastTimerView::doAnalysis(
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric_baseline.slp"),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric.slp"),
+ gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric_report.csv"));
+ }
+ }
+ LLMetricPerformanceTester::cleanClass() ;
+
//Note:
//LLViewerMedia::cleanupClass() has to be put before gImageList.shutdown()
//because some new image might be generated during cleaning up media. --bao
@@ -1419,6 +1486,8 @@ bool LLAppViewer::cleanup()
llinfos << "File launched." << llendflush;
}
+ ll_close_fail_log();
+
llinfos << "Goodbye" << llendflush;
// return 0;
@@ -1469,6 +1538,13 @@ bool LLAppViewer::initThreads()
LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false);
LLImage::initClass(LLAppViewer::getImageDecodeThread());
+ if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
+ {
+ LLFastTimer::sLogLock = new LLMutex(NULL);
+ mFastTimerLogThread = new LLFastTimerLogThread();
+ mFastTimerLogThread->start();
+ }
+
// *FIX: no error handling here!
return true;
}
@@ -1476,7 +1552,7 @@ bool LLAppViewer::initThreads()
void errorCallback(const std::string &error_string)
{
#ifndef LL_RELEASE_FOR_DOWNLOAD
- OSMessageBox(error_string, "Fatal Error", OSMB_OK);
+ OSMessageBox(error_string, LLTrans::getString("MBFatalError"), OSMB_OK);
#endif
//Set the ErrorActivated global so we know to create a marker file
@@ -1544,7 +1620,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
llinfos << "Attempting to load settings for the group " << settings_group
<< " - from location " << location_key << llendl;
- if(gSettings.find(settings_group) == gSettings.end())
+ if(!LLControlGroup::getInstance(settings_group))
{
llwarns << "No matching settings group for name " << settings_group << llendl;
continue;
@@ -1558,10 +1634,10 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
std::string custom_name_setting = file.get("NameFromSetting");
// *NOTE: Regardless of the group currently being lodaed,
// this setting is always read from the Global settings.
- if(gSettings[sGlobalSettingsName]->controlExists(custom_name_setting))
+ if(LLControlGroup::getInstance(sGlobalSettingsName)->controlExists(custom_name_setting))
{
std::string file_name =
- gSettings[sGlobalSettingsName]->getString(custom_name_setting);
+ LLControlGroup::getInstance(sGlobalSettingsName)->getString(custom_name_setting);
full_settings_path = file_name;
}
}
@@ -1578,7 +1654,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
requirement = file.get("Requirement").asInteger();
}
- if(!gSettings[settings_group]->loadFromFile(full_settings_path, set_defaults))
+ if(!LLControlGroup::getInstance(settings_group)->loadFromFile(full_settings_path, set_defaults))
{
if(requirement == 1)
{
@@ -1618,17 +1694,53 @@ std::string LLAppViewer::getSettingsFilename(const std::string& location_key,
return std::string();
}
+void LLAppViewer::loadColorSettings()
+{
+ gSavedSkinSettings.cleanup();
+
+ loadSettingsFromDirectory("DefaultSkin");
+ loadSettingsFromDirectory("CurrentSkin", true);
+ loadSettingsFromDirectory("UserSkin");
+
+ class ColorConverterFunctor : public LLControlGroup::ApplyFunctor
+ {
+ public:
+ explicit ColorConverterFunctor(LLUIColorTable::Params& result)
+ :mResult(result)
+ {
+ }
+
+ void apply(const std::string& name, LLControlVariable* control)
+ {
+ if(control->isType(TYPE_COL4))
+ {
+ LLUIColorTable::ColorParams color;
+ color.value = control->getValue();
+
+ LLUIColorTable::ColorEntryParams color_entry;
+ color_entry.name = name;
+ color_entry.color = color;
+
+ mResult.color_entries.add(color_entry);
+ }
+ }
+
+ private:
+ LLUIColorTable::Params& mResult;
+ };
+
+ LLUIColorTable::Params params;
+ ColorConverterFunctor ccf(params);
+ LLControlGroup::getInstance("Skinning")->applyToAll(&ccf);
+ LLUIColorTable::instance().init(params);
+}
+
bool LLAppViewer::initConfiguration()
{
- //Set up internal pointers
- gSettings[sGlobalSettingsName] = &gSavedSettings;
- gSettings[sPerAccountSettingsName] = &gSavedPerAccountSettings;
- gSettings[sCrashSettingsName] = &gCrashSettings;
-
//Load settings files list
std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml");
- LLControlGroup settings_control;
- llinfos << "Loading settings file list" << settings_file_list << llendl;
+ LLControlGroup settings_control("SettingsFiles");
+ llinfos << "Loading settings file list " << settings_file_list << llendl;
if (0 == settings_control.loadFromFile(settings_file_list))
{
llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
@@ -1651,21 +1763,22 @@ bool LLAppViewer::initConfiguration()
if(!loadSettingsFromDirectory("Default", set_defaults))
{
std::ostringstream msg;
- msg << "Second Life could not load its default settings file. \n"
- << "The installation may be corrupted. \n";
-
- OSMessageBox(
- msg.str(),
- LLStringUtil::null,
- OSMB_OK);
-
+ msg << "Unable to load default settings file. The installation may be corrupted.";
+ OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
return false;
}
-
- // - set procedural settings
+
+ LLUI::setupPaths(); // setup paths for LLTrans based on settings files only
+ LLTrans::parseStrings("strings.xml", default_trans_args);
+
+ // - set procedural settings
+ // Note: can't use LL_PATH_PER_SL_ACCOUNT for any of these since we haven't logged in yet
gSavedSettings.setString("ClientSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global")));
+ gSavedSettings.setString("SkinningSettingsFile",
+ gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("UserSkin", "Skinning")));
+
gSavedSettings.setString("VersionChannelName", LL_CHANNEL);
#ifndef LL_RELEASE_FOR_DOWNLOAD
@@ -1685,7 +1798,7 @@ bool LLAppViewer::initConfiguration()
gSavedSettings.setBOOL("WatchdogEnabled", FALSE);
#endif
- gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _1));
+ gCrashSettings.getControl(CRASH_BEHAVIOR_SETTING)->getSignal()->connect(boost::bind(&handleCrashSubmitBehaviorChanged, _2));
// These are warnings that appear on the first experience of that condition.
// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse
@@ -1719,22 +1832,13 @@ bool LLAppViewer::initConfiguration()
if(!initParseCommandLine(clp))
{
- llwarns
- << "Error parsing command line options. Command Line options ignored."
- << llendl;
-
+ llwarns << "Error parsing command line options. Command Line options ignored." << llendl;
+
llinfos << "Command line usage:\n" << clp << llendl;
std::ostringstream msg;
- msg << "Second Life found an error parsing the command line. \n"
- << "Please see: http://wiki.secondlife.com/wiki/Client_parameters \n"
- << "Error: " << clp.getErrorMessage();
-
- OSMessageBox(
- msg.str(),
- LLStringUtil::null,
- OSMB_OK);
-
+ msg << LLTrans::getString("MBCmdLineError") << clp.getErrorMessage();
+ OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
return false;
}
@@ -1754,7 +1858,6 @@ bool LLAppViewer::initConfiguration()
// - load overrides from user_settings
loadSettingsFromDirectory("User");
-
// - apply command line settings
clp.notify();
@@ -1768,7 +1871,7 @@ bool LLAppViewer::initConfiguration()
if(clp.hasOption("help"))
{
std::ostringstream msg;
- msg << "Command line usage:\n" << clp;
+ msg << LLTrans::getString("MBCmdLineUsg") << "\n" << clp;
llinfos << msg.str() << llendl;
OSMessageBox(
@@ -1779,36 +1882,6 @@ bool LLAppViewer::initConfiguration()
return false;
}
- //////////////////////////
- // Apply settings...
- if(clp.hasOption("setdefault"))
- {
- //const LLCommandLineParser::token_vector_t& setdefault = clp.getOption("setdefault");
- //if(0x1 & setdefault.size())
- //{
- // llwarns << "Invalid '--setdefault' parameter count." << llendl;
- //}
- //else
- //{
- // LLCommandLineParser::token_vector_t::const_iterator itr = setdefault.begin();
- // for(; itr != setdefault.end(); ++itr)
- // {
- // const std::string& name = *itr;
- // const std::string& value = *(++itr);
- // LLControlVariable* c = gSettings[sGlobalSettingsName]->getControl(name);
- // if(c)
- // {
- // c->setDefault(value);
- // }
- // else
- // {
- // llwarns << "'--setdefault' specified with unknown setting: '"
- // << name << "'." << llendl;
- // }
- // }
- //}
- }
-
if(clp.hasOption("set"))
{
const LLCommandLineParser::token_vector_t& set_values = clp.getOption("set");
@@ -1823,7 +1896,7 @@ bool LLAppViewer::initConfiguration()
{
const std::string& name = *itr;
const std::string& value = *(++itr);
- LLControlVariable* c = gSettings[sGlobalSettingsName]->getControl(name);
+ LLControlVariable* c = LLControlGroup::getInstance(sGlobalSettingsName)->getControl(name);
if(c)
{
c->setValue(value, false);
@@ -1845,6 +1918,68 @@ bool LLAppViewer::initConfiguration()
gCrashOnStartup = TRUE;
}
+ if (clp.hasOption("logperformance"))
+ {
+ LLFastTimer::sLog = TRUE;
+ }
+
+ if(clp.hasOption("logmetrics"))
+ {
+ LLFastTimer::sMetricLog = TRUE ;
+ }
+
+ if (clp.hasOption("graphicslevel"))
+ {
+ const LLCommandLineParser::token_vector_t& value = clp.getOption("graphicslevel");
+ if(value.size() != 1)
+ {
+ llwarns << "Usage: -graphicslevel <0-3>" << llendl;
+ }
+ else
+ {
+ std::string detail = value.front();
+ mForceGraphicsDetail = TRUE;
+
+ switch (detail.c_str()[0])
+ {
+ case '0':
+ gSavedSettings.setU32("RenderQualityPerformance", 0);
+ break;
+ case '1':
+ gSavedSettings.setU32("RenderQualityPerformance", 1);
+ break;
+ case '2':
+ gSavedSettings.setU32("RenderQualityPerformance", 2);
+ break;
+ case '3':
+ gSavedSettings.setU32("RenderQualityPerformance", 3);
+ break;
+ default:
+ mForceGraphicsDetail = FALSE;
+ llwarns << "Usage: -graphicslevel <0-3>" << llendl;
+ break;
+ }
+ }
+ }
+
+ if (clp.hasOption("analyzeperformance"))
+ {
+ LLFastTimerView::sAnalyzePerformance = TRUE;
+ }
+
+ if (clp.hasOption("replaysession"))
+ {
+ LLAgentPilot::sReplaySession = TRUE;
+ }
+
+ if (clp.hasOption("debugsession"))
+ {
+ gDebugSession = TRUE;
+ gDebugGL = TRUE;
+
+ ll_init_fail_log(gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "test_failures.log"));
+ }
+
// Handle slurl use. NOTE: Don't let SL-55321 reappear.
// *FIX: This init code should be made more robust to prevent
@@ -1865,7 +2000,7 @@ bool LLAppViewer::initConfiguration()
if(clp.hasOption("url"))
{
std::string slurl = clp.getOption("url")[0];
- if (LLURLDispatcher::isSLURLCommand(slurl))
+ if (LLSLURL::isSLURLCommand(slurl))
{
LLStartUp::sSLURLCommand = slurl;
}
@@ -1877,9 +2012,9 @@ bool LLAppViewer::initConfiguration()
else if(clp.hasOption("slurl"))
{
std::string slurl = clp.getOption("slurl")[0];
- if(LLURLDispatcher::isSLURL(slurl))
+ if(LLSLURL::isSLURL(slurl))
{
- if (LLURLDispatcher::isSLURLCommand(slurl))
+ if (LLSLURL::isSLURLCommand(slurl))
{
LLStartUp::sSLURLCommand = slurl;
}
@@ -1894,12 +2029,12 @@ bool LLAppViewer::initConfiguration()
if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString())
{
gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
+
+ gSavedSettings.setString("SkinningSettingsFile",
+ gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("UserSkin", "Skinning")));
}
mYieldTime = gSavedSettings.getS32("YieldTime");
-
- // XUI:translate
- gSecondLife = "Second Life";
// Read skin/branding settings if specified.
//if (! gDirUtilp->getSkinDir().empty() )
@@ -1916,7 +2051,7 @@ bool LLAppViewer::initConfiguration()
#if LL_DARWIN
// Initialize apple menubar and various callbacks
- init_apple_menu(gSecondLife.c_str());
+ init_apple_menu(LLTrans::getString("SECOND_LIFE_VIEWER").c_str());
#if __ppc__
// If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further.
@@ -1924,7 +2059,7 @@ bool LLAppViewer::initConfiguration()
if(!gSysCPU.hasAltivec())
{
std::ostringstream msg;
- msg << gSecondLife << " requires a processor with AltiVec (G4 or later).";
+ msg << LLTrans::getString("MBRequiresAltiVec");
OSMessageBox(
msg.str(),
LLStringUtil::null,
@@ -1939,7 +2074,7 @@ bool LLAppViewer::initConfiguration()
// Display splash screen. Must be after above check for previous
// crash as this dialog is always frontmost.
std::ostringstream splash_msg;
- splash_msg << "Loading " << gSecondLife << "...";
+ splash_msg << "Loading " << LLTrans::getString("SECOND_LIFE") << "...";
LLSplashScreen::show();
LLSplashScreen::update(splash_msg.str());
@@ -1955,12 +2090,11 @@ bool LLAppViewer::initConfiguration()
//
// Set the name of the window
//
-#if LL_RELEASE_FOR_DOWNLOAD
- gWindowTitle = gSecondLife;
-#elif LL_DEBUG
- gWindowTitle = gSecondLife + std::string(" [DEBUG] ") + gArgs;
+ gWindowTitle = LLTrans::getString("SECOND_LIFE_VIEWER");
+#if LL_DEBUG
+ gWindowTitle += std::string(" [DEBUG] ") + gArgs;
#else
- gWindowTitle = gSecondLife + std::string(" ") + gArgs;
+ gWindowTitle += std::string(" ") + gArgs;
#endif
LLStringUtil::truncate(gWindowTitle, 255);
@@ -1997,11 +2131,7 @@ bool LLAppViewer::initConfiguration()
if (mSecondInstance)
{
std::ostringstream msg;
- msg <<
- gSecondLife << " is already running.\n"
- "\n"
- "Check your task bar for a minimized copy of the program.\n"
- "If this message persists, restart your computer.",
+ msg << LLTrans::getString("MBAlreadyRunning");
OSMessageBox(
msg.str(),
LLStringUtil::null,
@@ -2046,6 +2176,8 @@ bool LLAppViewer::initConfiguration()
gLastRunVersion = gSavedSettings.getString("LastRunVersion");
+ loadColorSettings();
+
return true; // Config was successful.
}
@@ -2053,7 +2185,7 @@ bool LLAppViewer::initConfiguration()
void LLAppViewer::checkForCrash(void)
{
-#if 1 //*REMOVE:Mani LL_SEND_CRASH_REPORTS
+#if LL_SEND_CRASH_REPORTS
//*NOTE:Mani The current state of the crash handler has the MacOSX
// sending all crash reports as freezes, in order to let
// the MacOSX CrashRepoter generate stacks before spawning the
@@ -2063,23 +2195,32 @@ void LLAppViewer::checkForCrash(void)
#if LL_DARWIN
if(gLastExecEvent != LAST_EXEC_NORMAL)
#else
- if (gLastExecEvent == LAST_EXEC_FROZE || gLastExecEvent == LAST_EXEC_OTHER_CRASH)
+ if (gLastExecEvent == LAST_EXEC_FROZE)
#endif
{
llinfos << "Last execution froze, requesting to send crash report." << llendl;
//
// Pop up a freeze or crash warning dialog
//
- std::ostringstream msg;
- msg << gSecondLife
- << " appears to have frozen or crashed on the previous run.\n"
- << "Would you like to send a crash report?";
- std::string alert;
- alert = gSecondLife;
- alert += " Alert";
- S32 choice = OSMessageBox(msg.str(),
+ S32 choice;
+ if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_ASK)
+ {
+ std::ostringstream msg;
+ msg << LLTrans::getString("MBFrozenCrashed");
+ std::string alert = LLTrans::getString("SECOND_LIFE_VIEWER") + " " + LLTrans::getString("MBAlert");
+ choice = OSMessageBox(msg.str(),
alert,
OSMB_YESNO);
+ }
+ else if(gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING) == CRASH_BEHAVIOR_NEVER_SEND)
+ {
+ choice = OSBTN_NO;
+ }
+ else
+ {
+ choice = OSBTN_YES;
+ }
+
if (OSBTN_YES == choice)
{
llinfos << "Sending crash report." << llendl;
@@ -2114,7 +2255,7 @@ bool LLAppViewer::initWindow()
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
FALSE, ignorePixelDepth);
- if (gSavedSettings.getBOOL("FullScreen"))
+ if (!gSavedSettings.getBOOL("NotFullScreen"))
{
gViewerWindow->toggleFullscreen(FALSE);
// request to go full screen... which will be delayed until login
@@ -2132,6 +2273,11 @@ bool LLAppViewer::initWindow()
// Initialize GL stuff
//
+ if (mForceGraphicsDetail)
+ {
+ LLFeatureManager::getInstance()->setGraphicsLevel(gSavedSettings.getU32("RenderQualityPerformance"), false);
+ }
+
// Set this flag in case we crash while initializing GL
gSavedSettings.setBOOL("RenderInitError", TRUE);
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
@@ -2152,9 +2298,6 @@ bool LLAppViewer::initWindow()
LLUI::sWindow = gViewerWindow->getWindow();
- LLTrans::parseStrings("strings.xml");
- LLUITrans::parseStrings("ui_strings.xml");
-
// Show watch cursor
gViewerWindow->setCursor(UI_CURSOR_WAIT);
@@ -2274,7 +2417,7 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true;
// Dump some debugging info
- LL_INFOS("SystemInfo") << gSecondLife
+ LL_INFOS("SystemInfo") << LLTrans::getString("SECOND_LIFE_VIEWER")
<< " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH
<< LL_ENDL;
@@ -2352,7 +2495,9 @@ void LLAppViewer::handleViewerCrash()
gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath();
gDebugInfo["SessionLength"] = F32(LLFrameTimer::getElapsedSeconds());
gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
- gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) getCurrentRSS() >> 10;
+ gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10;
+ gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();
+ gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall");
if(gLogoutInProgress)
{
@@ -2946,12 +3091,12 @@ void LLAppViewer::purgeCache()
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
}
-const std::string& LLAppViewer::getSecondLifeTitle() const
+std::string LLAppViewer::getSecondLifeTitle() const
{
- return gSecondLife;
+ return LLTrans::getString("SECOND_LIFE_VIEWER");
}
-const std::string& LLAppViewer::getWindowTitle() const
+std::string LLAppViewer::getWindowTitle() const
{
return gWindowTitle;
}
@@ -2985,7 +3130,7 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)
return;
}
- // Translate the message if possible
+ // *TODO: Translate the message if possible
std::string big_reason = LLAgent::sTeleportErrorMessages[mesg];
if ( big_reason.size() == 0 )
{
@@ -3121,6 +3266,7 @@ public:
///////////////////////////////////////////////////////
void LLAppViewer::idle()
{
+ LLMemType mt_idle(LLMemType::MTYPE_IDLE);
pingMainloopTimeout("Main:Idle");
// Update frame timers
@@ -3164,7 +3310,6 @@ void LLAppViewer::idle()
//
// Special case idle if still starting up
//
-
if (LLStartUp::getStartupState() < STATE_STARTED)
{
// Skip rest if idle startup returns false (essentially, no world yet)
@@ -3204,7 +3349,7 @@ void LLAppViewer::idle()
// When appropriate, update agent location to the simulator.
F32 agent_update_time = agent_update_timer.getElapsedTimeF32();
BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags());
-
+
if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND)))
{
// Send avatar and camera info
@@ -3219,7 +3364,6 @@ void LLAppViewer::idle()
// Manage statistics
//
//
-
{
// Initialize the viewer_stats_timer with an already elapsed time
// of SEND_STATS_PERIOD so that the initial stats report will
@@ -3257,9 +3401,8 @@ void LLAppViewer::idle()
gObjectList.mNumUnknownUpdates = 0;
}
}
- gFrameStats.addFrameData();
}
-
+
if (!gDisconnected)
{
LLFastTimer t(LLFastTimer::FTM_NETWORK);
@@ -3272,12 +3415,10 @@ void LLAppViewer::idle()
// floating throughout the various object lists.
//
- gFrameStats.start(LLFrameStats::IDLE_NETWORK);
stop_glerror();
idleNetwork();
stop_glerror();
- gFrameStats.start(LLFrameStats::AGENT_MISC);
// Check for away from keyboard, kick idle agents.
idle_afk_check();
@@ -3306,7 +3447,7 @@ void LLAppViewer::idle()
return;
}
- gViewerWindow->handlePerFrameHover();
+ gViewerWindow->updateUI();
///////////////////////////////////////
// Agent and camera movement
@@ -3329,7 +3470,6 @@ void LLAppViewer::idle()
{
LLFastTimer t(LLFastTimer::FTM_OBJECTLIST_UPDATE); // Actually "object update"
- gFrameStats.start(LLFrameStats::OBJECT_UPDATE);
if (!(logoutRequestSent() && hasSavedFinalSnapshot()))
{
@@ -3345,7 +3485,6 @@ void LLAppViewer::idle()
{
LLFastTimer t(LLFastTimer::FTM_CLEANUP);
- gFrameStats.start(LLFrameStats::CLEAN_DEAD);
gObjectList.cleanDeadObjects();
LLDrawable::cleanupDeadDrawables();
}
@@ -3364,7 +3503,6 @@ void LLAppViewer::idle()
//
{
- gFrameStats.start(LLFrameStats::UPDATE_EFFECTS);
LLSelectMgr::getInstance()->updateEffects();
LLHUDManager::getInstance()->cleanupEffects();
LLHUDManager::getInstance()->sendEffects();
@@ -3438,10 +3576,8 @@ void LLAppViewer::idle()
if (!gNoRender)
{
LLFastTimer t(LLFastTimer::FTM_WORLD_UPDATE);
- gFrameStats.start(LLFrameStats::UPDATE_MOVE);
gPipeline.updateMove();
- gFrameStats.start(LLFrameStats::UPDATE_PARTICLES);
LLWorld::getInstance()->updateParticles();
}
stop_glerror();
@@ -3467,7 +3603,6 @@ void LLAppViewer::idle()
}
{
- gFrameStats.start(LLFrameStats::AUDIO);
LLFastTimer t(LLFastTimer::FTM_AUDIO_UPDATE);
if (gAudiop)
@@ -3610,6 +3745,7 @@ static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
void LLAppViewer::idleNetwork()
{
+ LLMemType mt_in(LLMemType::MTYPE_IDLE_NETWORK);
pingMainloopTimeout("idleNetwork");
LLError::LLCallStacks::clear() ;
llpushcallstacks ;
@@ -3629,7 +3765,8 @@ void LLAppViewer::idleNetwork()
stop_glerror();
const S64 frame_count = gFrameCount; // U32->S64
F32 total_time = 0.0f;
- while (gMessageSystem->checkAllMessages(frame_count, gServicePump))
+
+ while (gMessageSystem->checkAllMessages(frame_count, gServicePump))
{
if (gDoDisconnect)
{
@@ -3658,6 +3795,7 @@ void LLAppViewer::idleNetwork()
break;
#endif
}
+
// Handle per-frame message system processing.
gMessageSystem->processAcks();
@@ -3696,7 +3834,7 @@ void LLAppViewer::idleNetwork()
}
}
llpushcallstacks ;
- gObjectList.mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects);
+ LLViewerStats::getInstance()->mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects);
// Retransmit unacknowledged packets.
gXferManager->retransmitUnackedPackets();
@@ -3737,7 +3875,6 @@ void LLAppViewer::disconnectViewer()
llinfos << "Disconnecting viewer!" << llendl;
// Dump our frame statistics
- gFrameStats.dump();
// Remember if we were flying
gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() );
@@ -3749,35 +3886,6 @@ void LLAppViewer::disconnectViewer()
{
gFloaterView->restoreAll();
}
-
-
- std::list<LLFloater*> floaters_to_close;
- for(LLView::child_list_const_iter_t it = gFloaterView->getChildList()->begin();
- it != gFloaterView->getChildList()->end();
- ++it)
- {
- // The following names are defined in the
- // floater_image_preview.xml
- // floater_sound_preview.xml
- // floater_animation_preview.xml
- // files.
- LLFloater* fl = static_cast<LLFloater*>(*it);
- if(fl
- && (fl->getName() == "Image Preview"
- || fl->getName() == "Sound Preview"
- || fl->getName() == "Animation Preview"
- ))
- {
- floaters_to_close.push_back(fl);
- }
- }
-
- while(!floaters_to_close.empty())
- {
- LLFloater* fl = floaters_to_close.front();
- floaters_to_close.pop_front();
- fl->close();
- }
}
if (LLSelectMgr::getInstance())
@@ -3800,6 +3908,8 @@ void LLAppViewer::disconnectViewer()
// close inventory interface, close all windows
LLInventoryView::cleanup();
+ gAgentWearables.cleanup();
+
// Also writes cached agent settings to gSavedSettings
gAgent.cleanup();
@@ -3915,6 +4025,8 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs)
void LLAppViewer::handleLoginComplete()
{
+ gViewerWindow->handleLoginComplete();
+
initMainloopTimeout("Mainloop Init");
// Store some data to DebugInfo in case of a freeze.