summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorMark Palange <palange@lindenlab.com>2008-03-14 23:21:38 +0000
committerMark Palange <palange@lindenlab.com>2008-03-14 23:21:38 +0000
commit04611efae8a3291ceba8a29dd920bdae0d404830 (patch)
tree43966566a1eeb42cf546a638310348f0585fc395 /indra
parentc0c5bdbbb90e0bcdab558ec22ea352c9d08dc078 (diff)
[NOTE: This was an erroneous commit, and was reverted in the next revision]
QAR-369 - viewer-cleanup2-7 81916 merged into release.
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/indra_constants.h2
-rw-r--r--indra/llcommon/llevent.h7
-rw-r--r--indra/llcommon/llfile.cpp11
-rw-r--r--indra/llui/llbutton.cpp5
-rw-r--r--indra/llui/llmenugl.cpp101
-rw-r--r--indra/llui/llmenugl.h7
-rw-r--r--indra/llui/llui.cpp15
-rw-r--r--indra/llui/llview.cpp65
-rw-r--r--indra/llui/llview.h22
-rw-r--r--indra/llvfs/llvfile.cpp1
-rw-r--r--indra/llvfs/llvfile.h2
-rw-r--r--indra/llxml/llcontrol.cpp816
-rw-r--r--indra/llxml/llcontrol.h210
-rw-r--r--indra/newview/app_settings/cmd_line.xml323
-rw-r--r--indra/newview/app_settings/settings.xml9604
-rw-r--r--indra/newview/app_settings/settings_crash_behavior.xml15
-rw-r--r--indra/newview/app_settings/settings_files.xml22
-rw-r--r--indra/newview/app_settings/settings_per_account.xml114
-rw-r--r--indra/newview/installers/windows/installer_template.nsi8
-rw-r--r--indra/newview/llagent.cpp18
-rw-r--r--indra/newview/llagent.h21
-rw-r--r--indra/newview/llappviewer.cpp1178
-rw-r--r--indra/newview/llappviewer.h57
-rw-r--r--indra/newview/llappviewerlinux.cpp30
-rw-r--r--indra/newview/llappviewerlinux.h3
-rw-r--r--indra/newview/llappviewermacosx.cpp43
-rw-r--r--indra/newview/llappviewermacosx.h1
-rw-r--r--indra/newview/llappviewerwin32.cpp83
-rw-r--r--indra/newview/llappviewerwin32.h9
-rw-r--r--indra/newview/llcommandlineparser.cpp535
-rw-r--r--indra/newview/llcommandlineparser.h131
-rw-r--r--indra/newview/llfeaturemanager.cpp2
-rw-r--r--indra/newview/llfirstuse.cpp19
-rw-r--r--indra/newview/llfloaterabout.cpp2
-rw-r--r--indra/newview/llfloatergroups.cpp3
-rw-r--r--indra/newview/llfloatergroups.h2
-rw-r--r--indra/newview/llfloaterpreference.cpp2
-rw-r--r--indra/newview/llfloatersettingsdebug.cpp490
-rw-r--r--indra/newview/llfloatersettingsdebug.h61
-rw-r--r--indra/newview/llnetmap.cpp8
-rw-r--r--indra/newview/llnetmap.h8
-rw-r--r--indra/newview/llpanellogin.cpp34
-rw-r--r--indra/newview/llstartup.cpp84
-rw-r--r--indra/newview/lltoolgun.cpp12
-rw-r--r--indra/newview/llvectorperfoptions.cpp99
-rw-r--r--indra/newview/llvectorperfoptions.h6
-rw-r--r--indra/newview/llvieweraudio.cpp2
-rw-r--r--indra/newview/llviewercontrol.cpp858
-rw-r--r--indra/newview/llviewercontrol.h31
-rw-r--r--indra/newview/llviewerjointmesh.cpp55
-rw-r--r--indra/newview/llviewerjointmesh.h3
-rw-r--r--indra/newview/llviewermedia.cpp5
-rw-r--r--indra/newview/llviewermenu.cpp13
-rw-r--r--indra/newview/llviewernetwork.cpp7
-rw-r--r--indra/newview/llviewernetwork.h7
-rw-r--r--indra/newview/llvoiceclient.cpp39
-rw-r--r--indra/newview/llxmlrpctransaction.cpp5
-rwxr-xr-xindra/newview/viewer_manifest.py8
58 files changed, 12805 insertions, 2519 deletions
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index a0fb086029..89b276e3b3 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -339,7 +339,7 @@ const U32 MAP_ITEM_LAND_FOR_SALE = 0x07;
const U32 MAP_ITEM_CLASSIFIED = 0x08;
// Crash reporter behavior
-const char* const CRASH_SETTINGS_FILE = "crash_settings.xml";
+const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";
const char* const CRASH_BEHAVIOR_SETTING = "CrashSubmitBehavior";
const S32 CRASH_BEHAVIOR_ASK = 0;
const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1;
diff --git a/indra/llcommon/llevent.h b/indra/llcommon/llevent.h
index 8ba883a0ee..741b40b787 100644
--- a/indra/llcommon/llevent.h
+++ b/indra/llcommon/llevent.h
@@ -185,13 +185,6 @@ protected:
LLPointer<LLEventDispatcher> mDispatcher;
};
-// Utility mixer class which fires & handles events
-class LLSimpleListenerObservable : public LLObservable, public LLSimpleListener
-{
-public:
- virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) = 0;
-};
-
class LLValueChangedEvent : public LLEvent
{
public:
diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp
index 2a18e5c64c..c44650009d 100644
--- a/indra/llcommon/llfile.cpp
+++ b/indra/llcommon/llfile.cpp
@@ -271,9 +271,11 @@ void llofstream::open(const char* _Filename, /* Flawfinder: ignore */
void llofstream::close()
{ // close the C stream
- llassert(_Filebuffer);
- if (_Filebuffer->close() == 0)
- _Myios::setstate(ios_base::failbit); /*Flawfinder: ignore*/
+ if(is_open())
+ {
+ if (_Filebuffer->close() == 0)
+ _Myios::setstate(ios_base::failbit); /*Flawfinder: ignore*/
+ }
}
llofstream::llofstream(const char *_Filename,
@@ -285,7 +287,8 @@ llofstream::llofstream(const char *_Filename,
}
llofstream::~llofstream()
-{ // destroy the object
+{
+ // destroy the object
close();
delete _Filebuffer;
}
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 2bcc89b59f..8ae6dd2ea5 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -778,9 +778,8 @@ void LLButton::setToggleState(BOOL b)
{
if( b != mToggleState )
{
- mToggleState = b;
- LLValueChangedEvent *evt = new LLValueChangedEvent(this, mToggleState);
- fireEvent(evt, "");
+ setControlValue(b); // will fire LLControlVariable callbacks (if any)
+ mToggleState = b; // may or may not be redundant
}
}
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 00b4c37bb0..8c62a10f2b 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -827,57 +827,33 @@ void LLMenuItemCallGL::setEnabledControl(LLString enabled_control, LLView *conte
// Register new listener
if (!enabled_control.empty())
{
- LLControlBase *control = context->findControl(enabled_control);
- if (control)
- {
- LLSD state = control->registerListener(this, "ENABLED");
- setEnabled(state);
- }
- else
+ LLControlVariable *control = context->findControl(enabled_control);
+ if (!control)
{
context->addBoolControl(enabled_control, getEnabled());
control = context->findControl(enabled_control);
- control->registerListener(this, "ENABLED");
+ llassert_always(control);
}
+ control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("enabled")));
+ setEnabled(control->getValue());
}
}
-void LLMenuItemCallGL::setVisibleControl(LLString enabled_control, LLView *context)
+void LLMenuItemCallGL::setVisibleControl(LLString visible_control, LLView *context)
{
// Register new listener
- if (!enabled_control.empty())
+ if (!visible_control.empty())
{
- LLControlBase *control = context->findControl(enabled_control);
- if (control)
+ LLControlVariable *control = context->findControl(visible_control);
+ if (!control)
{
- LLSD state = control->registerListener(this, "VISIBLE");
- setVisible(state);
+ context->addBoolControl(visible_control, getVisible());
+ control = context->findControl(visible_control);
+ llassert_always(control);
}
- else
- {
- context->addBoolControl(enabled_control, getEnabled());
- control = context->findControl(enabled_control);
- control->registerListener(this, "VISIBLE");
- }
- }
-}
-
-// virtual
-bool LLMenuItemCallGL::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
-{
- if (userdata.asString() == "ENABLED" && event->desc() == "value_changed")
- {
- LLSD state = event->getValue();
- setEnabled(state);
- return TRUE;
+ control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("visible")));
+ setVisible(control->getValue());
}
- if (userdata.asString() == "VISIBLE" && event->desc() == "value_changed")
- {
- LLSD state = event->getValue();
- setVisible(state);
- return TRUE;
- }
- return LLMenuItemGL::handleEvent(event, userdata);
}
// virtual
@@ -1000,44 +976,35 @@ LLMenuItemCheckGL::LLMenuItemCheckGL ( const LLString& name,
setControlName(control_name, context);
}
-void LLMenuItemCheckGL::setCheckedControl(LLString checked_control, LLView *context)
+//virtual
+void LLMenuItemCheckGL::setValue(const LLSD& value)
{
- // Register new listener
- if (!checked_control.empty())
+ mChecked = value.asBoolean();
+ if(mChecked)
{
- LLControlBase *control = context->findControl(checked_control);
- if (control)
- {
- LLSD state = control->registerListener(this, "CHECKED");
- mChecked = state;
- }
- else
- {
- context->addBoolControl(checked_control, mChecked);
- control = context->findControl(checked_control);
- control->registerListener(this, "CHECKED");
- }
+ mDrawBoolLabel = BOOLEAN_TRUE_PREFIX;
+ }
+ else
+ {
+ mDrawBoolLabel.clear();
}
}
-// virtual
-bool LLMenuItemCheckGL::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
+void LLMenuItemCheckGL::setCheckedControl(LLString checked_control, LLView *context)
{
- if (userdata.asString() == "CHECKED" && event->desc() == "value_changed")
+ // Register new listener
+ if (!checked_control.empty())
{
- LLSD state = event->getValue();
- mChecked = state;
- if(mChecked)
+ LLControlVariable *control = context->findControl(checked_control);
+ if (!control)
{
- mDrawBoolLabel = BOOLEAN_TRUE_PREFIX;
- }
- else
- {
- mDrawBoolLabel.clear();
+ context->addBoolControl(checked_control, mChecked);
+ control = context->findControl(checked_control);
+ llassert_always(control);
}
- return TRUE;
+ control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("value")));
+ mChecked = control->getValue();
}
- return LLMenuItemCallGL::handleEvent(event, userdata);
}
// virtual
@@ -1946,7 +1913,7 @@ void LLMenuGL::parseChildXML(LLXMLNodePtr child, LLView *parent, LLUICtrlFactory
{
continue;
}
- LLControlBase *control = parent->findControl(control_name);
+ LLControlVariable *control = parent->findControl(control_name);
if (!control)
{
parent->addBoolControl(control_name, FALSE);
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index e9b80e562b..33b226fd99 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -225,7 +225,7 @@ private:
// calls a user defined callback.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLMenuItemCallGL : public LLMenuItemGL
+class LLMenuItemCallGL : public LLMenuItemGL, public LLObservable
{
public:
// normal constructor
@@ -291,7 +291,6 @@ public:
//virtual void draw();
- virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
private:
menu_callback mCallback;
@@ -341,7 +340,7 @@ public:
void setCheckedControl(LLString checked_control, LLView *context);
- virtual void setValue(const LLSD& value) { mChecked = value.asBoolean(); }
+ virtual void setValue(const LLSD& value);
virtual EWidgetType getWidgetType() const { return WIDGET_TYPE_MENU_ITEM_CHECK; }
virtual LLString getWidgetTag() const { return LL_MENU_ITEM_CHECK_GL_TAG; }
@@ -350,8 +349,6 @@ public:
// called to rebuild the draw label
virtual void buildDrawLabel( void );
- virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
-
private:
check_callback mCheckCallback;
BOOL mChecked;
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index aed7893df7..1e9442805f 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1555,16 +1555,11 @@ void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3
gl_segmented_rect_3d_tex(border_scale, border_width, border_height, width_vec, height_vec, ROUNDED_RECT_TOP);
}
-class LLShowXUINamesListener: public LLSimpleListener
+bool handleShowXUINamesChanged(const LLSD& newvalue)
{
- bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
- {
- LLUI::sShowXUINames = (BOOL) event->getValue().asBoolean();
- return true;
- }
-};
-static LLShowXUINamesListener show_xui_names_listener;
-
+ LLUI::sShowXUINames = newvalue.asBoolean();
+ return true;
+}
void LLUI::initClass(LLControlGroup* config,
LLControlGroup* colors,
@@ -1584,7 +1579,7 @@ void LLUI::initClass(LLControlGroup* config,
LLFontGL::sShadowColor = colors->getColor("ColorDropShadow");
LLUI::sShowXUINames = LLUI::sConfigGroup->getBOOL("ShowXUINames");
- LLUI::sConfigGroup->getControl("ShowXUINames")->addListener(&show_xui_names_listener);
+ LLUI::sConfigGroup->getControl("ShowXUINames")->getSignal()->connect(boost::bind(&handleShowXUINamesChanged, _1));
}
void LLUI::cleanupClass()
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 0a37c03ac5..269796e5de 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -2426,16 +2426,7 @@ LLSimpleListener* LLView::getListenerByName(const LLString& callback_name)
return callback;
}
-void LLView::addListenerToControl(LLEventDispatcher *dispatcher, const LLString& name, LLSD filter, LLSD userdata)
-{
- LLSimpleListener* listener = getListenerByName(name);
- if (listener)
- {
- dispatcher->addListener(listener, filter, userdata);
- }
-}
-
-LLControlBase *LLView::findControl(LLString name)
+LLControlVariable *LLView::findControl(LLString name)
{
control_map_t::iterator itor = mFloaterControls.find(name);
if (itor != mFloaterControls.end())
@@ -2791,9 +2782,15 @@ LLFontGL::StyleFlags LLView::selectFontStyle(LLXMLNodePtr node)
return gl_font_style;
}
-void LLView::setControlValue(const LLSD& value)
+bool LLView::setControlValue(const LLSD& value)
{
- LLUI::sConfigGroup->setValue(getControlName(), value);
+ LLString ctrlname = getControlName();
+ if (!ctrlname.empty())
+ {
+ LLUI::sConfigGroup->setValue(ctrlname, value);
+ return true;
+ }
+ return false;
}
//virtual
@@ -2804,43 +2801,57 @@ void LLView::setControlName(const LLString& control_name, LLView *context)
context = this;
}
- // Unregister from existing listeners
if (!mControlName.empty())
{
- clearDispatchers();
+ llwarns << "setControlName called twice on same control!" << llendl;
+ mControlConnection.disconnect(); // disconnect current signal
+ mControlName.clear();
}
-
+
// Register new listener
if (!control_name.empty())
{
- LLControlBase *control = context->findControl(control_name);
+ LLControlVariable *control = context->findControl(control_name);
if (control)
{
mControlName = control_name;
- LLSD state = control->registerListener(this, "DEFAULT");
- setValue(state);
+ mControlConnection = control->getSignal()->connect(boost::bind(&controlListener, _1, getHandle(), std::string("value")));
+ setValue(control->getValue());
}
}
}
-// virtual
-bool LLView::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
+// static
+bool LLView::controlListener(const LLSD& newvalue, LLHandle<LLView> handle, std::string type)
{
- if (userdata.asString() == "DEFAULT" && event->desc() == "value_changed")
+ LLView* view = handle.get();
+ if (view)
{
- LLSD state = event->getValue();
- setValue(state);
- return TRUE;
+ if (type == "value")
+ {
+ view->setValue(newvalue);
+ return true;
+ }
+ else if (type == "enabled")
+ {
+ view->setEnabled(newvalue.asBoolean());
+ return true;
+ }
+ else if (type == "visible")
+ {
+ view->setVisible(newvalue.asBoolean());
+ return true;
+ }
}
- return FALSE;
+ return false;
}
void LLView::addBoolControl(LLString name, bool initial_value)
{
- mFloaterControls[name] = new LLControl(name, TYPE_BOOLEAN, initial_value, "Internal floater control");
+ mFloaterControls[name] = new LLControlVariable(name, TYPE_BOOLEAN, initial_value, "Internal floater control");
}
-LLControlBase *LLView::getControl(LLString name)
+LLControlVariable *LLView::getControl(LLString name)
{
control_map_t::iterator itor = mFloaterControls.find(name);
if (itor != mFloaterControls.end())
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index c8556c7edc..24a5eb4f89 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -65,7 +65,6 @@ const BOOL NOT_MOUSE_OPAQUE = FALSE;
const U32 GL_NAME_UI_RESERVED = 2;
-
/*
// virtual functions defined in LLView:
@@ -150,7 +149,7 @@ virtual BOOL handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent);
*
*/
-class LLView : public LLMouseHandler, public LLMortician, public LLSimpleListenerObservable
+class LLView : public LLMouseHandler, public LLMortician
{
public:
@@ -294,7 +293,6 @@ public:
LLHandle<LLView> getHandle() { mHandle.bind(this); return mHandle; }
-
U32 getFollows() const { return mReshapeFlags; }
BOOL followsLeft() const { return mReshapeFlags & FOLLOWS_LEFT; }
BOOL followsRight() const { return mReshapeFlags & FOLLOWS_RIGHT; }
@@ -393,13 +391,13 @@ public:
void addListenerToControl(LLEventDispatcher *observer, const LLString& name, LLSD filter, LLSD userdata);
void addBoolControl(LLString name, bool initial_value);
- LLControlBase *getControl(LLString name);
- LLControlBase *findControl(LLString name);
+ LLControlVariable *getControl(LLString name);
+ LLControlVariable *findControl(LLString name);
- void setControlValue(const LLSD& value);
+ bool setControlValue(const LLSD& value);
virtual void setControlName(const LLString& control, LLView *context);
virtual LLString getControlName() const { return mControlName; }
- virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
+// virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
virtual void setValue(const LLSD& value);
virtual LLSD getValue() const;
@@ -494,11 +492,12 @@ protected:
LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask);
LLView* childrenHandleRightMouseUp(S32 x, S32 y, MASK mask);
- typedef std::map<LLString, LLControlBase*> control_map_t;
+ static bool controlListener(const LLSD& newvalue, LLHandle<LLView> handle, std::string type);
+
+ typedef std::map<LLString, LLControlVariable*> control_map_t;
control_map_t mFloaterControls;
virtual LLView* getChildByName(const LLString& name, BOOL recurse = FALSE) const;
-
private:
LLView* mParentView;
child_list_t mChildList;
@@ -537,9 +536,8 @@ private:
dispatch_list_t mDispatchList;
LLString mControlName;
-
-
-// Just debugging stuff? We should try to hide anything that's not. -MG
+ boost::signals::connection mControlConnection;
+
public:
static BOOL sDebugRects; // Draw debug rects behind everything.
static BOOL sDebugKeys;
diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp
index b25ec4a86e..bd4dfc2d78 100644
--- a/indra/llvfs/llvfile.cpp
+++ b/indra/llvfs/llvfile.cpp
@@ -45,7 +45,6 @@ const S32 LLVFile::APPEND = 0x00000006; // 0x00000004 & LLVFile::WRITE
//----------------------------------------------------------------------------
LLVFSThread* LLVFile::sVFSThread = NULL;
BOOL LLVFile::sAllocdVFSThread = FALSE;
-BOOL LLVFile::ALLOW_ASYNC = TRUE;
//----------------------------------------------------------------------------
//============================================================================
diff --git a/indra/llvfs/llvfile.h b/indra/llvfs/llvfile.h
index 3d81483308..cd4fc59174 100644
--- a/indra/llvfs/llvfile.h
+++ b/indra/llvfs/llvfile.h
@@ -78,8 +78,6 @@ public:
static const S32 WRITE;
static const S32 READ_WRITE;
static const S32 APPEND;
-
- static BOOL ALLOW_ASYNC;
protected:
LLAssetType::EType mFileType;
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index 4ad44f455f..9de426fc03 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -57,19 +57,9 @@
#endif
//this defines the current version of the settings file
-U32 LLControlBase::sMaxControlNameLength = 0;
-
-//These lists are used to store the ID's of registered event listeners.
-std::list<S32> LLControlBase::mFreeIDs;
-std::list<S32> LLControlBase::mUsedIDs;
-
-S32 LLControlBase::mTopID;
-
-std::set<LLControlBase*> LLControlBase::mChangedControls;
-
const S32 CURRENT_VERSION = 101;
-BOOL LLControl::llsd_compare(const LLSD& a, const LLSD & b)
+BOOL LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)
{
switch (mType)
{
@@ -101,58 +91,154 @@ BOOL LLControl::llsd_compare(const LLSD& a, const LLSD & b)
return FALSE;
}
-LLControlBase::~LLControlBase()
+LLControlVariable::LLControlVariable(const LLString& name, eControlType type,
+ LLSD initial, const LLString& comment,
+ BOOL persist)
+ : mName(name),
+ mComment(comment),
+ mType(type),
+ mPersist(persist)
+{
+ if (mPersist && mComment.empty())
+ {
+ llerrs << "Must supply a comment for control " << mName << llendl;
+ }
+ //Push back versus setValue'ing here, since we don't want to call a signal yet
+ mValues.push_back(initial);
+}
+
+
+
+LLControlVariable::~LLControlVariable()
+{
+}
+
+void LLControlVariable::setValue(const LLSD& value, bool saved_value)
{
+ bool value_changed = llsd_compare(getValue(), value) == FALSE;
+ if(saved_value)
+ {
+ // If we're going to save this value, return to default but don't fire
+ resetToDefault(false);
+ if (llsd_compare(mValues.back(), value) == FALSE)
+ {
+ mValues.push_back(value);
+ }
+ }
+ else
+ {
+ // This is a unsaved value. Its needs to reside at
+ // mValues[2] (or greater). It must not affect
+ // the result of getSaveValue()
+ if (llsd_compare(mValues.back(), value) == FALSE)
+ {
+ while(mValues.size() > 2)
+ {
+ // Remove any unsaved values.
+ mValues.pop_back();
+ }
+
+ if(mValues.size() < 2)
+ {
+ // Add the default to the 'save' value.
+ mValues.push_back(mValues[0]);
+ }
+
+ // Add the 'un-save' value.
+ mValues.push_back(value);
+ }
+ }
+
+ if(value_changed)
+ {
+ mSignal(value);
+ }
}
-// virtual
-void LLControlBase::resetToDefault()
+void LLControlVariable::resetToDefault(bool fire_signal)
{
+ //The first setting is always the default
+ //Pop to it and fire off the listener
+ while(mValues.size() > 1) mValues.pop_back();
+ if(fire_signal) firePropertyChanged();
+}
+
+bool LLControlVariable::isSaveValueDefault()
+{
+ return (mValues.size() == 1)
+ || ((mValues.size() > 1) && llsd_compare(mValues[1], mValues[0]));
}
-LLControlGroup::LLControlGroup(): mNameTable()
+LLSD LLControlVariable::getSaveValue() const
{
- //mFreeStringOffset = 0;
+ //The first level of the stack is default
+ //We assume that the second level is user preferences that should be saved
+ if(mValues.size() > 1) return mValues[1];
+ return mValues[0];
}
-LLControlGroup::~LLControlGroup()
+LLControlVariable* LLControlGroup::getControl(const LLString& name)
+{
+ ctrl_name_table_t::iterator iter = mNameTable.find(name);
+ return iter == mNameTable.end() ? NULL : iter->second;
+}
+
+
+////////////////////////////////////////////////////////////////////////////
+
+LLControlGroup::LLControlGroup()
{
+ mTypeString[TYPE_U32] = "U32";
+ mTypeString[TYPE_S32] = "S32";
+ mTypeString[TYPE_F32] = "F32";
+ mTypeString[TYPE_BOOLEAN] = "Boolean";
+ mTypeString[TYPE_STRING] = "String";
+ mTypeString[TYPE_VEC3] = "Vector3";
+ mTypeString[TYPE_VEC3D] = "Vector3D";
+ mTypeString[TYPE_RECT] = "Rect";
+ mTypeString[TYPE_COL4] = "Color4";
+ mTypeString[TYPE_COL3] = "Color3";
+ mTypeString[TYPE_COL4U] = "Color4u";
+ mTypeString[TYPE_LLSD] = "LLSD";
}
-LLSD LLControlBase::registerListener(LLSimpleListenerObservable *listener, LLSD userdata)
+LLControlGroup::~LLControlGroup()
{
- // Symmetric listener relationship
- addListener(listener, "", userdata);
- listener->addListener(this, "", userdata);
- return getValue();
+ cleanup();
}
void LLControlGroup::cleanup()
{
+ for_each(mNameTable.begin(), mNameTable.end(), DeletePairedPointer());
mNameTable.clear();
}
-LLControlBase* LLControlGroup::getControl(const LLString& name)
+eControlType LLControlGroup::typeStringToEnum(const LLString& typestr)
{
- ctrl_name_table_t::iterator iter = mNameTable.find(name);
- return iter == mNameTable.end() ? NULL : (LLControlBase*)iter->second;
+ for(int i = 0; i < (int)TYPE_COUNT; ++i)
+ {
+ if(mTypeString[i] == typestr) return (eControlType)i;
+ }
+ return (eControlType)-1;
+}
+
+LLString LLControlGroup::typeEnumToString(eControlType typeenum)
+{
+ return mTypeString[typeenum];
}
BOOL LLControlGroup::declareControl(const LLString& name, eControlType type, const LLSD initial_val, const LLString& comment, BOOL persist)
{
- if(!mNameTable[name])
- {
- // if not, create the control and add it to the name table
- LLControl* control = new LLControl(name, type, initial_val, comment, persist);
- mNameTable[name] = control;
- return TRUE;
- }
- else
+ if(mNameTable.find(name) != mNameTable.end())
{
llwarns << "LLControlGroup::declareControl: Control named " << name << " already exists." << llendl;
- mNameTable.erase(name);
- return FALSE;
+ mNameTable[name]->setValue(initial_val);
+ return TRUE;
}
+ // if not, create the control and add it to the name table
+ LLControlVariable* control = new LLControlVariable(name, type, initial_val, comment, persist);
+ mNameTable[name] = control;
+ return TRUE;
}
BOOL LLControlGroup::declareU32(const LLString& name, const U32 initial_val, const LLString& comment, BOOL persist)
@@ -210,19 +296,14 @@ BOOL LLControlGroup::declareColor3(const LLString& name, const LLColor3 &initial
return declareControl(name, TYPE_COL3, initial_val.getValue(), comment, persist);
}
-LLSD LLControlGroup::registerListener(const LLString& name, LLSimpleListenerObservable *listener)
+BOOL LLControlGroup::declareLLSD(const LLString& name, const LLSD &initial_val, const LLString& comment, BOOL persist )
{
- LLControlBase *control = getControl(name);
- if (control)
- {
- return control->registerListener(listener);
- }
- return LLSD();
+ return declareControl(name, TYPE_LLSD, initial_val, comment, persist);
}
BOOL LLControlGroup::getBOOL(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_BOOLEAN))
return control->get().asBoolean();
@@ -235,7 +316,7 @@ BOOL LLControlGroup::getBOOL(const LLString& name)
S32 LLControlGroup::getS32(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_S32))
return control->get().asInteger();
@@ -248,7 +329,7 @@ S32 LLControlGroup::getS32(const LLString& name)
U32 LLControlGroup::getU32(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_U32))
return control->get().asInteger();
@@ -261,7 +342,7 @@ U32 LLControlGroup::getU32(const LLString& name)
F32 LLControlGroup::getF32(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_F32))
return (F32) control->get().asReal();
@@ -274,7 +355,7 @@ F32 LLControlGroup::getF32(const LLString& name)
LLString LLControlGroup::findString(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_STRING))
return control->get().asString();
@@ -283,7 +364,7 @@ LLString LLControlGroup::findString(const LLString& name)
LLString LLControlGroup::getString(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_STRING))
return control->get().asString();
@@ -309,7 +390,7 @@ LLString LLControlGroup::getText(const LLString& name)
LLVector3 LLControlGroup::getVector3(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_VEC3))
return control->get();
@@ -322,7 +403,7 @@ LLVector3 LLControlGroup::getVector3(const LLString& name)
LLVector3d LLControlGroup::getVector3d(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_VEC3D))
return control->get();
@@ -335,7 +416,7 @@ LLVector3d LLControlGroup::getVector3d(const LLString& name)
LLRect LLControlGroup::getRect(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_RECT))
return control->get();
@@ -353,7 +434,7 @@ LLColor4 LLControlGroup::getColor(const LLString& name)
if (i != mNameTable.end())
{
- LLControlBase* control = i->second;
+ LLControlVariable* control = i->second;
switch(control->mType)
{
@@ -381,7 +462,7 @@ LLColor4 LLControlGroup::getColor(const LLString& name)
LLColor4U LLControlGroup::getColor4U(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_COL4U))
return control->get();
@@ -394,7 +475,7 @@ LLColor4U LLControlGroup::getColor4U(const LLString& name)
LLColor4 LLControlGroup::getColor4(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_COL4))
return control->get();
@@ -407,7 +488,7 @@ LLColor4 LLControlGroup::getColor4(const LLString& name)
LLColor3 LLControlGroup::getColor3(const LLString& name)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_COL3))
return control->get();
@@ -418,6 +499,16 @@ LLColor3 LLControlGroup::getColor3(const LLString& name)
}
}
+LLSD LLControlGroup::getLLSD(const LLString& name)
+{
+ LLControlVariable* control = getControl(name);
+
+ if (control && control->isType(TYPE_LLSD))
+ return control->getValue();
+ CONTROL_ERRS << "Invalid LLSD control " << name << llendl;
+ return LLSD();
+}
+
BOOL LLControlGroup::controlExists(const LLString& name)
{
ctrl_name_table_t::iterator iter = mNameTable.find(name);
@@ -430,7 +521,7 @@ BOOL LLControlGroup::controlExists(const LLString& name)
void LLControlGroup::setBOOL(const LLString& name, BOOL val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_BOOLEAN))
{
@@ -445,7 +536,7 @@ void LLControlGroup::setBOOL(const LLString& name, BOOL val)
void LLControlGroup::setS32(const LLString& name, S32 val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_S32))
{
@@ -460,7 +551,7 @@ void LLControlGroup::setS32(const LLString& name, S32 val)
void LLControlGroup::setF32(const LLString& name, F32 val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_F32))
{
@@ -475,7 +566,7 @@ void LLControlGroup::setF32(const LLString& name, F32 val)
void LLControlGroup::setU32(const LLString& name, U32 val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_U32))
{
@@ -490,7 +581,7 @@ void LLControlGroup::setU32(const LLString& name, U32 val)
void LLControlGroup::setString(const LLString& name, const LLString &val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_STRING))
{
@@ -505,7 +596,7 @@ void LLControlGroup::setString(const LLString& name, const LLString &val)
void LLControlGroup::setVector3(const LLString& name, const LLVector3 &val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_VEC3))
{
@@ -519,7 +610,7 @@ void LLControlGroup::setVector3(const LLString& name, const LLVector3 &val)
void LLControlGroup::setVector3d(const LLString& name, const LLVector3d &val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_VEC3D))
{
@@ -533,7 +624,7 @@ void LLControlGroup::setVector3d(const LLString& name, const LLVector3d &val)
void LLControlGroup::setRect(const LLString& name, const LLRect &val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_RECT))
{
@@ -547,7 +638,7 @@ void LLControlGroup::setRect(const LLString& name, const LLRect &val)
void LLControlGroup::setColor4U(const LLString& name, const LLColor4U &val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_COL4U))
{
@@ -561,7 +652,7 @@ void LLControlGroup::setColor4U(const LLString& name, const LLColor4U &val)
void LLControlGroup::setColor4(const LLString& name, const LLColor4 &val)
{
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control && control->isType(TYPE_COL4))
{
@@ -573,6 +664,20 @@ void LLControlGroup::setColor4(const LLString& name, const LLColor4 &val)
}
}
+void LLControlGroup::setLLSD(const LLString& name, const LLSD& val)
+{
+ LLControlVariable* control = getControl(name);
+
+ if (control && control->isType(TYPE_LLSD))
+ {
+ setValue(name, val);
+ }
+ else
+ {
+ CONTROL_ERRS << "Invalid LLSD control " << name << llendl;
+ }
+}
+
void LLControlGroup::setValue(const LLString& name, const LLSD& val)
{
if (name.empty())
@@ -580,7 +685,7 @@ void LLControlGroup::setValue(const LLString& name, const LLSD& val)
return;
}
- LLControlBase* control = getControl(name);
+ LLControlVariable* control = getControl(name);
if (control)
{
@@ -596,238 +701,8 @@ void LLControlGroup::setValue(const LLString& name, const LLSD& val)
// Load and save
//---------------------------------------------------------------
-U32 LLControlGroup::loadFromFileLegacy(const LLString& filename, BOOL require_declaration, eControlType declare_as)
-{
- U32 item = 0;
- U32 validitems = 0;
- llifstream file;
- S32 version;
-
- file.open(filename.c_str()); /*Flawfinder: ignore*/
-
- if (!file)
- {
- llinfos << "LLControlGroup::loadFromFile unable to open." << llendl;
- return 0;
- }
-
- // Check file version
- LLString name;
- file >> name;
- file >> version;
- if (name != "version" || version != CURRENT_VERSION)
- {
- llinfos << filename << " does not appear to be a version " << CURRENT_VERSION << " controls file" << llendl;
- return 0;
- }
-
- while (!file.eof())
- {
- file >> name;
-
- if (name.empty())
- {
- continue;
- }
-
- if (name.substr(0,2) == "//")
- {
- // This is a comment.
- char buffer[MAX_STRING]; /*Flawfinder: ignore*/
- file.getline(buffer, MAX_STRING);
- continue;
- }
-
- BOOL declared = mNameTable.find(name) != mNameTable.end();
-
- if (require_declaration && !declared)
- {
- // Declaration required, but this name not declared.
- // Complain about non-empty names.
- if (!name.empty())
- {
- //read in to end of line
- char buffer[MAX_STRING]; /*Flawfinder: ignore*/
- file.getline(buffer, MAX_STRING);
- llwarns << "LLControlGroup::loadFromFile() : Trying to set \"" << name << "\", setting doesn't exist." << llendl;
- }
- continue;
- }
-
- // Got an item. Load it up.
- item++;
-
- // If not declared, assume it's a string
- if (!declared)
- {
- switch(declare_as)
- {
- case TYPE_COL4:
- declareColor4(name, LLColor4::white, LLString::null, NO_PERSIST);
- break;
- case TYPE_COL4U:
- declareColor4U(name, LLColor4U::white, LLString::null, NO_PERSIST);
- break;
- case TYPE_STRING:
- default:
- declareString(name, LLString::null, LLString::null, NO_PERSIST);
- break;
- }
- }
-
- // Control name has been declared in code.
- LLControlBase *control = getControl(name);
-
- llassert(control);
-
- mLoadedSettings.insert(name);
-
- switch(control->mType)
- {
- case TYPE_F32:
- {
- F32 initial;
-
- file >> initial;
-
- control->set(initial);
- validitems++;
- }
- break;
- case TYPE_S32:
- {
- S32 initial;
-
- file >> initial;
-
- control->set(initial);
- validitems++;
- }
- break;
- case TYPE_U32:
- {
- U32 initial;
-
- file >> initial;
- control->set((LLSD::Integer) initial);
- validitems++;
- }
- break;
- case TYPE_BOOLEAN:
- {
- char boolstring[256]; /*Flawfinder: ignore*/
- BOOL valid = FALSE;
- BOOL initial = FALSE;
-
- file >> boolstring;
- if (!strcmp("TRUE", boolstring))
- {
- initial = TRUE;
- valid = TRUE;
- }
- else if (!strcmp("FALSE", boolstring))
- {
- initial = FALSE;
- valid = TRUE;
- }
-
- if (valid)
- {
- control->set(initial);
- }
- else
- {
- llinfos << filename << "Item " << item << ": Invalid BOOL control " << name << ", " << boolstring << llendl;
- }
-
- validitems++;
- }
- break;
- case TYPE_STRING:
- {
- LLString string;
-
- file >> string;
-
- control->set(string);
- validitems++;
- }
- break;
- case TYPE_VEC3:
- {
- F32 x, y, z;
-
- file >> x >> y >> z;
-
- LLVector3 vector(x, y, z);
-
- control->set(vector.getValue());
- validitems++;
- }
- break;
- case TYPE_VEC3D:
- {
- F64 x, y, z;
-
- file >> x >> y >> z;
-
- LLVector3d vector(x, y, z);
-
- control->set(vector.getValue());
- validitems++;
- }
- break;
- case TYPE_RECT:
- {
- S32 left, bottom, width, height;
-
- file >> left >> bottom >> width >> height;
-
- LLRect rect;
- rect.setOriginAndSize(left, bottom, width, height);
-
- control->set(rect.getValue());
- validitems++;
- }
- break;
- case TYPE_COL4U:
- {
- S32 red, green, blue, alpha;
- LLColor4U color;
- file >> red >> green >> blue >> alpha;
- color.setVec(red, green, blue, alpha);
- control->set(color.getValue());
- validitems++;
- }
- break;
- case TYPE_COL4:
- {
- LLColor4 color;
- file >> color.mV[VRED] >> color.mV[VGREEN]
- >> color.mV[VBLUE] >> color.mV[VALPHA];
- control->set(color.getValue());
- validitems++;
- }
- break;
- case TYPE_COL3:
- {
- LLColor3 color;
- file >> color.mV[VRED] >> color.mV[VGREEN]
- >> color.mV[VBLUE];
- control->set(color.getValue());
- validitems++;
- }
- break;
- }
- }
-
- file.close();
-
- return validitems;
-}
-
// Returns number of controls loaded, so 0 if failure
-U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declaration, eControlType declare_as)
+U32 LLControlGroup::loadFromFileLegacy(const LLString& filename, BOOL require_declaration, eControlType declare_as)
{
LLString name;
@@ -901,11 +776,9 @@ U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declarat
}
// Control name has been declared in code.
- LLControlBase *control = getControl(name);
+ LLControlVariable *control = getControl(name);
llassert(control);
-
- mLoadedSettings.insert(name);
switch(control->mType)
{
@@ -1019,59 +892,43 @@ U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declarat
LLVector3 color;
child_nodep->getAttributeVector3("value", color);
- control->set(LLColor3(color.mV).getValue());
+ control->set(LLColor3(color.mV).getValue());
validitems++;
}
break;
- }
+ default:
+ break;
+
+ }
+
child_nodep = rootp->getNextChild();
}
return validitems;
}
-struct compare_controls
-{
- bool operator() (const LLControlBase* const a, const LLControlBase* const b) const
- {
- return a->getName() < b->getName();
- }
-};
-
U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)
{
- const char ENDL = '\n';
-
- llinfos << "Saving settings to file: " << filename << llendl;
-
- // place the objects in a temporary container that enforces a sort
- // order to ease manual editing of the file
-
- typedef std::set< LLControlBase*, compare_controls > control_list_t;
- control_list_t controls;
-
+ LLSD settings;
+ int num_saved = 0;
for (ctrl_name_table_t::iterator iter = mNameTable.begin();
iter != mNameTable.end(); iter++)
{
- LLString name = iter->first;
- if (name.empty())
- {
- CONTROL_ERRS << "Control with no name found!!!" << llendl;
- break;
- }
-
- LLControlBase* control = (LLControlBase *)iter->second;
+ LLControlVariable* control = iter->second;
if (!control)
{
- llwarns << "Tried to save invalid control: " << name << llendl;
+ llwarns << "Tried to save invalid control: " << iter->first << llendl;
}
- if( control && control->mPersist )
+ if( control && control->isPersisted() )
{
- if (!(nondefault_only && (control->mIsDefault)))
+ if (!(nondefault_only && (control->isSaveValueDefault())))
{
- controls.insert( control );
+ settings[iter->first]["Type"] = typeEnumToString(control->type());
+ settings[iter->first]["Comment"] = control->getComment();
+ settings[iter->first]["Value"] = control->getSaveValue();
+ ++num_saved;
}
else
{
@@ -1080,156 +937,58 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)
}
}
}
-
llofstream file;
- file.open(filename.c_str()); /*Flawfinder: ignore*/
-
- if (!file.is_open())
+ file.open(filename.c_str());
+ if (file.is_open())
{
- // This is a warning because sometime we want to use settings files which can't be written...
- llwarns << "LLControlGroup::saveToFile unable to open file for writing" << llendl;
- return 0;
+ LLSDSerialize::toPrettyXML(settings, file);
+ file.close();
+ llinfos << "Saved to " << filename << llendl;
}
-
- // Write file version
- file << "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n";
- file << "<settings version = \"" << CURRENT_VERSION << "\">\n";
- for (control_list_t::iterator iter = controls.begin();
- iter != controls.end(); ++iter)
+ else
{
- LLControlBase* control = *iter;
- file << "\t<!--" << control->comment() << "-->" << ENDL;
- LLString name = control->getName();
- switch (control->type())
- {
- case TYPE_U32:
- {
- file << "\t<" << name << " value=\"" << (U32) control->get().asInteger() << "\"/>\n";
- break;
- }
- case TYPE_S32:
- {
- file << "\t<" << name << " value=\"" << (S32) control->get().asInteger() << "\"/>\n";
- break;
- }
- case TYPE_F32:
- {
- file << "\t<" << name << " value=\"" << (F32) control->get().asReal() << "\"/>\n";
- break;
- }
- case TYPE_VEC3:
- {
- LLVector3 vector(control->get());
- file << "\t<" << name << " value=\"" << vector.mV[VX] << " " << vector.mV[VY] << " " << vector.mV[VZ] << "\"/>\n";
- break;
- }
- case TYPE_VEC3D:
- {
- LLVector3d vector(control->get());
- file << "\t<" << name << " value=\"" << vector.mdV[VX] << " " << vector.mdV[VY] << " " << vector.mdV[VZ] << "\"/>\n";
- break;
- }
- case TYPE_RECT:
- {
- LLRect rect(control->get());
- file << "\t<" << name << " value=\"" << rect.mLeft << " " << rect.mBottom << " " << rect.getWidth() << " " << rect.getHeight() << "\"/>\n";
- break;
- }
- case TYPE_COL4:
- {
- LLColor4 color(control->get());
- file << "\t<" << name << " value=\"" << color.mV[VRED] << ", " << color.mV[VGREEN] << ", " << color.mV[VBLUE] << ", " << color.mV[VALPHA] << "\"/>\n";
- break;
- }
- case TYPE_COL3:
- {
- LLColor3 color(control->get());
- file << "\t<" << name << " value=\"" << color.mV[VRED] << ", " << color.mV[VGREEN] << ", " << color.mV[VBLUE] << "\"/>\n";
- break;
- }
- case TYPE_BOOLEAN:
- {
- file << "\t<" << name << " value=\"" << (control->get().asBoolean() ? "TRUE" : "FALSE") << "\"/>\n";
- break;
- }
- case TYPE_STRING:
- {
- file << "\t<" << name << " value=\"" << LLSDXMLFormatter::escapeString(control->get().asString()) << "\"/>\n";
- break;
- }
- default:
- {
- CONTROL_ERRS << "LLControlGroup::saveToFile - unknown control type!" << llendl;
- break;
- }
- }
-
- // Debug spam
- // llinfos << name << " " << control->getValue().asString() << llendl;
- }// next
-
- file << "</settings>\n";
- file.close();
-
- return controls.size();
+ // This is a warning because sometime we want to use settings files which can't be written...
+ llwarns << "Unable to open settings file: " << filename << llendl;
+ return 0;
+ }
+ return num_saved;
}
-void LLControlGroup::applyOverrides(const std::map<std::string, std::string>& overrides)
+U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declaration, eControlType declare_as)
{
- for (std::map<std::string, std::string>::const_iterator iter = overrides.begin();
- iter != overrides.end(); ++iter)
+ LLString name;
+ LLSD settings;
+ LLSD control_map;
+ llifstream infile;
+ infile.open(filename.c_str());
+ if(!infile.is_open())
{
- const std::string& command = iter->first;
- const std::string& value = iter->second;
- LLControlBase* control = (LLControlBase *)mNameTable[command];
- if (control)
- {
- switch(control->mType)
- {
- case TYPE_U32:
- control->set((LLSD::Integer)atof(value.c_str()));
- break;
- case TYPE_S32:
- control->set((S32)atof(value.c_str()));
- break;
- case TYPE_F32:
- control->set((F32)atof(value.c_str()));
- break;
- case TYPE_BOOLEAN:
- if (!LLString::compareInsensitive(value.c_str(), "TRUE"))
- {
- control->set(TRUE);
- }
- else if (!LLString::compareInsensitive(value.c_str(), "FALSE"))
- {
- control->set(FALSE);
- }
- else
- {
- control->set((BOOL)atof(value.c_str()));
- }
- break;
- case TYPE_STRING:
- control->set(value);
- break;
-// // *FIX: implement this given time and need.
-// case TYPE_UUID:
-// break;
- // we don't support command line overrides of vec3 or col4
- // yet - requires parsing of multiple values
- case TYPE_VEC3:
- case TYPE_VEC3D:
- case TYPE_COL4:
- case TYPE_COL3:
- default:
- break;
- }
- }
- else
- {
- llinfos << "There is no control variable " << command << llendl;
- }
+ llwarns << "Cannot find file " << filename << " to load." << llendl;
+ return 0;
+ }
+ S32 ret = LLSDSerialize::fromXML(settings, infile);
+ if (ret <= 0)
+ {
+ infile.close();
+ llwarns << "Unable to open LLSD control file " << filename << ". Trying Legacy Method." << llendl;
+ return loadFromFileLegacy(filename, require_declaration, declare_as);
+ }
+
+ U32 validitems = 0;
+ int persist = 1;
+ for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr)
+ {
+ name = (*itr).first;
+ control_map = (*itr).second;
+
+ if(control_map.has("Persist")) persist = control_map["Persist"].asInteger();
+
+ declareControl(name, typeStringToEnum(control_map["Type"].asString()), control_map["Value"], control_map["Comment"].asString(), persist);
+
+ ++validitems;
}
+
+ return validitems;
}
void LLControlGroup::resetToDefaults()
@@ -1239,11 +998,20 @@ void LLControlGroup::resetToDefaults()
control_iter != mNameTable.end();
++control_iter)
{
- LLControlBase* control = (*control_iter).second;
+ LLControlVariable* control = (*control_iter).second;
control->resetToDefault();
}
}
+void LLControlGroup::applyToAll(ApplyFunctor* func)
+{
+ for (ctrl_name_table_t::iterator iter = mNameTable.begin();
+ iter != mNameTable.end(); iter++)
+ {
+ func->apply(iter->first, iter->second);
+ }
+}
+
//============================================================================
// First-use
@@ -1264,7 +1032,7 @@ static LLString get_warn_name(const LLString& name)
void LLControlGroup::addWarning(const LLString& name)
{
LLString warnname = get_warn_name(name);
- if(!mNameTable[warnname])
+ if(mNameTable.find(warnname) == mNameTable.end())
{
LLString comment = LLString("Enables ") + name + LLString(" warning dialog");
declareBOOL(warnname, TRUE, comment);
@@ -1293,91 +1061,6 @@ void LLControlGroup::resetWarnings()
}
}
-
-
-//=============================================================================
-// Listener ID generator/management
-
-void LLControlBase::releaseListenerID(S32 id)
-{
- mFreeIDs.push_back(id);
-}
-
-S32 LLControlBase::allocateListenerID()
-{
- if(mFreeIDs.size() == 0)
- { //Out of IDs so generate some new ones.
- for(int t=0;t<32;t++)
- {
- mFreeIDs.push_back(mTopID++);
- }
- }
- S32 rtn = mFreeIDs.front();
- mFreeIDs.pop_front();
- mUsedIDs.push_back(rtn);
- return rtn;
-}
-
-bool LLControlBase::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
-{
- if (event->desc() == "value_changed")
- {
- setValue(((LLValueChangedEvent*)(LLEvent*)event)->mValue);
- return TRUE;
- }
- return TRUE;
-}
-
-void LLControlBase::firePropertyChanged()
-{
- LLValueChangedEvent *evt = new LLValueChangedEvent(this, getValue());
- fireEvent(evt, "");
-}
-
-//============================================================================
-// Used to add a listener callback that will be called on the frame that the controls value changes
-
-S32 LLControl::addListener(LLControl::tListenerCallback* cbfn)
-{
- S32 id = allocateListenerID();
- mListeners.push_back(cbfn);
- mListenerIDs.push_back( id );
- return id;
-}
-
-void LLControl::updateListeners() {
- LLControl::tPropertyChangedListIter iter = mChangeEvents.begin();
- while(iter!=mChangeEvents.end()){
- LLControl::tPropertyChangedEvent& evt = *iter;
- (*evt.mCBFN)(evt.mNewValue,evt.mID,*this);
- iter++;
- }
- mChangeEvents.clear();
-}
-
-//static
-void LLControlBase::updateAllListeners()
-{
- std::set< LLControlBase* >::iterator iter = mChangedControls.begin();
- while(iter != mChangedControls.end()){
- (*iter)->updateListeners();
- iter++;
- }
- mChangedControls.clear();
-}
-
-LLControl::LLControl(
- const LLString& name,
- eControlType type,
- LLSD initial,
- const LLString& comment,
- BOOL persist) :
- LLControlBase(name, type, comment, persist),
- mCurrent(initial),
- mDefault(initial)
-{
-}
-
//============================================================================
#ifdef TEST_HARNESS
@@ -1393,17 +1076,17 @@ void main()
llinfos << "Loaded " << count << " controls" << llendl;
// test insertion
- foo = new LLControl<F32>("gFoo", 5.f, 1.f, 20.f);
+ foo = new LLControlVariable<F32>("gFoo", 5.f, 1.f, 20.f);
gGlobals.addEntry("gFoo", foo);
- bar = new LLControl<S32>("gBar", 10, 2, 22);
+ bar = new LLControlVariable<S32>("gBar", 10, 2, 22);
gGlobals.addEntry("gBar", bar);
- baz = new LLControl<BOOL>("gBaz", FALSE);
+ baz = new LLControlVariable<BOOL>("gBaz", FALSE);
gGlobals.addEntry("gBaz", baz);
// test retrieval
- getfoo = (LLControl<F32>*) gGlobals.resolveName("gFoo");
+ getfoo = (LLControlVariable<F32>*) gGlobals.resolveName("gFoo");
getfoo->dump();
getbar = (S32_CONTROL) gGlobals.resolveName("gBar");
@@ -1416,10 +1099,10 @@ void main()
// Failure modes
// ...min > max
- // badfoo = new LLControl<F32>("gFoo2", 100.f, 20.f, 5.f);
+ // badfoo = new LLControlVariable<F32>("gFoo2", 100.f, 20.f, 5.f);
// ...initial > max
- // badbar = new LLControl<S32>("gBar2", 10, 20, 100000);
+ // badbar = new LLControlVariable<S32>("gBar2", 10, 20, 100000);
// ...misspelled name
// getfoo = (F32_CONTROL) gGlobals.resolveName("fooMisspelled");
@@ -1441,3 +1124,4 @@ void main()
}
#endif
+
diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h
index a1a2a4c851..7a638a7b73 100644
--- a/indra/llxml/llcontrol.h
+++ b/indra/llxml/llcontrol.h
@@ -38,6 +38,26 @@
#include "llstring.h"
#include "llrect.h"
+#include <vector>
+
+// *NOTE: boost::visit_each<> generates warning 4675 on .net 2003
+// Disable the warning for the boost includes.
+#if LL_WINDOWS
+# if (_MSC_VER >= 1300 && _MSC_VER < 1400)
+# pragma warning(push)
+# pragma warning( disable : 4675 )
+# endif
+#endif
+
+#include <boost/bind.hpp>
+#include <boost/signal.hpp>
+
+#if LL_WINDOWS
+# if (_MSC_VER >= 1300 && _MSC_VER < 1400)
+# pragma warning(pop)
+# endif
+#endif
+
class LLVector3;
class LLVector3d;
class LLColor4;
@@ -48,7 +68,7 @@ const BOOL NO_PERSIST = FALSE;
typedef enum e_control_type
{
- TYPE_U32,
+ TYPE_U32 = 0,
TYPE_S32,
TYPE_F32,
TYPE_BOOLEAN,
@@ -58,159 +78,82 @@ typedef enum e_control_type
TYPE_RECT,
TYPE_COL4,
TYPE_COL3,
- TYPE_COL4U
+ TYPE_COL4U,
+ TYPE_LLSD,
+ TYPE_COUNT
} eControlType;
-class LLControlBase : public LLSimpleListenerObservable
+class LLControlVariable
{
-friend class LLControlGroup;
-protected:
+ friend class LLControlGroup;
+ typedef boost::signal<void(const LLSD&)> signal_t;
+
+private:
LLString mName;
LLString mComment;
eControlType mType;
- BOOL mHasRange;
BOOL mPersist;
- BOOL mIsDefault;
-
- static std::set<LLControlBase*> mChangedControls;
- static std::list<S32> mFreeIDs;//These lists are used to store the ID's of registered event listeners.
- static std::list<S32> mUsedIDs;
- static S32 mTopID;//This is the index of the highest ID event listener ID. When the free pool is exhausted, new IDs are allocated from here.
-
+ std::vector<LLSD> mValues;
+
+ signal_t mSignal;
+
public:
- static void releaseListenerID(S32 id);
- static S32 allocateListenerID();
- static void updateAllListeners();
- virtual void updateListeners() = 0;
-
- LLControlBase(const LLString& name, eControlType type, const LLString& comment, BOOL persist)
- : mName(name),
- mComment(comment),
- mType(type),
- mHasRange(FALSE),
- mPersist(persist),
- mIsDefault(TRUE)
- {
- if (mPersist && mComment.empty())
- {
- llerrs << "Must supply a comment for control " << mName << llendl;
- }
- sMaxControlNameLength = llmax((U32)mName.size(), sMaxControlNameLength);
- }
-
- virtual ~LLControlBase();
+ LLControlVariable(const LLString& name, eControlType type,
+ LLSD initial, const LLString& comment,
+ BOOL persist = TRUE);
+ virtual ~LLControlVariable();
+
const LLString& getName() const { return mName; }
const LLString& getComment() const { return mComment; }
eControlType type() { return mType; }
- BOOL isType(eControlType tp) { return tp == mType; }
-
- // Defaults to no-op
- virtual void resetToDefault();
-
- LLSD registerListener(LLSimpleListenerObservable *listener, LLSD userdata = "");
-
- virtual LLSD get() const = 0;
- virtual LLSD getValue() const = 0;
- virtual void setValue(LLSD value) = 0;
- virtual void set(LLSD value) = 0;
-
- // From LLSimpleListener
- virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);
-
- void firePropertyChanged();
-
- static U32 sMaxControlNameLength;
-
-protected:
- const char* name() { return mName.c_str(); }
- const char* comment() { return mComment.c_str(); }
-};
-
-class LLControl
-: public LLControlBase
-{
-friend class LLControlGroup;
-protected:
- LLSD mCurrent;
- LLSD mDefault;
-
-public:
-
- typedef void tListenerCallback(const LLSD& newValue,S32 listenerID, LLControl& control);
- typedef struct{
- S32 mID;
- LLSD mNewValue;
- tListenerCallback* mCBFN;
- }tPropertyChangedEvent;
-
- typedef std::list<tPropertyChangedEvent>::iterator tPropertyChangedListIter;
- std::list<tPropertyChangedEvent> mChangeEvents;
- std::list< tListenerCallback* > mListeners;
- std::list< S32 > mListenerIDs;
-
- virtual void updateListeners();
- S32 addListener(tListenerCallback* cbfn);
-
- LLControl(
- const LLString& name,
- eControlType type,
- LLSD initial, const
- LLString& comment,
- BOOL persist = TRUE);
-
- void set(LLSD val) { setValue(val); }
- LLSD get() const { return getValue(); }
- LLSD getdefault() const { return mDefault; }
- LLSD getValue() const { return mCurrent; }
- BOOL llsd_compare(const LLSD& a, const LLSD& b);
-
- void setValue(LLSD value)
- {
- if (llsd_compare(mCurrent, value) == FALSE)
- {
- mCurrent = value;
- mIsDefault = llsd_compare(mCurrent, mDefault);
- firePropertyChanged();
- }
- }
-
- /*virtual*/ void resetToDefault()
- {
- setValue(mDefault);
- }
-
- virtual ~LLControl()
+ BOOL isType(eControlType tp) { return tp == mType; }
+
+ void resetToDefault(bool fire_signal = TRUE);
+
+ signal_t* getSignal() { return &mSignal; }
+
+ bool isDefault() { return (mValues.size() == 1); }
+ bool isSaveValueDefault();
+ bool isPersisted() { return mPersist; }
+ void set(const LLSD& val) { setValue(val); }
+ LLSD get() const { return getValue(); }
+ LLSD getDefault() const { return mValues.front(); }
+ LLSD getValue() const { return mValues.back(); }
+ LLSD getSaveValue() const;
+ void setValue(const LLSD& value, bool saved_value = TRUE);
+ void firePropertyChanged()
{
- //Remove and deregister all listeners..
- while(mListenerIDs.size())
- {
- S32 id = mListenerIDs.front();
- mListenerIDs.pop_front();
- releaseListenerID(id);
- }
+ mSignal(mValues.back());
}
+ BOOL llsd_compare(const LLSD& a, const LLSD& b);
};
//const U32 STRING_CACHE_SIZE = 10000;
class LLControlGroup
{
-public:
- typedef std::map<LLString, LLPointer<LLControlBase> > ctrl_name_table_t;
+protected:
+ typedef std::map<LLString, LLControlVariable* > ctrl_name_table_t;
ctrl_name_table_t mNameTable;
std::set<LLString> mWarnings;
- std::set<LLString> mLoadedSettings; // Filled in with names loaded from settings.xml
+ LLString mTypeString[TYPE_COUNT];
+ eControlType typeStringToEnum(const LLString& typestr);
+ LLString typeEnumToString(eControlType typeenum);
public:
LLControlGroup();
~LLControlGroup();
void cleanup();
- bool hasLoaded(const LLString& name) { return mLoadedSettings.find(name) != mLoadedSettings.end(); }
- void clearLoaded() { mLoadedSettings.clear(); } // Call once we've done any settings tweaks which may need this data
- LLControlBase* getControl(const LLString& name);
- LLSD registerListener(const LLString& name, LLSimpleListenerObservable *listener);
+ LLControlVariable* getControl(const LLString& name);
+
+ struct ApplyFunctor
+ {
+ virtual ~ApplyFunctor() {};
+ virtual void apply(const LLString& name, LLControlVariable* control) = 0;
+ };
+ void applyToAll(ApplyFunctor* func);
BOOL declareControl(const LLString& name, eControlType type, const LLSD initial_val, const LLString& comment, BOOL persist);
BOOL declareU32(const LLString& name, U32 initial_val, const LLString& comment, BOOL persist = TRUE);
@@ -224,6 +167,7 @@ public:
BOOL declareColor4U(const LLString& name, const LLColor4U &initial_val, const LLString& comment, BOOL persist = TRUE);
BOOL declareColor4(const LLString& name, const LLColor4 &initial_val, const LLString& comment, BOOL persist = TRUE);
BOOL declareColor3(const LLString& name, const LLColor3 &initial_val, const LLString& comment, BOOL persist = TRUE);
+ BOOL declareLLSD(const LLString& name, const LLSD &initial_val, const LLString& comment, BOOL persist = TRUE);
LLString findString(const LLString& name);
@@ -237,7 +181,7 @@ public:
S32 getS32(const LLString& name);
F32 getF32(const LLString& name);
U32 getU32(const LLString& name);
- LLSD getValue(const LLString& name);
+ LLSD getLLSD(const LLString& name);
// Note: If an LLColor4U control exists, it will cast it to the correct
@@ -258,19 +202,21 @@ public:
void setColor4U(const LLString& name, const LLColor4U &val);
void setColor4(const LLString& name, const LLColor4 &val);
void setColor3(const LLString& name, const LLColor3 &val);
+ void setLLSD(const LLString& name, const LLSD& val);
void setValue(const LLString& name, const LLSD& val);
-
+
+
BOOL controlExists(const LLString& name);
// Returns number of controls loaded, 0 if failed
// If require_declaration is false, will auto-declare controls it finds
// as the given type.
- U32 loadFromFileLegacy(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
- U32 loadFromFile(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
- U32 saveToFile(const LLString& filename, BOOL skip_if_default);
- void applyOverrides(const std::map<std::string, std::string>& overrides);
+ U32 loadFromFileLegacy(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
+ U32 saveToFile(const LLString& filename, BOOL nondefault_only);
+ U32 loadFromFile(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
void resetToDefaults();
+
// Ignorable Warnings
// Add a config variable to be reset on resetWarnings()
diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml
new file mode 100644
index 0000000000..01c590c1f3
--- /dev/null
+++ b/indra/newview/app_settings/cmd_line.xml
@@ -0,0 +1,323 @@
+<?xml version="1.0"?>
+<llsd>
+ <map>
+ <key>help</key>
+ <map>
+ <key>desc</key>
+ <string>display this help message</string>
+
+ <key>short</key>
+ <string>h</string>
+ </map>
+
+ <key>port</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>UserConnectionPort</string>
+ </map>
+
+ <key>drop</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>PacketDropPercentage</string>
+ </map>
+
+ <key>inbw</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>InBandwidth</string>
+ </map>
+
+ <key>outbw</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>OutBandwidth</string>
+ </map>
+
+ <key>grid</key>
+ <map>
+ <key>desc</key>
+ <string>Specify the name of the grid, local, or an IP address to connect to.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>GridChoice</string>
+ </map>
+
+ <key>loginuri</key>
+ <map>
+ <key>desc</key>
+ <string>login server and CGI script to use</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>compose</key>
+ <boolean>true</boolean>
+ <key>map-to</key>
+ <string>LoginURI</string>
+ </map>
+
+ <key>helperuri</key>
+ <map>
+ <key>desc</key>
+ <string>helper web CGI prefix to use</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>HelperURI</string>
+ </map>
+
+ <key>debugviews</key>
+ <map>
+ <key>map-to</key>
+ <string>DebugViews</string>
+ </map>
+
+ <key>skin</key>
+ <map>
+ <key>desc</key>
+ <string>ui/branding skin folder to use</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>SkinFolder</string>
+ </map>
+
+ <key>autologin</key>
+ <map>
+ <key>desc</key>
+ <string>log in as last saved user</string>
+ <key>map-to</key>
+ <string>AutoLogin</string>
+ </map>
+
+ <key>quitafter</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>QuitAfterSeconds</string>
+ </map>
+
+ <key>rotate</key>
+ <map>
+ <key>map-to</key>
+ <string>RotateRight</string>
+ </map>
+
+ <key>noaudio</key>
+ <map>
+ <key>map-to</key>
+ <string>NoAudio</string>
+ </map>
+
+ <key>nosound</key>
+ <map>
+ <key>map-to</key>
+ <string>NoAudio</string>
+ </map>
+
+ <key>noprobe</key>
+ <map>
+ <key>map-to</key>
+ <string>NoHardwareProbe</string>
+ </map>
+
+ <key>noquicktime</key>
+ <map>
+ <key>map-to</key>
+ <string>NoQuickTime</string>
+ </map>
+
+ <key>nopreload</key>
+ <map>
+ <key>map-to</key>
+ <string>NoPreload</string>
+ </map>
+
+ <key>purge</key>
+ <map>
+ <key>desc</key>
+ <string>Delete files in the cache.</string>
+ <key>map-to</key>
+ <string>PurgeCacheOnNextStartup</string>
+ </map>
+
+ <key>noinvlib</key>
+ <map>
+ <key>desc</key>
+ <string>Do not request the inventory library.</string>
+ <key>map-to</key>
+ <string>NoInventoryLibrary</string>
+ </map>
+
+ <key>logfile</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>UserLogFile</string>
+ </map>
+
+ <key>setdefault</key>
+ <map>
+ <key>desc</key>
+ <string>
+ "specify the value of a particular\n
+ configuration variable which can be\n
+ overridden by settings.xml\n"
+ </string>
+ <key>count</key>
+ <integer>2</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
+ </map>
+
+ <key>set</key>
+ <map>
+ <key>desc</key>
+ <string>
+ "specify the value of a particular\n
+ configuration variable that\n
+ overrides all other settings\n"
+ </string>
+ <key>count</key>
+ <integer>2</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
+ </map>
+
+ <key>settings</key>
+ <map>
+ <key>desc</key>
+ <string>Specify the filename of a configuration file.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <!-- Special case. Mapped to settings procedurally. -->
+ </map>
+
+ <key>login</key>
+ <map>
+ <key>desc</key>
+ <string>3 tokens: first, last and password</string>
+ <key>count</key>
+ <integer>3</integer>
+ <key>map-to</key>
+ <string>UserLoginInfo</string>
+ </map>
+
+ <key>god</key>
+ <map>
+ <key>desc</key>
+ <string>Log in a god if you have god access.</string>
+ <key>map-to</key>
+ <string>ConnectAsGod</string>
+ </map>
+
+ <key>console</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>ShowConsoleWindow</string>
+ </map>
+
+ <key>safe</key>
+ <map>
+ <key>desc</key>
+ <string>Reset preferences, run in safe mode.</string>
+ <key>map-to</key>
+ <string>SafeMode</string>
+ </map>
+
+ <key>multiple</key>
+ <map>
+ <key>desc</key>
+ <string>Allow multple viewers.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>AllowMultipleViewers</string>
+ </map>
+
+ <key>novoice</key>
+ <map>
+ <key>desc</key>
+ <string>Disable voice.</string>
+ <key>map-to</key>
+ <string>CmdLineDisableVoice</string>
+ </map>
+
+ <key>url</key>
+ <map>
+ <key>desc</key>
+ <string>Startup location</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>last_option</key>
+ <boolean>true</boolean>
+ <!-- Special case. Not mapped to a setting. -->
+ </map>
+
+ <key>slurl</key>
+ <map>
+ <key>desc</key>
+ <string>Startup SLurl</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>positional</key>
+ <boolean>true</boolean>
+ <key>last_option</key>
+ <boolean>true</boolean>
+ <!-- Special case. Not mapped to a setting. -->
+ </map>
+
+ <key>ignorepixeldepth</key>
+ <map>
+ <key>desc</key>
+ <string>Ignore pixel depth settings.</string>
+ <key>map-to</key>
+ <string>IgnorePixelDepth</string>
+ </map>
+
+ <key>cooperative</key>
+ <map>
+ <key>desc</key>
+ <string>Yield some idle time to local host.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>YieldTime</string>
+ </map>
+
+ <key>no-verify-ssl-cert</key>
+ <map>
+ <key>map-to</key>
+ <string>NoVerifySSLCert</string>
+ </map>
+
+ <key>channel</key>
+ <map>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>VersionChannelName</string>
+ </map>
+
+ <key>loginpage</key>
+ <map>
+ <key>desc</key>
+ <string>Login authentication page to use.</string>
+ <key>count</key>
+ <integer>1</integer>
+ <key>map-to</key>
+ <string>LoginPage</string>
+ </map>
+
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
new file mode 100644
index 0000000000..012bc9ec10
--- /dev/null
+++ b/indra/newview/app_settings/settings.xml
@@ -0,0 +1,9604 @@
+<llsd>
+ <map>
+ <key>AdvanceSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Display advanced parameter settings in snaphot interface</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AFKTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>300</real>
+ </map>
+ <key>AgentChatColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of chat messages from other residents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>AllowIdleAFK</key>
+ <map>
+ <key>Comment</key>
+ <string>Automatically set AFK (away from keyboard) mode when idle</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AllowMultipleViewers</key>
+ <map>
+ <key>Comment</key>
+ <string>Allow multiple viewers.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AnimateTextures</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable texture animation (debug)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AnimationDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Show active animations in a bubble above avatars head</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AppearanceCameraMovement</key>
+ <map>
+ <key>Comment</key>
+ <string>When entering appearance editing mode, camera zooms in on currently selected portion of avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ApplyColorImmediately</key>
+ <map>
+ <key>Comment</key>
+ <string>Preview selections in color picker immediately</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ApplyTextureImmediately</key>
+ <map>
+ <key>Comment</key>
+ <string>Preview selections in texture picker immediately</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ArrowKeysMoveAvatar</key>
+ <map>
+ <key>Comment</key>
+ <string>While cursor is in chat entry box, arrow keys still control your avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AskedAboutCrashReports</key>
+ <map>
+ <key>Comment</key>
+ <string>Turns off dialog asking if you want to enable crash reporting</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AsyncKeyboard</key>
+ <map>
+ <key>Comment</key>
+ <string>Improves responsiveness to keyboard input when at low framerates</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AuctionShowFence</key>
+ <map>
+ <key>Comment</key>
+ <string>When auctioning land, include parcel boundary marker in snapshot</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AudioLevelAmbient</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of environment sounds</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>AudioLevelDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale factor for audio engine (multiple of world scale, 2.0 = audio falls off twice as fast)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelDoppler</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale of doppler effect on moving audio sources (1.0 = normal, &lt;1.0 = diminished doppler effect, &gt;1.0 = enhanced doppler effect)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelMaster</key>
+ <map>
+ <key>Comment</key>
+ <string>Master audio level, or overall volume</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelMedia</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of Quicktime movies</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelMic</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of microphone input</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelMusic</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of streaming music</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelRolloff</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls the distance-based dropoff of audio volume (fraction or multiple of default audio rolloff)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelSFX</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of in-world sound effects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>AudioLevelUI</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of UI sound effects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>AudioLevelVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio level of voice chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>AudioStreamingMusic</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable streaming audio</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AudioStreamingVideo</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable streaming video</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutoAcceptNewInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Automatically accept new notecards/textures/landmarks</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutoLoadWebProfiles</key>
+ <map>
+ <key>Comment</key>
+ <string>Automatically load ALL profile webpages without asking first.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutoLogin</key>
+ <map>
+ <key>Comment</key>
+ <string>Login automatically using last username/password combination</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutoMimeDiscovery</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable viewer mime type discovery of media URLs</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutoPilotLocksCamera</key>
+ <map>
+ <key>Comment</key>
+ <string>Keep camera position locked when avatar walks to selected position</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutoSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Update snapshot when camera stops moving, or any parameter changes</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>AutomaticFly</key>
+ <map>
+ <key>Comment</key>
+ <string>Fly by holding jump key or using &quot;Fly&quot; command (FALSE = fly by using &quot;Fly&quot; command only)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AvatarBacklight</key>
+ <map>
+ <key>Comment</key>
+ <string>Add rim lighting to avatar rendering to approximate shininess of skin</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>AvatarCompositeLimit</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of avatars to display appearance changes on the fly</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
+ <key>AvatarPickerSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>AvatarSex</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>BackgroundChatColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of chat bubble background</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>BackgroundYieldTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount of time to yield every frame to other applications when SL is not the foreground window (milliseconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>40</integer>
+ </map>
+ <key>BackwardBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>45</integer>
+ <integer>29</integer>
+ <integer>66</integer>
+ <integer>4</integer>
+ </array>
+ </map>
+ <key>BasicHelpRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for help window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>404</integer>
+ <integer>467</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>BeaconAlwaysOn</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacons / highlighting always on</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>BrowserHomePage</key>
+ <map>
+ <key>Comment</key>
+ <string>[NOT USED]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://www.secondlife.com</string>
+ </map>
+ <key>BrowserProxyAddress</key>
+ <map>
+ <key>Comment</key>
+ <string>Address for the Web Proxy]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>BrowserProxyEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Use Web Proxy</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>BrowserProxyExclusions</key>
+ <map>
+ <key>Comment</key>
+ <string>[NOT USED]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>BrowserProxyPort</key>
+ <map>
+ <key>Comment</key>
+ <string>Port for Web Proxy</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>3128</integer>
+ </map>
+ <key>BrowserProxySocks45</key>
+ <map>
+ <key>Comment</key>
+ <string>[NOT USED]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
+ <key>BuildBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ButtonFlashCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of flashes after which flashing buttons stay lit up</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>3</integer>
+ </map>
+ <key>ButtonFlashRate</key>
+ <map>
+ <key>Comment</key>
+ <string>Frequency at which buttons flash (hz)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>2</real>
+ </map>
+ <key>ButtonHPad</key>
+ <map>
+ <key>Comment</key>
+ <string>Default horizontal spacing between buttons (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>10</integer>
+ </map>
+ <key>ButtonHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Default height for normal buttons (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>20</integer>
+ </map>
+ <key>ButtonHeightSmall</key>
+ <map>
+ <key>Comment</key>
+ <string>Default height for small buttons (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>16</integer>
+ </map>
+ <key>ButtonVPad</key>
+ <map>
+ <key>Comment</key>
+ <string>Default vertical spacing between buttons (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>CacheLocation</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls the location of the local disk cache</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>CacheSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls amount of hard drive space reserved for local file caching in MB</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>500</integer>
+ </map>
+ <key>CacheValidateCounter</key>
+ <map>
+ <key>Comment</key>
+ <string>Used to distribute cache validation</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CameraOffset</key>
+ <map>
+ <key>Comment</key>
+ <string>Render with camera offset from view frustum (rendering debug)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CameraOffsetBuild</key>
+ <map>
+ <key>Comment</key>
+ <string>Default camera position relative to focus point when entering build mode</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>-6</real>
+ <real>0</real>
+ <real>6</real>
+ </array>
+ </map>
+ <key>CameraOffsetDefault</key>
+ <map>
+ <key>Comment</key>
+ <string>Default camera offset from avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>-3</real>
+ <real>0</real>
+ <real>0.75</real>
+ </array>
+ </map>
+ <key>CameraPositionSmoothing</key>
+ <map>
+ <key>Comment</key>
+ <string>Smooths camera position over time</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>CameraPosOnLogout</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera position when last logged out (global coordinates)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3D</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0</real>
+ </array>
+ </map>
+ <key>CameraMouseWheelZoom</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera zooms in and out with mousewheel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatBarStealsFocus</key>
+ <map>
+ <key>Comment</key>
+ <string>Whenever keyboard focus is removed from the UI, and the chat bar is visible, the chat bar takes focus</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatBubbleOpacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Opacity of chat bubble background (0.0 = completely transparent, 1.0 = completely opaque)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>ChatFontSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of chat text in chat console (0 = small, 1 = big)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatFullWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Chat console takes up full width of SL window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatHistoryTornOff</key>
+ <map>
+ <key>Comment</key>
+ <string>Show chat history window separately from Communicate window.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ChatOnlineNotification</key>
+ <map>
+ <key>Comment</key>
+ <string>Provide notifications for when friend log on and off of SL</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatPersistTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Time for which chat stays visible in console (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>15</real>
+ </map>
+ <key>ChatShowTimestamps</key>
+ <map>
+ <key>Comment</key>
+ <string>Show timestamps in chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatVisible</key>
+ <map>
+ <key>Comment</key>
+ <string>Chat bar is visible</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatterboxRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for chatterbox window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>350</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>CheesyBeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable cheesy beacon effects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ClientSettingsFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Persisted client settings file name (per install).</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>CloseChatOnReturn</key>
+ <map>
+ <key>Comment</key>
+ <string>Close chat after hitting return</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CloseSnapshotOnKeep</key>
+ <map>
+ <key>Comment</key>
+ <string>Close snapshot window after saving snapshot</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ClothingBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CmdLineDisableVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable Voice.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ColorPaletteEntry01</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry02</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0.5</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry03</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry04</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0.5</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry05</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0.5</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry06</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0.5</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry07</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry08</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry09</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0.5</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry10</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0.25</real>
+ <real>0.25</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry11</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0.5</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry12</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0.25</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry13</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry14</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0.25</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry15</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry16</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry17</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry18</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.75</real>
+ <real>0.75</real>
+ <real>0.75</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry19</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry20</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry21</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry22</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry23</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry24</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry25</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry26</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry27</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry28</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.5</real>
+ <real>0.5</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry29</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0.5</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry30</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>0.5</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry31</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColorPaletteEntry32</key>
+ <map>
+ <key>Comment</key>
+ <string>Color picker palette entry</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ColumnHeaderDropDownDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Time in seconds of mouse click before column header shows sort options list</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.300000011920928955078125</real>
+ </map>
+ <key>CompileOutputRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for script Recompile Everything output window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>CompressSnapshotsToDisk</key>
+ <map>
+ <key>Comment</key>
+ <string>Compress snapshots saved to disk (Using JPEG 2000)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ConnectAsGod</key>
+ <map>
+ <key>Comment</key>
+ <string>Log in a god if you have god access.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ConnectionPort</key>
+ <map>
+ <key>Comment</key>
+ <string>Custom connection port number</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>13000</integer>
+ </map>
+ <key>ConnectionPortEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Use the custom connection port?</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ConsoleBackgroundOpacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Opacity of chat console (0.0 = completely transparent, 1.0 = completely opaque)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.4000000059604644775390625</real>
+ </map>
+ <key>ConsoleBufferSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of chat console history (lines of chat)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>40</integer>
+ </map>
+ <key>ConsoleMaxLines</key>
+ <map>
+ <key>Comment</key>
+ <string>Max number of lines of chat text visible in console.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>40</integer>
+ </map>
+ <key>ContactsTornOff</key>
+ <map>
+ <key>Comment</key>
+ <string>Show contacts window separately from Communicate window.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CookiesEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Accept cookies from Web sites?</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>CrashLogBehavior</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls behavior when viewer (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>CreateToolCopyCenters</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>CreateToolCopyRotates</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CreateToolCopySelection</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CreateToolKeepSelected</key>
+ <map>
+ <key>Comment</key>
+ <string>After using create tool, keep the create tool active</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>CustomServer</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies IP address or hostname of grid to which you connect</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>DebugBeaconLineWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of lines for Debug Beacons</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DebugInventoryFilters</key>
+ <map>
+ <key>Comment</key>
+ <string>Turn on debugging display for inventory filtering</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DebugPermissions</key>
+ <map>
+ <key>Comment</key>
+ <string>Log permissions for selected inventory items</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DebugShowColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Show color under cursor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DebugShowRenderInfo</key>
+ <map>
+ <key>Comment</key>
+ <string>Show depth buffer contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DebugShowTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Show depth buffer contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DebugViews</key>
+ <map>
+ <key>Comment</key>
+ <string>Display debugging info for views.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DebugWindowProc</key>
+ <map>
+ <key>Comment</key>
+ <string>Log windows messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DefaultObjectTexture</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture used as &apos;Default&apos; in texture picker. (UUID texture reference)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>89556747-24cb-43ed-920b-47caed15465f</string>
+ </map>
+ <key>DisableCameraConstraints</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable the normal bounds put on the camera by avatar position</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DisableRendering</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable GL rendering and GUI (load testing)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DisableVerticalSync</key>
+ <map>
+ <key>Comment</key>
+ <string>Update frames as fast as possible (FALSE = update frames between display scans)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DisplayAvatarAgentTarget</key>
+ <map>
+ <key>Comment</key>
+ <string>Show avatar positioning locators (animation debug)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DisplayChat</key>
+ <map>
+ <key>Comment</key>
+ <string>Display Latest Chat message on LCD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DisplayDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Display Network Information on LCD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DisplayDebugConsole</key>
+ <map>
+ <key>Comment</key>
+ <string>Display Console Debug Information on LCD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DisplayIM</key>
+ <map>
+ <key>Comment</key>
+ <string>Display Latest IM message on LCD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DisplayLinden</key>
+ <map>
+ <key>Comment</key>
+ <string>Display Account Information on LCD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DisplayRegion</key>
+ <map>
+ <key>Comment</key>
+ <string>Display Location information on LCD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DisplayTimecode</key>
+ <map>
+ <key>Comment</key>
+ <string>Display timecode on screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>Disregard128DefaultDrawDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use the auto default to 128 draw distance</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>Disregard96DefaultDrawDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use the auto default to 96 draw distance</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>DoubleClickAutoPilot</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable double-click auto pilot</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>DragAndDropToolTipDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying tooltip when performing drag and drop operation</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>DropShadowButton</key>
+ <map>
+ <key>Comment</key>
+ <string>Drop shadow width for buttons (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>DropShadowFloater</key>
+ <map>
+ <key>Comment</key>
+ <string>Drop shadow width for floaters (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
+ <key>DropShadowSlider</key>
+ <map>
+ <key>Comment</key>
+ <string>Drop shadow width for sliders (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>3</integer>
+ </map>
+ <key>DropShadowTooltip</key>
+ <map>
+ <key>Comment</key>
+ <string>Drop shadow width for tooltips (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+ <key>DynamicCameraStrength</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount camera lags behind avatar motion (0 = none, 30 = avatar velocity)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>2</real>
+ </map>
+ <key>EditCameraMovement</key>
+ <map>
+ <key>Comment</key>
+ <string>When entering build mode, camera moves up above avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EditLinkedParts</key>
+ <map>
+ <key>Comment</key>
+ <string>Select individual parts of linked objects</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>EffectColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Particle effects color</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>EnablePushToTalk</key>
+ <map>
+ <key>Comment</key>
+ <string>Must hold down a key or moouse button when talking into your microphone</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnableVoiceChat</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable talking to other residents with a microphone</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>EnergyFromTop</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>20</integer>
+ </map>
+ <key>EnergyHeight</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>40</integer>
+ </map>
+ <key>EnergyWidth</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>175</integer>
+ </map>
+ <key>FilterItemsPerFrame</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of inventory items to match against search filter every frame (lower to increase framerate while searching, higher to improve search speed)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>500</integer>
+ </map>
+ <key>FindLandArea</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables filtering of land search results by area</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FindLandPrice</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables filtering of land search results by price</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FindLandType</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls which type of land you are searching for in Find Land interface (&quot;All&quot;, &quot;Auction&quot;, &quot;For Sale&quot;)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>All</string>
+ </map>
+ <key>FindPeopleOnline</key>
+ <map>
+ <key>Comment</key>
+ <string>Limits people search to only users who are logged on</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FindPlacesPictures</key>
+ <map>
+ <key>Comment</key>
+ <string>Display only results of find places that have pictures</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstLoginThisInstall</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies that you have not successfully logged in since you installed the latest update</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FirstName</key>
+ <map>
+ <key>Comment</key>
+ <string>Login first name</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>FirstPersonAvatarVisible</key>
+ <map>
+ <key>Comment</key>
+ <string>Display avatar and attachments below neck while in mouselook</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FirstPersonBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FirstRunThisInstall</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies that you have not run the viewer since you installed the latest update</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FixedWeather</key>
+ <map>
+ <key>Comment</key>
+ <string>Weather effects do not change over time</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FloaterAboutRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for About window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>440</integer>
+ <integer>470</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterActiveSpeakersRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for active speakers window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>300</integer>
+ <integer>250</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterAudioVolumeRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Audio Volume window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>440</integer>
+ <integer>470</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterBuildOptionsRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for build options window.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>0</integer>
+ <integer>0</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterBumpRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Bumps/Hits window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>180</integer>
+ <integer>400</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterBuyContentsRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Buy Contents window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>250</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterBuyRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for buy window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>250</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterCameraRect2</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for camera control window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>166</integer>
+ <integer>128</integer>
+ <integer>342</integer>
+ <integer>64</integer>
+ </array>
+ </map>
+ <key>FloaterChatRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for chat history</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>172</integer>
+ <integer>500</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterClothingRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for clothing window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>480</integer>
+ <integer>320</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterContactsRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for chat history</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>390</integer>
+ <integer>395</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterCustomizeAppearanceRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for avatar customization window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>540</integer>
+ <integer>494</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterFindRect2</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Find window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>570</integer>
+ <integer>780</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterFriendsRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for friends window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>250</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterGestureRect2</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for gestures window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>465</integer>
+ <integer>350</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterHtmlRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for HTML window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>100</integer>
+ <integer>460</integer>
+ <integer>370</integer>
+ <integer>100</integer>
+ </array>
+ </map>
+ <key>FloaterHUDRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for HUD Floater window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>282</integer>
+ <integer>342</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterIMRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for IM window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>160</integer>
+ <integer>500</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterInspectRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Object Inspect window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>400</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterInventoryRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for inventory window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterJoystickRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for joystick controls window.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>0</integer>
+ <integer>0</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterLagMeter</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for lag meter</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>142</integer>
+ <integer>350</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterLandRect5</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for About Land window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>370</integer>
+ <integer>460</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterLandmarkRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for landmark picker</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>290</integer>
+ <integer>310</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterMediaRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for media browser window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>400</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterMiniMapRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>225</integer>
+ <integer>200</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterMoveRect2</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for avatar control window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>58</integer>
+ <integer>135</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterMuteRect3</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for mute window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>300</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterOpenObjectRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Open Object window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>350</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterPayRectB</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for pay window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>150</integer>
+ <integer>400</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterRegionInfo</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for region info window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>512</integer>
+ <integer>480</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterScriptDebugRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Script Error/Debug window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>130</integer>
+ <integer>450</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterSnapshotRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for snapshot window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>200</integer>
+ <integer>200</integer>
+ <integer>400</integer>
+ </array>
+ </map>
+ <key>FloaterViewBottom</key>
+ <map>
+ <key>Comment</key>
+ <string>[DO NOT MODIFY] Controls layout of floating windows within SL window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
+ <key>FloaterWorldMapRect2</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for world map window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>0</integer>
+ <integer>0</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FlyBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FlycamAbsolute</key>
+ <map>
+ <key>Comment</key>
+ <string>Treat Flycam values as absolute positions (not deltas).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FlycamAutoLeveling</key>
+ <map>
+ <key>Comment</key>
+ <string>Keep Flycam level.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FlycamAxis0</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam hardware axis mapping for internal axis 0 ([0, 5]).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FlycamAxis1</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam hardware axis mapping for internal axis 1 ([0, 5]).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FlycamAxis2</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam hardware axis mapping for internal axis 2 ([0, 5]).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>FlycamAxis3</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam hardware axis mapping for internal axis 3 ([0, 5]).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>3</integer>
+ </map>
+ <key>FlycamAxis4</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam hardware axis mapping for internal axis 4 ([0, 5]).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4</integer>
+ </map>
+ <key>FlycamAxis5</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam hardware axis mapping for internal axis 5 ([0, 5]).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>5</integer>
+ </map>
+ <key>FlycamAxis6</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam hardware axis mapping for internal axis 6 ([0, 5]).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
+ <key>FlycamAxisDeadZone0</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 0 dead zone.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>FlycamAxisDeadZone1</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 1 dead zone.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>FlycamAxisDeadZone2</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 2 dead zone.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>FlycamAxisDeadZone3</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 3 dead zone.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>FlycamAxisDeadZone4</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 4 dead zone.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>FlycamAxisDeadZone5</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 5 dead zone.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>FlycamAxisDeadZone6</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 6 dead zone.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>FlycamAxisScale0</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 0 scaler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FlycamAxisScale1</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 1 scaler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FlycamAxisScale2</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 2 scaler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FlycamAxisScale3</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 3 scaler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FlycamAxisScale4</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 4 scaler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FlycamAxisScale5</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 5 scaler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FlycamAxisScale6</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam axis 6 scaler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FlycamFeathering</key>
+ <map>
+ <key>Comment</key>
+ <string>Flycam feathering (less is softer)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>16</real>
+ </map>
+ <key>FlycamZoomDirect</key>
+ <map>
+ <key>Comment</key>
+ <string>Map flycam zoom axis directly to camera zoom.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FlyingAtExit</key>
+ <map>
+ <key>Comment</key>
+ <string>Was flying when last logged out, so fly when logging in</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FocusOffsetDefault</key>
+ <map>
+ <key>Comment</key>
+ <string>Default focus point offset relative to avatar (x-axis is forward)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>FocusPosOnLogout</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera focus point when last logged out (global coordinates)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3D</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>0</real>
+ <real>0</real>
+ </array>
+ </map>
+ <key>FolderAutoOpenDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before automatically expanding the folder under the mouse when performing inventory drag and drop</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.75</real>
+ </map>
+ <key>FolderLoadingMessageWaitTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds to wait before showing the LOADING... text in folder views</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>FontMonospace</key>
+ <map>
+ <key>Comment</key>
+ <string>Name of monospace font (Truetype file name)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>profontwindows.ttf</string>
+ </map>
+ <key>FontSansSerif</key>
+ <map>
+ <key>Comment</key>
+ <string>Name of san-serif font (Truetype file name)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>MtBkLfRg.ttf</string>
+ </map>
+ <key>FontSansSerifBold</key>
+ <map>
+ <key>Comment</key>
+ <string>Name of bold font (Truetype file name)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>MtBdLfRg.ttf</string>
+ </map>
+ <key>FontSansSerifFallback</key>
+ <map>
+ <key>Comment</key>
+ <string>Name of san-serif font (Truetype file name)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>???????? Pro W3.otf;???????? ProN W3.otf;AppleGothic.dfont;AppleGothic.ttf;????.ttf</string>
+ </map>
+ <key>FontSansSerifFallbackScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale of fallback font relative to huge font (fraction of huge font size)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>FontScreenDPI</key>
+ <map>
+ <key>Comment</key>
+ <string>Font resolution, higher is bigger (pixels per inch)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>96</real>
+ </map>
+ <key>FontSizeHuge</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of huge font (points, or 1/72 of an inch)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>16</real>
+ </map>
+ <key>FontSizeLarge</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of large font (points, or 1/72 of an inch)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>12</real>
+ </map>
+ <key>FontSizeMedium</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of medium font (points, or 1/72 of an inch)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10</real>
+ </map>
+ <key>FontSizeMonospace</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of monospaced font (points, or 1/72 of an inch)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>9</real>
+ </map>
+ <key>FontSizeSmall</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of small font (points, or 1/72 of an inch)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>9</real>
+ </map>
+ <key>ForceShowGrid</key>
+ <map>
+ <key>Comment</key>
+ <string>Always show grid dropdown on login screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ForwardBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>45</integer>
+ <integer>54</integer>
+ <integer>66</integer>
+ <integer>29</integer>
+ </array>
+ </map>
+ <key>FreezeTime</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FullScreen</key>
+ <map>
+ <key>Comment</key>
+ <string>Run SL in fullscreen mode</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FullScreenAspectRatio</key>
+ <map>
+ <key>Comment</key>
+ <string>Aspect ratio of fullscreen display (width / height)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.33329999446868896484375</real>
+ </map>
+ <key>FullScreenAutoDetectAspectRatio</key>
+ <map>
+ <key>Comment</key>
+ <string>Automatically detect proper aspect ratio for fullscreen display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>FullScreenHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Fullscreen resolution in height</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>768</integer>
+ </map>
+ <key>FullScreenWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Fullscreen resolution in width</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1024</integer>
+ </map>
+ <key>GridChoice</key>
+ <map>
+ <key>Comment</key>
+ <string>The user&apos;s grid choice or ip address.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>GridCrossSections</key>
+ <map>
+ <key>Comment</key>
+ <string>Highlight cross sections of prims with grid manipulation plane.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>GridDrawSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Visible extent of 2D snap grid (meters)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>12</real>
+ </map>
+ <key>GridMode</key>
+ <map>
+ <key>Comment</key>
+ <string>Snap grid reference frame (0 = world, 1 = local, 2 = reference object)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>GridOpacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Grid line opacity (0.0 = completely transparent, 1.0 = completely opaque)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.699999988079071044921875</real>
+ </map>
+ <key>GridResolution</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of single grid step (meters)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>GridSubUnit</key>
+ <map>
+ <key>Comment</key>
+ <string>Display fractional grid steps, relative to grid size</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>GridSubdivision</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of times to divide single snap grid unit when GridSubUnit is true</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
+ <key>GroupNotifyBoxHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Height of group notice messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>260</integer>
+ </map>
+ <key>GroupNotifyBoxWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Width of group notice messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>400</integer>
+ </map>
+ <key>HTMLLinkColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of hyperlinks</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.60000002384185791015625</real>
+ <real>0.60000002384185791015625</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>HelpHomeURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL of initial help page</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>help/index.html</string>
+ </map>
+ <key>HelpLastVisitedURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL of last help page, will be shown next time help is accessed</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>help/index.html</string>
+ </map>
+ <key>HelperURI</key>
+ <map>
+ <key>Comment</key>
+ <string>helper web CGI prefix to use</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>HighResSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Double resolution of snapshot from current window resolution</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>HtmlFindRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for HTML find window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>16</integer>
+ <integer>650</integer>
+ <integer>600</integer>
+ <integer>128</integer>
+ </array>
+ </map>
+ <key>HtmlHelpLastPage</key>
+ <map>
+ <key>Comment</key>
+ <string>Last URL visited via help system</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>HtmlHelpRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for HTML help window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>16</integer>
+ <integer>650</integer>
+ <integer>600</integer>
+ <integer>128</integer>
+ </array>
+ </map>
+ <key>HtmlReleaseMessage</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for HTML Release Message Floater window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>46</integer>
+ <integer>520</integer>
+ <integer>400</integer>
+ <integer>128</integer>
+ </array>
+ </map>
+ <key>IMInChatHistory</key>
+ <map>
+ <key>Comment</key>
+ <string>Copy IM into chat history</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>IMShowTimestamps</key>
+ <map>
+ <key>Comment</key>
+ <string>Show timestamps in IM</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>IgnorePixelDepth</key>
+ <map>
+ <key>Comment</key>
+ <string>Ignore pixel depth settings.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ImagePipelineUseHTTP</key>
+ <map>
+ <key>Comment</key>
+ <string>If TRUE use HTTP GET to fetch textures from the server</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>InBandwidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Incoming bandwidth throttle (bps)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>InventoryAutoOpenDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before automatically opening inventory when mouse is over inventory button when performing inventory drag and drop</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>InventorySortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>7</integer>
+ </map>
+ <key>InvertMouse</key>
+ <map>
+ <key>Comment</key>
+ <string>When in mouselook, moving mouse up looks down and vice verse (FALSE = moving up looks up)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>KeepAspectForSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Use full window when taking snapshot, regardless of requested image size</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LCDDestination</key>
+ <map>
+ <key>Comment</key>
+ <string>Which LCD to use</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LSLHelpRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for LSL help window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>400</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>LSLHelpURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string>
+ </map>
+ <key>LagMeterShrunk</key>
+ <map>
+ <key>Comment</key>
+ <string>Last large/small state for lag meter</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>Language</key>
+ <map>
+ <key>Comment</key>
+ <string>Language specifier (for XUI)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>default</string>
+ </map>
+ <key>LastFeatureVersion</key>
+ <map>
+ <key>Comment</key>
+ <string>[DO NOT MODIFY] Version number for tracking hardware changes</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LastFindPanel</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls which find operation appears by default when clicking &quot;Find&quot; button </string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>find_all_panel</string>
+ </map>
+ <key>LastName</key>
+ <map>
+ <key>Comment</key>
+ <string>Login last name</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>LastPrefTab</key>
+ <map>
+ <key>Comment</key>
+ <string>Last selected tab in preferences window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LastRunVersion</key>
+ <map>
+ <key>Comment</key>
+ <string>Version number of last instance of the viewer that you ran</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>0.0.0</string>
+ </map>
+ <key>LastSnapshotHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>The height of the last snapshot, in px</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>768</integer>
+ </map>
+ <key>LastSnapshotType</key>
+ <map>
+ <key>Comment</key>
+ <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LastSnapshotWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>The width of the last snapshot, in px</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1024</integer>
+ </map>
+ <key>LeftClickShowMenu</key>
+ <map>
+ <key>Comment</key>
+ <string>Left click opens pie menu (FALSE = left click touches or grabs object)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LimitDragDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Limit translation of object via translate tool</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LimitSelectDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Disallow selection of objects beyond max select distance</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LocalCacheVersion</key>
+ <map>
+ <key>Comment</key>
+ <string>Version number of cache</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogMessages</key>
+ <map>
+ <key>Comment</key>
+ <string>Log network traffic</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LoginAsGod</key>
+ <map>
+ <key>Comment</key>
+ <string>Attempt to login with god powers (Linden accounts only)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LoginLastLocation</key>
+ <map>
+ <key>Comment</key>
+ <string>Login at same location you last logged out</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LoginPage</key>
+ <map>
+ <key>Comment</key>
+ <string>Login authentication page.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>LoginURI</key>
+ <map>
+ <key>Comment</key>
+ <string>login server and CGI prefix to use</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>LosslessJ2CUpload</key>
+ <map>
+ <key>Comment</key>
+ <string>Use lossless compression for small image uploads</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MapOverlayIndex</key>
+ <map>
+ <key>Comment</key>
+ <string>Currently selected world map type</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MapScale</key>
+ <map>
+ <key>Comment</key>
+ <string>World map zoom level (pixels per region)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>128</real>
+ </map>
+ <key>MapShowClassifieds</key>
+ <map>
+ <key>Comment</key>
+ <string>Show locations associated with classified ads on world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MapShowEvents</key>
+ <map>
+ <key>Comment</key>
+ <string>Show events on world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MapShowInfohubs</key>
+ <map>
+ <key>Comment</key>
+ <string>Show infohubs on the world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MapShowLandForSale</key>
+ <map>
+ <key>Comment</key>
+ <string>Show land for sale on world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MapShowPeople</key>
+ <map>
+ <key>Comment</key>
+ <string>Show other users on world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MapShowPopular</key>
+ <map>
+ <key>Comment</key>
+ <string>Show popular places on world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MapShowTelehubs</key>
+ <map>
+ <key>Comment</key>
+ <string>Show telehubs on world map</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>Marker</key>
+ <map>
+ <key>Comment</key>
+ <string>[NOT USED]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>MaxDragDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum allowed translation distance in a single operation of translate tool (meters from start point)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>48</real>
+ </map>
+ <key>MaxSelectDistance</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum allowed selection distance (meters from avatar)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>64</real>
+ </map>
+ <key>MeanCollisionBump</key>
+ <map>
+ <key>Comment</key>
+ <string>You have experienced an abuse of being bumped by an object or avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MeanCollisionPhysical</key>
+ <map>
+ <key>Comment</key>
+ <string>You have experienced an abuse from a physical object</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MeanCollisionPushObject</key>
+ <map>
+ <key>Comment</key>
+ <string>You have experienced an abuse of being pushed by a scripted object</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MeanCollisionScripted</key>
+ <map>
+ <key>Comment</key>
+ <string>You have experienced an abuse from a scripted object</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MeanCollisionSelected</key>
+ <map>
+ <key>Comment</key>
+ <string>You have experienced an abuse of being pushed via a selected object</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MenuAccessKeyTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Time (seconds) in which the menu key must be tapped to move focus to the menu bar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.25</real>
+ </map>
+ <key>MenuBarHeight</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>18</integer>
+ </map>
+ <key>MenuBarWidth</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>410</integer>
+ </map>
+ <key>MiniMapRotate</key>
+ <map>
+ <key>Comment</key>
+ <string>Rotate miniature world map to avatar direction</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MiniMapScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Miniature world map zoom levle (pixels per region)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>128</real>
+ </map>
+ <key>MouseSensitivity</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls responsiveness of mouse when in mouselook mode (fraction or multiple of default mouse sensitivity)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>3</real>
+ </map>
+ <key>MouseSmooth</key>
+ <map>
+ <key>Comment</key>
+ <string>Smooths out motion of mouse when in mouselook mode.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MouseSun</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MouselookBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MoveDownBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>91</integer>
+ <integer>29</integer>
+ <integer>116</integer>
+ <integer>4</integer>
+ </array>
+ </map>
+ <key>MoveUpBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>91</integer>
+ <integer>54</integer>
+ <integer>116</integer>
+ <integer>29</integer>
+ </array>
+ </map>
+ <key>MuteAmbient</key>
+ <map>
+ <key>Comment</key>
+ <string>Ambient sound effects, such as wind noise, play at 0 volume</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MuteAudio</key>
+ <map>
+ <key>Comment</key>
+ <string>All audio plays at 0 volume (streaming audio still takes up bandwidth, for example)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MuteMedia</key>
+ <map>
+ <key>Comment</key>
+ <string>Media plays at 0 volume (streaming audio still takes up bandwidth)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MuteMusic</key>
+ <map>
+ <key>Comment</key>
+ <string>Music plays at 0 volume (streaming audio still takes up bandwidth)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MuteSounds</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound effects play at 0 volume</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MuteUI</key>
+ <map>
+ <key>Comment</key>
+ <string>UI sound effects play at 0 volume</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MuteVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Voice plays at 0 volume (streaming audio still takes up bandwidth)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MuteWhenMinimized</key>
+ <map>
+ <key>Comment</key>
+ <string>Mute audio when SL window is minimized</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>NewCacheLocation</key>
+ <map>
+ <key>Comment</key>
+ <string>Change the location of the local disk cache to this</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>NextLoginLocation</key>
+ <map>
+ <key>Comment</key>
+ <string>Location to log into by default.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>NoAudio</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable audio playback.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NoHardwareProbe</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable hardware probe.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NoInventoryLibrary</key>
+ <map>
+ <key>Comment</key>
+ <string>Do not request inventory library.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NoPreload</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable sound and image preload.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NoQuickTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Disable quicktime playback.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NoVerifySSLCert</key>
+ <map>
+ <key>Comment</key>
+ <string>Do not verify SSL peers.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NotecardEditorRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for notecard editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>400</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>NotifyBoxHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Height of notification messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>200</integer>
+ </map>
+ <key>NotifyBoxWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Width of notification messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>350</integer>
+ </map>
+ <key>NotifyMoneyChange</key>
+ <map>
+ <key>Comment</key>
+ <string>Pop up notifications for all L$ transactions</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>NotifyTipDuration</key>
+ <map>
+ <key>Comment</key>
+ <string>Length of time that notification tips stay on screen (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>4</real>
+ </map>
+ <key>NumSessions</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of successful logins to Second Life</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>NumpadControl</key>
+ <map>
+ <key>Comment</key>
+ <string>How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ObjectChatColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of chat messages from objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.699999988079071044921875</real>
+ <real>0.89999997615814208984375</real>
+ <real>0.699999988079071044921875</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>OpenDebugStatAdvanced</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand advanced performance stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>OpenDebugStatBasic</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand basic performance stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>OpenDebugStatNet</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand network stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>OpenDebugStatRender</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand render stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>OpenDebugStatSim</key>
+ <map>
+ <key>Comment</key>
+ <string>Expand simulator performance stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>OutBandwidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Outgoing bandwidth throttle (bps)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>OverdrivenColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of various indicators when resident is speaking too loud.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>OverlayTitle</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls watermark text message displayed on screen when &quot;ShowOverlayTitle&quot; is enabled (one word, underscores become spaces)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Set_via_OverlayTitle_in_settings.xml</string>
+ </map>
+ <key>PTTCurrentlyEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PacketDropPercentage</key>
+ <map>
+ <key>Comment</key>
+ <string>Percentage of packets dropped by the client.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>PermissionsCautionEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>When enabled, changes the handling of script permission requests to help avoid accidental granting of certain permissions, such as the debit permission</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PermissionsCautionNotifyBoxHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Height of caution-style notification messages</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>344</integer>
+ </map>
+ <key>PermissionsManagerRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for permissions manager window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>85</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PickerContextOpacity</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls overall opacity of context frustrum connecting color and texture pickers with their swatches</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.3499999940395355224609375</real>
+ </map>
+ <key>PieMenuLineWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Width of lines in pie menu display (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>2.5</real>
+ </map>
+ <key>PinTalkViewOpen</key>
+ <map>
+ <key>Comment</key>
+ <string>Stay in IM after hitting return</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PingInterpolate</key>
+ <map>
+ <key>Comment</key>
+ <string>Extrapolate object position along velocity vector based on ping delay</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>PitchFromMousePosition</key>
+ <map>
+ <key>Comment</key>
+ <string>Vertical range over which avatar head tracks mouse position (degrees of head rotation from top of window to bottom)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>90</real>
+ </map>
+ <key>PlayTypingAnim</key>
+ <map>
+ <key>Comment</key>
+ <string>Your avatar plays the typing animation whenever you type in the chat bar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PrecachingDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Delay when logging in to load world before showing it (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>6</real>
+ </map>
+ <key>PreviewAnimRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for animation preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>85</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewClassifiedRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for URL preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>530</integer>
+ <integer>420</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewEventRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Event preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>530</integer>
+ <integer>420</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewLandmarkRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for landmark preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>90</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewObjectRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for object preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>85</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewScriptRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for script preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>550</integer>
+ <integer>500</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewSoundRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for sound preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>85</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewTextureRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for texture preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>400</integer>
+ <integer>400</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewURLRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for URL preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>90</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PreviewWearableRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for wearable preview window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>85</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>ProbeHardwareOnStartup</key>
+ <map>
+ <key>Comment</key>
+ <string>Query current hardware configuration on application startup</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>PropertiesRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for inventory item properties window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>320</integer>
+ <integer>350</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>PurgeCacheOnNextStartup</key>
+ <map>
+ <key>Comment</key>
+ <string>Clear local file cache next time viewer is run</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>PurgeCacheOnStartup</key>
+ <map>
+ <key>Comment</key>
+ <string>Clear local file cache every time viewer is run</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>PushToTalkButton</key>
+ <map>
+ <key>Comment</key>
+ <string>Which button or keyboard key is used for push-to-talk</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>MiddleMouse</string>
+ </map>
+ <key>PushToTalkToggle</key>
+ <map>
+ <key>Comment</key>
+ <string>Should the push-to-talk button behave as a toggle</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>QAMode</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable Testing Features.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>QuietSnapshotsToDisk</key>
+ <map>
+ <key>Comment</key>
+ <string>Take snapshots to disk without playing animation or sound</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>QuitAfterSeconds</key>
+ <map>
+ <key>Comment</key>
+ <string>The duration allowed before quitting.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>RadioLandBrushAction</key>
+ <map>
+ <key>Comment</key>
+ <string>Last selected land modification operation (0 = flatten, 1 = raise, 2 = lower, 3 = smooth, 4 = roughen, 5 = revert)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RadioLandBrushSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of land modification brush (0 = small, 1 = medium, 2 = large)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RecentItemsSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RectangleSelectInclusive</key>
+ <map>
+ <key>Comment</key>
+ <string>Select objects that have at least one vertex inside selection rectangle</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RegionTextureSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Terrain texture dimensions (power of 2)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>256</integer>
+ </map>
+ <key>RememberPassword</key>
+ <map>
+ <key>Comment</key>
+ <string>Keep password (in encrypted form) for next login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderAnisotropic</key>
+ <map>
+ <key>Comment</key>
+ <string>Render textures using anisotropic filtering</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderAppleUseMultGL</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether we want to use multi-threaded OpenGL on Apple hardware (requires restart of SL).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderAvatarCloth</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls if avatars use wavy cloth</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderAvatarLODFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls level of detail of avatars (multiplier for current screen area when calculated level of detail)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>RenderAvatarMaxVisible</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of avatars to display at any one time</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>35</integer>
+ </map>
+ <key>RenderAvatarVP</key>
+ <map>
+ <key>Comment</key>
+ <string>Use vertex programs to perform hardware skinning of avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderBumpmapMinDistanceSquared</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum distance at which to render bumpmapped primitives (distance in meters, squared)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>100</real>
+ </map>
+ <key>RenderCubeMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether we can render the cube map or not</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderCustomSettings</key>
+ <map>
+ <key>Comment</key>
+ <string>Do you want to set the graphics settings yourself</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderDebugTextureBind</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable texture bind performance test.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderDynamicLOD</key>
+ <map>
+ <key>Comment</key>
+ <string>Dynamically adjust level of detail.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderDynamicReflections</key>
+ <map>
+ <key>Comment</key>
+ <string>Generate a dynamic cube map for reflections (objects reflect their environment, experimental).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderFarClip</key>
+ <map>
+ <key>Comment</key>
+ <string>Distance of far clip plane from camera (meters)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>256</real>
+ </map>
+ <key>RenderFastUI</key>
+ <map>
+ <key>Comment</key>
+ <string>[NOT USED]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderFlexTimeFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls level of detail of flexible objects (multiplier for amount of time spent processing flex objects)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>RenderFogRatio</key>
+ <map>
+ <key>Comment</key>
+ <string>Distance from camera where fog reaches maximum density (fraction or multiple of far clip distance)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>4.0</real>
+ </map>
+ <key>RenderGamma</key>
+ <map>
+ <key>Comment</key>
+ <string>Sets gamma exponent for renderer</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>RenderGammaFull</key>
+ <map>
+ <key>Comment</key>
+ <string>Use fully controllable gamma correction, instead of faster, hard-coded gamma correction of 2.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>RenderGlow</key>
+ <map>
+ <key>Comment</key>
+ <string>Render bloom post effect.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderGlowIterations</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of times to iterate the glow (higher = wider and smoother but slower)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>RenderGlowLumWeights</key>
+ <map>
+ <key>Comment</key>
+ <string>Weights for each color channel to be used in calculating luminance (should add up to 1.0)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>0.299</real>
+ <real>0.587</real>
+ <real>0.114</real>
+ </array>
+ </map>
+ <key>RenderGlowMaxExtractAlpha</key>
+ <map>
+ <key>Comment</key>
+ <string>Max glow alpha value for brightness extraction to auto-glow.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.065</real>
+ </map>
+ <key>RenderGlowMinLuminance</key>
+ <map>
+ <key>Comment</key>
+ <string>Min luminance intensity necessary to consider an object bright enough to automatically glow. (Gets clamped to 0 - 1.0 range)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>RenderGlowResolutionPow</key>
+ <map>
+ <key>Comment</key>
+ <string>Glow map resolution power of two.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>9</integer>
+ </map>
+ <key>RenderGlowStrength</key>
+ <map>
+ <key>Comment</key>
+ <string>Additive strength of glow.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.35</real>
+ </map>
+ <key>RenderGlowWarmthAmount</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount of warmth extraction to use (versus luminance extraction). 0 = lum, 1.0 = warmth</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>RenderGlowWarmthWeights</key>
+ <map>
+ <key>Comment</key>
+ <string>Weight of each color channel used before finding the max warmth</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>1.0</real>
+ <real>0.5</real>
+ <real>0.7</real>
+ </array>
+ </map>
+ <key>RenderGlowWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Glow sample size (higher = wider and softer but eventually more pixelated)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.3</real>
+ </map>
+ <key>RenderHUDInSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Display HUD attachments in snapshot</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderHiddenSelections</key>
+ <map>
+ <key>Comment</key>
+ <string>Show selection lines on objects that are behind other objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderHideGroupTitle</key>
+ <map>
+ <key>Comment</key>
+ <string>Don&apos;t show my group title in my name label</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderHideGroupTitleAll</key>
+ <map>
+ <key>Comment</key>
+ <string>Show group titles in name labels</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderInitError</key>
+ <map>
+ <key>Comment</key>
+ <string>Error occured while initializing GL</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderLightRadius</key>
+ <map>
+ <key>Comment</key>
+ <string>Render the radius of selected lights</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderLightingDetail</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount of detail for lighting objects/avatars/terrain (0=sun/moon only, 1=enable local lights)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderMaxPartCount</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum number of particles to display on screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>4096</integer>
+ </map>
+ <key>RenderMaxVBOSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum size of a vertex buffer (in KB).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>32</integer>
+ </map>
+ <key>RenderName</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls display of names above avatars (0 = never, 1 = fade, 2 = always)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>RenderNameFadeDuration</key>
+ <map>
+ <key>Comment</key>
+ <string>Time interval over which to fade avatar names (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>RenderNameHideSelf</key>
+ <map>
+ <key>Comment</key>
+ <string>Don&apos;t display own name above avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderNameShowTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Fade avatar names after specified time (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10</real>
+ </map>
+ <key>RenderObjectBump</key>
+ <map>
+ <key>Comment</key>
+ <string>Show bumpmapping on primitives</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderQualityPerformance</key>
+ <map>
+ <key>Comment</key>
+ <string>Which graphics settings you've chosen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderReflectionDetail</key>
+ <map>
+ <key>Comment</key>
+ <string>Detail of reflection render pass.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>RenderReflectionRes</key>
+ <map>
+ <key>Comment</key>
+ <string>Reflection map resolution.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>64</integer>
+ </map>
+ <key>RenderResolutionDivisor</key>
+ <map>
+ <key>Comment</key>
+ <string>Divisor for rendering 3D scene at reduced resolution.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderShaderLODThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Fraction of draw distance defining the switch to a different shader LOD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>1.0</integer>
+ </map>
+ <key>RenderSunDynamicRange</key>
+ <map>
+ <key>Comment</key>
+ <string>Defines what percent brighter the sun is than local point lights (1.0 = 100% brighter. Value should not be less than 0. ).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <integer>1.0</integer>
+ </map>
+ <key>RenderTerrainDetail</key>
+ <map>
+ <key>Comment</key>
+ <string>Detail applied to terrain texturing (0 = none, 1 or 2 = full)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>RenderTerrainLODFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls level of detail of terrain (multiplier for current screen area when calculated level of detail)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.0</real>
+ </map>
+ <key>RenderTerrainScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Terrain detail texture scale</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>12</real>
+ </map>
+ <key>RenderTreeLODFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls level of detail of vegetation (multiplier for current screen area when calculated level of detail)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>RenderUIInSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Display user interface in snapshot</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderUseCleverUI</key>
+ <map>
+ <key>Comment</key>
+ <string>Turns on the \"clever\" UI rendering optimization. It's a known performace gain (and enabled by default) on apple.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderUseFarClip</key>
+ <map>
+ <key>Comment</key>
+ <string>If false, frustum culling will ignore far clip plane.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderUseFBO</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether we want to use GL_EXT_framebuffer_objects.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderUseImpostors</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether we want to use impostors for far away avatars.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderUseShaderLOD</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether we want to have different shaders for LOD</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderUseShaderNearParticles</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether we want to use shaders on near particles</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderShaderParticleThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Fraction of draw distance to not use shader on particles</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.25</real>
+ </map>
+ <key>RenderVBOEnable</key>
+ <map>
+ <key>Comment</key>
+ <string>Use GL Vertex Buffer Objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderVolumeLODFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls level of detail of primitives (multiplier for current screen area when calculated level of detail)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>RenderWater</key>
+ <map>
+ <key>Comment</key>
+ <string>Display water</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderWaterMipNormal</key>
+ <map>
+ <key>Comment</key>
+ <string>Use mip maps for water normal map.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>RenderWaterReflections</key>
+ <map>
+ <key>Comment</key>
+ <string>Reflect the environment in the water.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderWaterRefResolution</key>
+ <map>
+ <key>Comment</key>
+ <string>Water planar reflection resolution.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>512</integer>
+ </map>
+ <key>RotateRight</key>
+ <map>
+ <key>Comment</key>
+ <string>Make the agent rotate to its right.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RotationStep</key>
+ <map>
+ <key>Comment</key>
+ <string>All rotations via rotation tool are constrained to multiples of this unit (degrees)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>RunBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RunMultipleThreads</key>
+ <map>
+ <key>Comment</key>
+ <string>If TRUE keep background threads active during render</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SafeMode</key>
+ <map>
+ <key>Comment</key>
+ <string>Reset preferences, run in safe mode.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScaleShowAxes</key>
+ <map>
+ <key>Comment</key>
+ <string>Show indicator of selected scale axis when scaling</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScaleStretchTextures</key>
+ <map>
+ <key>Comment</key>
+ <string>Stretch textures along with object when scaling</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ScaleUniform</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale selected objects evenly about center of selection</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScriptErrorColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of script error messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.819999992847442626953125</real>
+ <real>0.819999992847442626953125</real>
+ <real>0.9900000095367431640625</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ScriptErrorsAsChat</key>
+ <map>
+ <key>Comment</key>
+ <string>Display script errors and warning in chat history</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ScriptHelpFollowsCursor</key>
+ <map>
+ <key>Comment</key>
+ <string>Scripting help window updates contents based on script editor contents under text cursor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SearchURLDefault</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to load for empty searches</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://secondlife.com/app/search/index.php?</string>
+ </map>
+ <key>SearchURLQuery</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to use for searches</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&amp;s=[COLLECTION]&amp;</string>
+ </map>
+ <key>SearchURLSuffix2</key>
+ <map>
+ <key>Comment</key>
+ <string>Parameters added to end of search queries</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>lang=[LANG]&amp;m=[MATURE]&amp;t=[TEEN]&amp;region=[REGION]&amp;x=[X]&amp;y=[Y]&amp;z=[Z]&amp;session=[SESSION]</string>
+ </map>
+ <key>SelectMovableOnly</key>
+ <map>
+ <key>Comment</key>
+ <string>Select only objects you can move</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SelectOwnedOnly</key>
+ <map>
+ <key>Comment</key>
+ <string>Select only objects you own</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SelectionHighlightAlpha</key>
+ <map>
+ <key>Comment</key>
+ <string>Opacity of selection highlight (0.0 = completely transparent, 1.0 = completely opaque)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.4000000059604644775390625</real>
+ </map>
+ <key>SelectionHighlightAlphaTest</key>
+ <map>
+ <key>Comment</key>
+ <string>Alpha value below which pixels are displayed on selection highlight line (0.0 = show all pixels, 1.0 = show now pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>SelectionHighlightThickness</key>
+ <map>
+ <key>Comment</key>
+ <string>Thickness of selection highlight line (fraction of view distance)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.009999999776482582092285156</real>
+ </map>
+ <key>SelectionHighlightUAnim</key>
+ <map>
+ <key>Comment</key>
+ <string>Rate at which texture animates along U direction in selection highlight line (fraction of texture per second)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
+ <key>SelectionHighlightUScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale of texture display on selection highlight line (fraction of texture size)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.1000000014901161193847656</real>
+ </map>
+ <key>SelectionHighlightVAnim</key>
+ <map>
+ <key>Comment</key>
+ <string>Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
+ </map>
+ <key>SelectionHighlightVScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Scale of texture display on selection highlight line (fraction of texture size)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>ServerChoice</key>
+ <map>
+ <key>Comment</key>
+ <string>[DO NOT MODIFY] Controls which grid you connect to</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowAllObjectHoverTip</key>
+ <map>
+ <key>Comment</key>
+ <string>Show descriptive tooltip when mouse hovers over non-interactive and interactive objects.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowAxes</key>
+ <map>
+ <key>Comment</key>
+ <string>Render coordinate frame at your position</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowCameraControls</key>
+ <map>
+ <key>Comment</key>
+ <string>Display camera controls on login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowChatHistory</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowCommunicate</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowConsoleWindow</key>
+ <map>
+ <key>Comment</key>
+ <string>Show log in separate OS window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowCrosshairs</key>
+ <map>
+ <key>Comment</key>
+ <string>Display crosshairs when in mouselook mode</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowDebugConsole</key>
+ <map>
+ <key>Comment</key>
+ <string>Show log in SL window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowDebugStats</key>
+ <map>
+ <key>Comment</key>
+ <string>Show performance stats display</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowDepthBuffer</key>
+ <map>
+ <key>Comment</key>
+ <string>Show depth buffer contents</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowDirectory</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowEmptyFoldersWhenSearching</key>
+ <map>
+ <key>Comment</key>
+ <string>Shows folders that do not have any visible contents when applying a filter to inventory</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowHoverTips</key>
+ <map>
+ <key>Comment</key>
+ <string>Show descriptive tooltip when mouse hovers over items in world</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Open inventory window on login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowLandHoverTip</key>
+ <map>
+ <key>Comment</key>
+ <string>Show descriptive tooltip when mouse hovers over land</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowLeaders</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowMatureClassifieds</key>
+ <map>
+ <key>Comment</key>
+ <string>Display results of find classifieds that are flagged as mature</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowMatureEvents</key>
+ <map>
+ <key>Comment</key>
+ <string>Display results of find events that are flagged as mature</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowMatureFindAll</key>
+ <map>
+ <key>Comment</key>
+ <string>Display results of find all that are in mature sims</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowMatureGroups</key>
+ <map>
+ <key>Comment</key>
+ <string>Display results of find groups that are in flagged as mature</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowMatureSims</key>
+ <map>
+ <key>Comment</key>
+ <string>Display results of find places or find popular that are in mature sims</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowMiniMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Display mini map on login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowMovementControls</key>
+ <map>
+ <key>Comment</key>
+ <string>Display movement controls on login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowNearClip</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowNewInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Automatically views new notecards/textures/landmarks</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowObjectUpdates</key>
+ <map>
+ <key>Comment</key>
+ <string>Show when update messages are received for individual objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowOverlayTitle</key>
+ <map>
+ <key>Comment</key>
+ <string>Prints watermark text message on screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowParcelOwners</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowPermissions</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowPropertyLines</key>
+ <map>
+ <key>Comment</key>
+ <string>Show line overlay demarking property boundaries</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowSearchBar</key>
+ <map>
+ <key>Comment</key>
+ <string>Show the Search Bar in the Status Overlay</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowSelectionBeam</key>
+ <map>
+ <key>Comment</key>
+ <string>Show selection particle beam when selecting or interacting with objects.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowStartLocation</key>
+ <map>
+ <key>Comment</key>
+ <string>Display starting location menu on login screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowTangentBasis</key>
+ <map>
+ <key>Comment</key>
+ <string>Render normal and binormal (debugging bump mapping)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowToolBar</key>
+ <map>
+ <key>Comment</key>
+ <string>Show toolbar at bottom of screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ShowTools</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowVoiceChannelPopup</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls visibility of the current voice channel popup above the voice tab</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowVolumeSettingsPopup</key>
+ <map>
+ <key>Comment</key>
+ <string>Show individual volume slider for voice, sound effects, etc</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowWorldMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Display world map on login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowXUINames</key>
+ <map>
+ <key>Comment</key>
+ <string>Display XUI Names as Tooltips</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SitBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SkinFolder</key>
+ <map>
+ <key>Comment</key>
+ <string>The skin folder to use.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>SkyAmbientScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls strength of ambient, or non-directional light from the sun and moon (fraction or multiple of default ambient level)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.300000011920928955078125</real>
+ </map>
+ <key>SkyNightColorShift</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls moonlight color (base color applied to moon as light source)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color3</string>
+ <key>Value</key>
+ <array>
+ <real>0.699999988079071044921875</real>
+ <real>0.699999988079071044921875</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>SkyOverrideSimSunPosition</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SkySunDefaultPosition</key>
+ <map>
+ <key>Comment</key>
+ <string>Default position of sun in sky (direction in world coordinates)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Vector3</string>
+ <key>Value</key>
+ <array>
+ <real>1</real>
+ <real>0</real>
+ <real>0.1000000014901161193847656</real>
+ </array>
+ </map>
+ <key>SkyUseClassicClouds</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use the old Second Life particle clouds or not</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>SlideLeftBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>20</integer>
+ <integer>54</integer>
+ <integer>45</integer>
+ <integer>29</integer>
+ </array>
+ </map>
+ <key>SlideRightBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>66</integer>
+ <integer>54</integer>
+ <integer>91</integer>
+ <integer>29</integer>
+ </array>
+ </map>
+ <key>SmallAvatarNames</key>
+ <map>
+ <key>Comment</key>
+ <string>Display avatar name text in smaller font</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>SnapEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable snapping to grid</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>SnapMargin</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls maximum distance between windows before they auto-snap together (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>10</integer>
+ </map>
+ <key>SnapToMouseCursor</key>
+ <map>
+ <key>Comment</key>
+ <string>When snapping to grid, center object on nearest grid point to mouse cursor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SnapshotLocalLastResolution</key>
+ <map>
+ <key>Comment</key>
+ <string>Take next local snapshot at this resolution</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SnapshotPostcardLastResolution</key>
+ <map>
+ <key>Comment</key>
+ <string>Take next postcard snapshot at this resolution</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SnapshotQuality</key>
+ <map>
+ <key>Comment</key>
+ <string>Quality setting of postcard JPEGs (0 = worst, 100 = best)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>75</integer>
+ </map>
+ <key>SnapshotTextureLastResolution</key>
+ <map>
+ <key>Comment</key>
+ <string>Take next texture snapshot at this resolution</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SpeakingColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of various indicators when resident is speaking on a voice channel.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0</real>
+ <real>1</real>
+ <real>0</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>SpeedTest</key>
+ <map>
+ <key>Comment</key>
+ <string>Performance testing mode, no network</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>StatsAutoRun</key>
+ <map>
+ <key>Comment</key>
+ <string>Play back autopilot</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>StatsFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Filename for stats logging output</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>fs.txt</string>
+ </map>
+ <key>StatsNumRuns</key>
+ <map>
+ <key>Comment</key>
+ <string>Loop autopilot playback this number of times</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
+ <key>StatsPilotFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Filename for stats logging autopilot path</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>pilot.txt</string>
+ </map>
+ <key>StatsQuitAfterRuns</key>
+ <map>
+ <key>Comment</key>
+ <string>Quit application after this number of autopilot playback runs</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>StatsSessionTrackFrameStats</key>
+ <map>
+ <key>Comment</key>
+ <string>Track rendering and network statistics</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>StatsSummaryFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Filename for stats logging summary</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>fss.txt</string>
+ </map>
+ <key>StatusBarHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Height of menu/status bar at top of screen (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>26</integer>
+ </map>
+ <key>StatusBarPad</key>
+ <map>
+ <key>Comment</key>
+ <string>Spacing between popup buttons at bottom of screen (Stand up, Release Controls)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>10</integer>
+ </map>
+ <key>SystemChatColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of chat messages from SL System</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.800000011920928955078125</real>
+ <real>1</real>
+ <real>1</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>SystemLanguage</key>
+ <map>
+ <key>Comment</key>
+ <string>Language indicated by system settings (for XUI)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>en-us</string>
+ </map>
+ <key>TabToTextFieldsOnly</key>
+ <map>
+ <key>Comment</key>
+ <string>TAB key takes you to next text entry field, instead of next widget</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TerrainColorHeightRange</key>
+ <map>
+ <key>Comment</key>
+ <string>Altitude range over which a given terrain texture has effect (meters)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>60</real>
+ </map>
+ <key>TerrainColorStartHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>Starting altitude for terrain texturing (meters)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>20</real>
+ </map>
+ <key>TextureMemory</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount of memory to use for textures in MB (0 = autodetect)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>TexturePickerRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for texture picker</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>290</integer>
+ <integer>350</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>TexturePickerShowFolders</key>
+ <map>
+ <key>Comment</key>
+ <string>Show folders with no texures in texture picker</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>TexturePickerSortOrder</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>2</integer>
+ </map>
+ <key>ThirdPersonBtnState</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ThrottleBandwidthKBPS</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum allowable downstream bandwidth (kilo bits per second)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>500</real>
+ </map>
+ <key>ToolHelpRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>8</integer>
+ <integer>178</integer>
+ <integer>75</integer>
+ <integer>162</integer>
+ </array>
+ </map>
+ <key>ToolTipDelay</key>
+ <map>
+ <key>Comment</key>
+ <string>Seconds before displaying tooltip when mouse stops over UI element</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.699999988079071044921875</real>
+ </map>
+ <key>ToolboxAutoMove</key>
+ <map>
+ <key>Comment</key>
+ <string>[NOT USED]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ToolboxRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for tools window</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>0</integer>
+ <integer>100</integer>
+ <integer>100</integer>
+ <integer>100</integer>
+ </array>
+ </map>
+ <key>ToolboxShowMore</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to show additional build tool controls</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>TrackFocusObject</key>
+ <map>
+ <key>Comment</key>
+ <string>Camera tracks last object zoomed on</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>TurnLeftBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>20</integer>
+ <integer>29</integer>
+ <integer>45</integer>
+ <integer>4</integer>
+ </array>
+ </map>
+ <key>TurnRightBtnRect</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>66</integer>
+ <integer>29</integer>
+ <integer>91</integer>
+ <integer>4</integer>
+ </array>
+ </map>
+ <key>TypeAheadTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Time delay before clearing type-ahead buffer in lists (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1.5</real>
+ </map>
+ <key>UIAutoScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Keep UI scale consistent across different resolutions</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UIFloaterTestBool</key>
+ <map>
+ <key>Comment</key>
+ <string>Example saved setting for the test floater</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UIImgBtnCloseActiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string>
+ </map>
+ <key>UIImgBtnCloseInactiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>779e4fa3-9b13-f74a-fba9-3886fe9c86ba</string>
+ </map>
+ <key>UIImgBtnClosePressedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string>
+ </map>
+ <key>UIImgBtnForwardInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>54197a61-f5d1-4c29-95d2-c071d08849cb</string>
+ </map>
+ <key>UIImgBtnForwardOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>a0eb4021-1b20-4a53-892d-8faa9265a6f5</string>
+ </map>
+ <key>UIImgBtnJumpLeftInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1</string>
+ </map>
+ <key>UIImgBtnJumpLeftOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>3c18c87e-5f50-14e2-e744-f44734aa365f</string>
+ </map>
+ <key>UIImgBtnJumpRightInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7dabc040-ec13-2309-ddf7-4f161f6de2f4</string>
+ </map>
+ <key>UIImgBtnJumpRightOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>ff9a71eb-7414-4cf8-866e-a701deb7c3cf</string>
+ </map>
+ <key>UIImgBtnLeftInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>95463c78-aaa6-464d-892d-3a805b6bb7bf</string>
+ </map>
+ <key>UIImgBtnLeftOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>13a93910-6b44-45eb-ad3a-4d1324c59bac</string>
+ </map>
+ <key>UIImgBtnMinimizeActiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>34c9398d-bb78-4643-9633-46a2fa3e9637</string>
+ </map>
+ <key>UIImgBtnMinimizeInactiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>6e72abba-1378-437f-bf7a-f0c15f3e99a3</string>
+ </map>
+ <key>UIImgBtnMinimizePressedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>39801651-26cb-4926-af57-7af9352c273c</string>
+ </map>
+ <key>UIImgBtnMoveDownInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>b92a70b9-c841-4c94-b4b3-cee9eb460d48</string>
+ </map>
+ <key>UIImgBtnMoveDownOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>b5abc9fa-9e62-4e03-bc33-82c4c1b6b689</string>
+ </map>
+ <key>UIImgBtnMoveUpInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>49b4b357-e430-4b56-b9e0-05b8759c3c82</string>
+ </map>
+ <key>UIImgBtnMoveUpOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>f887146d-829f-4e39-9211-cf872b78f97c</string>
+ </map>
+ <key>UIImgBtnPanDownInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string>
+ </map>
+ <key>UIImgBtnPanDownOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string>
+ </map>
+ <key>UIImgBtnPanLeftInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string>
+ </map>
+ <key>UIImgBtnPanLeftOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string>
+ </map>
+ <key>UIImgBtnPanRightInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string>
+ </map>
+ <key>UIImgBtnPanRightOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string>
+ </map>
+ <key>UIImgBtnPanUpInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string>
+ </map>
+ <key>UIImgBtnPanUpOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string>
+ </map>
+ <key>UIImgBtnRestoreActiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>111b39de-8928-4690-b7b2-e17d5c960277</string>
+ </map>
+ <key>UIImgBtnRestoreInactiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>0eafa471-70af-4882-b8c1-40a310929744</string>
+ </map>
+ <key>UIImgBtnRestorePressedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>90a0ed5c-2e7b-4845-9958-a64a1b30f312</string>
+ </map>
+ <key>UIImgBtnRightInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5e616d0d-4335-476f-9977-560bccd009da</string>
+ </map>
+ <key>UIImgBtnRightOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5a44fd04-f52b-4c30-8b00-4a31e27614bd</string>
+ </map>
+ <key>UIImgBtnScrollDownInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>d2421bab-2eaf-4863-b8f6-5e4c52519247</string>
+ </map>
+ <key>UIImgBtnScrollDownOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>b4ecdecf-5c8d-44e7-b882-17a77e88ed55</string>
+ </map>
+ <key>UIImgBtnScrollLeftInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>ea137a32-6718-4d05-9c22-7d570d27b2cd</string>
+ </map>
+ <key>UIImgBtnScrollLeftOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>43773e8d-49aa-48e0-80f3-a04715f4677a</string>
+ </map>
+ <key>UIImgBtnScrollRightInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>b749de64-e903-4c3c-ac0b-25fb6fa39cb5</string>
+ </map>
+ <key>UIImgBtnScrollRightOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>3d700d19-e708-465d-87f2-46c8c0ee7938</string>
+ </map>
+ <key>UIImgBtnScrollUpInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>a93abdf3-27b5-4e22-a8fa-c48216cd2e3a</string>
+ </map>
+ <key>UIImgBtnScrollUpOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>dad084d7-9a46-452a-b0ff-4b9f1cefdde9</string>
+ </map>
+ <key>UIImgBtnSlideLeftInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>724996f5-b956-46f6-9844-4fcfce1d5e83</string>
+ </map>
+ <key>UIImgBtnSlideLeftOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>82476321-0374-4c26-9567-521535ab4cd7</string>
+ </map>
+ <key>UIImgBtnSlideRightInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7eeb57d2-3f37-454d-a729-8b217b8be443</string>
+ </map>
+ <key>UIImgBtnSlideRightOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>1fbe4e60-0607-44d1-a50a-032eff56ae75</string>
+ </map>
+ <key>UIImgBtnSpinDownInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>a985ac71-052f-48e6-9c33-d931c813ac92</string>
+ </map>
+ <key>UIImgBtnSpinDownOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>b6d240dd-5602-426f-b606-bbb49a30726d</string>
+ </map>
+ <key>UIImgBtnSpinUpInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c8450082-96a0-4319-8090-d3ff900b4954</string>
+ </map>
+ <key>UIImgBtnSpinUpOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>56576e6e-6710-4e66-89f9-471b59122794</string>
+ </map>
+ <key>UIImgBtnTabBottomInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c001d8fd-a869-4b6f-86a1-fdcb106df9c7</string>
+ </map>
+ <key>UIImgBtnTabBottomOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>bf0a8779-689b-48c3-bb9a-6af546366ef4</string>
+ </map>
+ <key>UIImgBtnTabBottomPartialInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>eb0b0904-8c91-4f24-b500-1180b91140de</string>
+ </map>
+ <key>UIImgBtnTabBottomPartialOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>8dca716c-b29c-403a-9886-91c028357d6e</string>
+ </map>
+ <key>UIImgBtnTabTopInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>16d032e8-817b-4368-8a4e-b7b947ae3889</string>
+ </map>
+ <key>UIImgBtnTabTopOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>1ed83f57-41cf-4052-a3b4-2e8bb78d8191</string>
+ </map>
+ <key>UIImgBtnTabTopPartialInUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7c6c6c26-0e25-4438-89bd-30d8b8e9d704</string>
+ </map>
+ <key>UIImgBtnTabTopPartialOutUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>932ad585-0e45-4a57-aa23-4cf81beeb7b0</string>
+ </map>
+ <key>UIImgBtnTearOffActiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string>
+ </map>
+ <key>UIImgBtnTearOffInactiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string>
+ </map>
+ <key>UIImgBtnTearOffPressedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>d2524c13-4ba6-af7c-e305-8ac6cc18d86a</string>
+ </map>
+ <key>UIImgCheckboxActiveSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>cf4a2ed7-1533-4686-9dde-df9a37ddca55</string>
+ </map>
+ <key>UIImgCheckboxActiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>05bb64ee-96fd-4243-b74e-f40a41bc53ba</string>
+ </map>
+ <key>UIImgCheckboxInactiveSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c817c642-9abd-4236-9287-ae0513fe7d2b</string>
+ </map>
+ <key>UIImgCheckboxInactiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7d94cb59-32a2-49bf-a516-9e5a2045f9d9</string>
+ </map>
+ <key>UIImgCreateSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>0098b015-3daf-4cfe-a72f-915369ea97c2</string>
+ </map>
+ <key>UIImgCreateUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b</string>
+ </map>
+ <key>UIImgCrosshairsUUID</key>
+ <map>
+ <key>Comment</key>
+ <string>Image to use for crosshair display (UUID texture reference)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>6e1a3980-bf2d-4274-8970-91e60d85fb52</string>
+ </map>
+ <key>UIImgDefaultEyesUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>6522e74d-1660-4e7f-b601-6f48c1659a77</string>
+ </map>
+ <key>UIImgDefaultGlovesUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDefaultHairUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7ca39b4c-bd19-4699-aff7-f93fd03d3e7b</string>
+ </map>
+ <key>UIImgDefaultJacketUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDefaultPantsUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDefaultShirtUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDefaultShoesUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDefaultSkirtUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDefaultSocksUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDefaultUnderwearUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIImgDirectionArrowUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>586383e8-4d9b-4fba-9196-2b5938e79c2c</string>
+ </map>
+ <key>UIImgFaceSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>b4870163-6208-42a9-9801-93133bf9a6cd</string>
+ </map>
+ <key>UIImgFaceUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>ce15fd63-b0b6-463c-a37d-ea6393208b3e</string>
+ </map>
+ <key>UIImgFocusSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>ab6a730e-ddfd-4982-9a32-c6de3de6d31d</string>
+ </map>
+ <key>UIImgFocusUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>57bc39d1-288c-4519-aea6-6d1786a5c274</string>
+ </map>
+ <key>UIImgGrabSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c1e21504-f136-451d-b8e9-929037812f1d</string>
+ </map>
+ <key>UIImgGrabUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c63f124c-6340-4fbf-b59e-0869a44adb64</string>
+ </map>
+ <key>UIImgMoveSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>46f17c7b-8381-48c3-b628-6a406e060dd6</string>
+ </map>
+ <key>UIImgMoveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>2fa5dc06-bcdd-4e09-a426-f9f262d4fa65</string>
+ </map>
+ <key>UIImgRadioActiveSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>52f09e07-5816-4052-953c-94c6c10479b7</string>
+ </map>
+ <key>UIImgRadioActiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7a1ba9b8-1047-4d1e-9cfc-bc478c80b63f</string>
+ </map>
+ <key>UIImgRadioInactiveSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>1975db39-aa29-4251-aea0-409ac09d414d</string>
+ </map>
+ <key>UIImgRadioInactiveUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>90688481-67ff-4af0-be69-4aa084bcad1e</string>
+ </map>
+ <key>UIImgResizeBottomRightUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>e3690e25-9690-4f6c-a745-e7dcd885285a</string>
+ </map>
+ <key>UIImgRotateSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>cdfb7fde-0d13-418a-9d89-2bd91019fc95</string>
+ </map>
+ <key>UIImgRotateUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c34b1eaa-aae3-4351-b082-e26c0b636779</string>
+ </map>
+ <key>UIImgScaleSelectedUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>55aa57ef-508a-47f7-8867-85d21c5a810d</string>
+ </map>
+ <key>UIImgScaleUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>88a90fef-b448-4883-9344-ecf378a60433</string>
+ </map>
+ <key>UIImgWhiteUUID</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
+ </map>
+ <key>UIScaleFactor</key>
+ <map>
+ <key>Comment</key>
+ <string>Size of UI relative to default layout on 1024x768 screen</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>1</real>
+ </map>
+ <key>UISndAlert</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for alerts (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>ed124764-705d-d497-167a-182cd9fa2e6c</string>
+ </map>
+ <key>UISndBadKeystroke</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for invalid keystroke (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>2ca849ba-2885-4bc3-90ef-d4987a5b983a</string>
+ </map>
+ <key>UISndClick</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for mouse click (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string>
+ </map>
+ <key>UISndClickRelease</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for mouse button release (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string>
+ </map>
+ <key>UISndDebugSpamToggle</key>
+ <map>
+ <key>Comment</key>
+ <string>Log UI sound effects as they are played</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UISndHealthReductionF</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for female pain (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>219c5d93-6c09-31c5-fb3f-c5fe7495c115</string>
+ </map>
+ <key>UISndHealthReductionM</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for male pain (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>e057c244-5768-1056-c37e-1537454eeb62</string>
+ </map>
+ <key>UISndHealthReductionThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount of health reduction required to trigger &quot;pain&quot; sound</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10</real>
+ </map>
+ <key>UISndInvalidOp</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for invalid operations (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>4174f859-0d3d-c517-c424-72923dc21f65</string>
+ </map>
+ <key>UISndMoneyChangeDown</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for L$ balance increase (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>104974e3-dfda-428b-99ee-b0d4e748d3a3</string>
+ </map>
+ <key>UISndMoneyChangeThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Amount of change in L$ balance required to trigger &quot;money&quot; sound</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>50</real>
+ </map>
+ <key>UISndMoneyChangeUp</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for L$ balance decrease(uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>77a018af-098e-c037-51a6-178f05877c6f</string>
+ </map>
+ <key>UISndNewIncomingIMSession</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for new instant message session(uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>67cc2844-00f3-2b3c-b991-6418d01e1bb7</string>
+ </map>
+ <key>UISndObjectCreate</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for object creation (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>f4a0660f-5446-dea2-80b7-6482a082803c</string>
+ </map>
+ <key>UISndObjectDelete</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for object deletion (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>0cb7b00a-4c10-6948-84de-a93c09af2ba9</string>
+ </map>
+ <key>UISndObjectRezIn</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for rezzing objects (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>3c8fc726-1fd6-862d-fa01-16c5b2568db6</string>
+ </map>
+ <key>UISndObjectRezOut</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for derezzing objects (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>00000000-0000-0000-0000-000000000000</string>
+ </map>
+ <key>UISndPieMenuAppear</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for opening pie menu (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>8eaed61f-92ff-6485-de83-4dcc938a478e</string>
+ </map>
+ <key>UISndPieMenuHide</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for closing pie menu (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>00000000-0000-0000-0000-000000000000</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight0</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 0 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>d9f73cf8-17b4-6f7a-1565-7951226c305d</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight1</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 1 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>f6ba9816-dcaf-f755-7b67-51b31b6233e5</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight2</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 2 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>7aff2265-d05b-8b72-63c7-dbf96dc2f21f</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight3</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 3 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>09b2184e-8601-44e2-afbb-ce37434b8ba1</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight4</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 4 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>bbe4c7fc-7044-b05e-7b89-36924a67593c</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight5</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 5 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>d166039b-b4f5-c2ec-4911-c85c727b016c</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight6</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 6 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>242af82b-43c2-9a3b-e108-3b0c7e384981</string>
+ </map>
+ <key>UISndPieMenuSliceHighlight7</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for selecting pie menu item 7 (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c1f334fb-a5be-8fe7-22b3-29631c21cf0b</string>
+ </map>
+ <key>UISndSnapshot</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for taking a snapshot (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>3d09f582-3851-c0e0-f5ba-277ac5c73fb4</string>
+ </map>
+ <key>UISndStartIM</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for starting a new IM session (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c825dfbc-9827-7e02-6507-3713d18916c1</string>
+ </map>
+ <key>UISndTeleportOut</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for teleporting (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>d7a9a565-a013-2a69-797d-5332baa1a947</string>
+ </map>
+ <key>UISndTyping</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for starting to type a chat message (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>5e191c7b-8996-9ced-a177-b2ac32bfea06</string>
+ </map>
+ <key>UISndWindowClose</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for closing a window (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>2c346eda-b60c-ab33-1119-b8941916a499</string>
+ </map>
+ <key>UISndWindowOpen</key>
+ <map>
+ <key>Comment</key>
+ <string>Sound file for opening a window (uuid for sound asset)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>c80260ba-41fd-8a46-768a-6bf236360e3a</string>
+ </map>
+ <key>UseAltKeyForMenus</key>
+ <map>
+ <key>Comment</key>
+ <string>Access menus via keyboard by tapping Alt</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseChatBubbles</key>
+ <map>
+ <key>Comment</key>
+ <string>Show chat above avatars head in chat bubbles</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseDebugLogin</key>
+ <map>
+ <key>Comment</key>
+ <string>Provides extra control over which grid to connect to</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseDebugMenus</key>
+ <map>
+ <key>Comment</key>
+ <string>Turns on &quot;Debug&quot; menu</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseDefaultColorPicker</key>
+ <map>
+ <key>Comment</key>
+ <string>Use color picker supplied by operating system</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseEnergy</key>
+ <map>
+ <key>Comment</key>
+ <string />
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UseExternalBrowser</key>
+ <map>
+ <key>Comment</key>
+ <string>Use default browser when opening web pages instead of in-world browser.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseFreezeFrame</key>
+ <map>
+ <key>Comment</key>
+ <string>Freeze time when taking snapshots.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UseOcclusion</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable object culling based on occlusion (coverage) by other objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>UseWebPagesOnPrims</key>
+ <map>
+ <key>Comment</key>
+ <string>[NOT USED]</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UserConnectionPort</key>
+ <map>
+ <key>Comment</key>
+ <string>Port that this client transmits on.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>UserLogFile</key>
+ <map>
+ <key>Comment</key>
+ <string>User specified log file name.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>UserLoginInfo</key>
+ <map>
+ <key>Comment</key>
+ <string>Users loging data.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>LLSD</string>
+ <key>Value</key>
+ <map />
+ </map>
+ <key>UserSettingsFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Persisted client settings file name (per user).</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>VFSOldSize</key>
+ <map>
+ <key>Comment</key>
+ <string>[DO NOT MODIFY] Controls resizing of local file cache</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VFSSalt</key>
+ <map>
+ <key>Comment</key>
+ <string>[DO NOT MODIFY] Controls local file caching behavior</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>VectorizeEnable</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable general vector operations and data alignment.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VectorizePerfTest</key>
+ <map>
+ <key>Comment</key>
+ <string>Test SSE/vectorization performance and choose fastest version.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>VectorizeProcessor</key>
+ <map>
+ <key>Comment</key>
+ <string>0=Compiler Default, 1=SSE, 2=SSE2, autodetected</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VectorizeSkin</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable vector operations for avatar skinning.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>VelocityInterpolate</key>
+ <map>
+ <key>Comment</key>
+ <string>Extrapolate object motion from last packet based on received velocity</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>VerboseLogs</key>
+ <map>
+ <key>Comment</key>
+ <string>Display source file and line number for each log item for debugging purposes</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VersionChannelName</key>
+ <map>
+ <key>Comment</key>
+ <string>Versioning Channel Name.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Second Life Release</string>
+ </map>
+ <key>VertexShaderEnable</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable/disable all GLSL shaders (debug)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VivoxDebugLevel</key>
+ <map>
+ <key>Comment</key>
+ <string>Logging level to use when launching the vivox daemon</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>-1</string>
+ </map>
+ <key>VivoxDebugServerName</key>
+ <map>
+ <key>Comment</key>
+ <string>Hostname of the vivox account server to use for voice when not connected to Agni.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>bhd.vivox.com</string>
+ </map>
+ <key>VoiceCallsFriendsOnly</key>
+ <map>
+ <key>Comment</key>
+ <string>Only accept voice calls from residents on your friends list</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VoiceEarLocation</key>
+ <map>
+ <key>Comment</key>
+ <string>Location of the virtual ear for voice</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>VoiceHost</key>
+ <map>
+ <key>Comment</key>
+ <string>Client SLVoice host to connect to</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>127.0.0.1</string>
+ </map>
+ <key>VoiceImageLevel0</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture UUID for voice image level 0</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>041ee5a0-cb6a-9ac5-6e49-41e9320507d5</string>
+ </map>
+ <key>VoiceImageLevel1</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture UUID for voice image level 1</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>29de489d-0491-fb00-7dab-f9e686d31e83</string>
+ </map>
+ <key>VoiceImageLevel2</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture UUID for voice image level 2</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>29de489d-0491-fb00-7dab-f9e686d31e83</string>
+ </map>
+ <key>VoiceImageLevel3</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture UUID for voice image level 3</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>29de489d-0491-fb00-7dab-f9e686d31e83</string>
+ </map>
+ <key>VoiceImageLevel4</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture UUID for voice image level 4</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>29de489d-0491-fb00-7dab-f9e686d31e83</string>
+ </map>
+ <key>VoiceImageLevel5</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture UUID for voice image level 5</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>29de489d-0491-fb00-7dab-f9e686d31e83</string>
+ </map>
+ <key>VoiceImageLevel6</key>
+ <map>
+ <key>Comment</key>
+ <string>Texture UUID for voice image level 6</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>29de489d-0491-fb00-7dab-f9e686d31e83</string>
+ </map>
+ <key>VoiceInputAudioDevice</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio input device to use for voice</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
+ <key>VoiceOutputAudioDevice</key>
+ <map>
+ <key>Comment</key>
+ <string>Audio output device to use for voice</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Default</string>
+ </map>
+ <key>VoicePort</key>
+ <map>
+ <key>Comment</key>
+ <string>Client SLVoice port to connect to</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>44124</integer>
+ </map>
+ <key>WarnAboutBadPCI</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables AboutBadPCI warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnAboutDirectX9</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables AboutDirectX9 warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnAboutOldGraphicsDriver</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables AboutOldGraphicsDriver warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnAboutPCIGraphics</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables AboutPCIGraphics warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnBrowserLaunch</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables BrowserLaunch warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnDeedObject</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables DeedObject warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstAppearance</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstAppearance warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstAttach</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstAttach warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstBalanceDecrease</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstBalanceDecrease warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstBalanceIncrease</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstBalanceIncrease warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstBuild</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstBuild warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstDebugMenus</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstDebugMenus warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstFlexible</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstFlexible warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstGoTo</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstGoTo warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstInventory</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstInventory warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstLeftClickNoHit</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstLeftClickNoHit warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstMap</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstMap warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstOverrideKeys</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstOverrideKeys warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstSandbox</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstSandbox warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstSculptedPrim</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstSculptedPrim warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstSit</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstSit warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstStreamingMusic</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstStreamingMusic warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstStreamingVideo</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstStreamingVideo warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstTeleport</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstTeleport warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnFirstVoice</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables FirstVoice warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnNewClassified</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables NewClassified warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnQuickTimeInstalled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables QuickTimeInstalled warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WarnReturnToOwner</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables ReturnToOwner warning dialog</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WindLightUseAtmosShaders</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to enable or disable WindLight atmospheric shaders.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WindowHeight</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer window height</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>700</integer>
+ </map>
+ <key>WindowMaximized</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer window maximized on login</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WindowWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>SL viewer window width</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>1000</integer>
+ </map>
+ <key>WindowX</key>
+ <map>
+ <key>Comment</key>
+ <string>X coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>10</integer>
+ </map>
+ <key>WindowY</key>
+ <map>
+ <key>Comment</key>
+ <string>Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>10</integer>
+ </map>
+ <key>WLSkyDetail</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls vertex detail on the WindLight sky. Lower numbers will give better performance and uglier skies.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>64</integer>
+ </map>
+ <key>XferThrottle</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum allowable downstream bandwidth for asset transfers (bits per second)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>150000</real>
+ </map>
+ <key>YawFromMousePosition</key>
+ <map>
+ <key>Comment</key>
+ <string>Horizontal range over which avatar head tracks mouse position (degrees of head rotation from left of window to right)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>90</real>
+ </map>
+ <key>YieldTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Yield some time to the local host.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
+ <key>ZoomTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Time of transition between different camera modes (seconds)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.4000000059604644775390625</real>
+ </map>
+ <key>llOwnerSayChatColor</key>
+ <map>
+ <key>Comment</key>
+ <string>Color of chat messages from objects only visible to the owner</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Color4</string>
+ <key>Value</key>
+ <array>
+ <real>0.9900000095367431640625</real>
+ <real>0.9900000095367431640625</real>
+ <real>0.689999997615814208984375</real>
+ <real>1</real>
+ </array>
+ </map>
+ <key>ParcelMediaAutoPlayEnable</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto play parcel media when available</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>particlesbeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight particle generators</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>physicalbeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight physical objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>renderbeacons</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight particle generators</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>renderhighlights</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight scripted objects with touch function</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>scriptsbeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight scripted objects</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>scripttouchbeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight scripted objects with touch function</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>soundsbeacon</key>
+ <map>
+ <key>Comment</key>
+ <string>Beacon / Highlight sound generators</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SkyEditPresets</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to be able to edit the sky defaults or not</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>WaterGLFogDepthFloor</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls how dark water gl fog can get</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.25</real>
+ </map>
+ <key>WaterGLFogDepthScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls how quickly gl fog gets dark under water</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>50.0</real>
+ </map>
+ <key>WaterGLFogDensityScale</key>
+ <map>
+ <key>Comment</key>
+ <string>Maps shader water fog density to gl fog density</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.02</real>
+ </map>
+ <key>EnableRippleWater</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to use ripple water shader or not</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>WaterEditPresets</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to be able to edit the water defaults or not</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>FloaterEnvRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Environment Editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>50</integer>
+ <integer>150</integer>
+ <integer>650</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterAdvancedSkyRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Advanced Sky Editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>50</integer>
+ <integer>220</integer>
+ <integer>450</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterDayCycleRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Day Cycle Editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>50</integer>
+ <integer>450</integer>
+ <integer>300</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>FloaterAdvancedWaterRect</key>
+ <map>
+ <key>Comment</key>
+ <string>Rectangle for Advanced Water Editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Rect</string>
+ <key>Value</key>
+ <array>
+ <integer>50</integer>
+ <integer>220</integer>
+ <integer>450</integer>
+ <integer>0</integer>
+ </array>
+ </map>
+ <key>AlertedUnsupportedHardware</key>
+ <map>
+ <key>Comment</key>
+ <string>Toggle that lets us tell the user he's on old hardware only once</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>RenderFastAlpha</key>
+ <map>
+ <key>Comment</key>
+ <string>Use lossy alpha rendering optimization (opaque/nonexistent small alpha faces).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/settings_crash_behavior.xml b/indra/newview/app_settings/settings_crash_behavior.xml
new file mode 100644
index 0000000000..cc7f5ac88b
--- /dev/null
+++ b/indra/newview/app_settings/settings_crash_behavior.xml
@@ -0,0 +1,15 @@
+<llsd>
+ <map>
+ <key>CrashSubmitBehavior</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls behavior when viewer crashes (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml
new file mode 100644
index 0000000000..997bb0c33c
--- /dev/null
+++ b/indra/newview/app_settings/settings_files.xml
@@ -0,0 +1,22 @@
+<llsd>
+ <map>
+ <key>Files</key>
+ <map>
+ <key>Comment</key>
+ <string>List of settings files to load. Key is the identifier, value is the filename</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>LLSD</string>
+ <key>Value</key>
+ <map>
+ <key>Global</key>
+ <string>settings.xml</string>
+ <key>PerAccount</key>
+ <string>settings_per_account.xml</string>
+ <key>CrashSettings</key>
+ <string>settings_crash_behavior.xml</string>
+ </map>
+ </map>
+ </map>
+</llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
new file mode 100644
index 0000000000..90c7b11637
--- /dev/null
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -0,0 +1,114 @@
+<llsd>
+ <map>
+ <key>BusyModeResponse</key>
+ <map>
+ <key>Comment</key>
+ <string>Auto response to instant messages while in busy mode.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
+ </map>
+ <key>IMLogTimestamp</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Timestamp of Instant Messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>InstantMessageLogPath</key>
+ <map>
+ <key>Comment</key>
+ <string>Path to your log files.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
+ <key>LastLogoff</key>
+ <map>
+ <key>Comment</key>
+ <string>Last logoff</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogChat</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogChatIM</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Incoming Instant Messages with Chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogChatTimestamp</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Timestamp of Chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogInstantMessages</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Instant Messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LogShowHistory</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Show History</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>LogTimestampDate</key>
+ <map>
+ <key>Comment</key>
+ <string>Include Date with Timestamp</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ </map>
+</llsd>
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 420f0811ff..2fe23c9a51 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -917,19 +917,19 @@ Function .onInit
; generate language ID that will be used as a command line arg
StrCmp $LANGUAGE "1042" 0 +3
- StrCpy $LANGFLAGS " -set SystemLanguage ko"
+ StrCpy $LANGFLAGS " --set SystemLanguage ko"
Goto EndOfFunc
StrCmp $LANGUAGE "1041" 0 +3
- StrCpy $LANGFLAGS " -set SystemLanguage ja"
+ StrCpy $LANGFLAGS " --set SystemLanguage ja"
Goto EndOfFunc
StrCmp $LANGUAGE "1031" 0 +3
- StrCpy $LANGFLAGS " -set SystemLanguage de"
+ StrCpy $LANGFLAGS " --set SystemLanguage de"
Goto EndOfFunc
StrCmp $LANGUAGE "1033" 0 +3
- StrCpy $LANGFLAGS " -set SystemLanguage en-us"
+ StrCpy $LANGFLAGS " --set SystemLanguage en-us"
Goto EndOfFunc
EndOfFunc:
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index ac92ee8525..4dab653d19 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -273,8 +273,7 @@ void LLAgentFriendObserver::changed(U32 mask)
// LLAgent()
//-----------------------------------------------------------------------------
LLAgent::LLAgent()
-: mViewerPort(NET_USE_OS_ASSIGNED_PORT),
- mDrawDistance( DEFAULT_FAR_PLANE ),
+: mDrawDistance( DEFAULT_FAR_PLANE ),
mDoubleTapRunTimer(),
mDoubleTapRunMode(DOUBLETAP_NONE),
@@ -455,8 +454,6 @@ void LLAgent::init()
mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject");
// LLDebugVarMessageBox::show("Camera Lag", &CAMERA_FOCUS_HALF_LIFE, 0.5f, 0.01f);
- gSavedSettings.getControl("RenderHideGroupTitle")->addListener(&mHideGroupTitleListener);
- gSavedSettings.getControl("EffectColor")->addListener(&mEffectColorListener);
mEffectColor = gSavedSettings.getColor4("EffectColor");
@@ -7466,19 +7463,6 @@ void LLAgent::userRemoveAllAttachments( void* userdata )
gMessageSystem->sendReliable( gAgent.getRegionHost() );
}
-bool LLAgent::LLHideGroupTitleListener::handleEvent(LLPointer<LLEvent> event, const LLSD &userdata)
-{
- gAgent.setHideGroupTitle(event->getValue());
- return true;
-
-}
-
-bool LLAgent::LLEffectColorListener::handleEvent(LLPointer<LLEvent> event, const LLSD &userdata)
-{
- gAgent.setEffectColor(LLColor4(event->getValue()));
- return true;
-}
-
void LLAgent::observeFriends()
{
if(!mFriendObserver)
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 469d2e4fe0..50830a75f0 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -36,6 +36,7 @@
#include "indra_constants.h"
#include "llmath.h"
+#include "llcontrol.h"
#include "llcoordframe.h"
#include "llevent.h"
#include "llagentconstants.h"
@@ -225,8 +226,8 @@ public:
// update internal datastructures and update the server with the
// new contribution level. Returns true if the group id was found
// and contribution could be set.
- BOOL setGroupContribution(const LLUUID& group_id, S32 contribution);
- BOOL setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile);
+ BOOL setGroupContribution(const LLUUID& group_id, S32 contribution);
+ BOOL setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile);
void setHideGroupTitle(BOOL hide) { mHideGroupTitle = hide; }
//
@@ -686,7 +687,6 @@ protected:
BOOL notify = TRUE);
public:
// TODO: Make these private!
- U32 mViewerPort; // Port this agent transmits on.
LLUUID mSecureSessionID; // secure token for this login session
F32 mDrawDistance;
@@ -932,21 +932,6 @@ private:
LLPointer<LLRefCount> mCB;
};
- //control listeners
- class LLHideGroupTitleListener: public LLSimpleListener
- {
- public:
- bool handleEvent(LLPointer<LLEvent> event, const LLSD &userdata);
- };
-
- class LLEffectColorListener: public LLSimpleListener
- {
- public:
- bool handleEvent(LLPointer<LLEvent> event, const LLSD &userdata);
- };
-
- LLHideGroupTitleListener mHideGroupTitleListener;
- LLEffectColorListener mEffectColorListener;
LLFriendObserver* mFriendObserver;
};
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 8c7af9ebf7..ffa2a82646 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -62,10 +62,13 @@
#include "llmutelist.h"
#include "llurldispatcher.h"
#include "llurlhistory.h"
+#include "llfirstuse.h"
#include "llweb.h"
#include "llsecondlifeurls.h"
+#include <boost/bind.hpp>
+
#if LL_WINDOWS
#include "llwindebug.h"
#endif
@@ -153,10 +156,7 @@
#include "llinventoryview.h"
-// *FIX: Remove these once the command line params thing is figured out.
-// Yuck!
-static int gTempArgC = 0;
-static char** gTempArgV;
+#include "llcommandlineparser.h"
// *FIX: These extern globals should be cleaned up.
// The globals either represent state/config/resource-storage of either
@@ -169,7 +169,6 @@ static char** gTempArgV;
//----------------------------------------------------------------------------
// llviewernetwork.h
#include "llviewernetwork.h"
-// extern EGridInfo gGridChoice;
////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
@@ -216,14 +215,8 @@ extern BOOL gPeriodicSlowFrame;
////////////////////////////////////////////////////////////
// All from the last globals push...
-bool gVerifySSLCert = true;
BOOL gHandleKeysAsync = FALSE;
-BOOL gProbeHardware = TRUE; // Use DirectX 9 to probe for hardware
-
-S32 gYieldMS = 0; // set in parse_args, used in mainLoop
-BOOL gYieldTime = FALSE;
-
const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard
F32 gSimLastTime; // Used in LLAppViewer::init and send_stats()
@@ -234,21 +227,10 @@ LLString gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle
BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally
BOOL gAllowIdleAFK = TRUE;
-F32 gAFKTimeout = DEFAULT_AFK_TIMEOUT;
BOOL gShowObjectUpdates = FALSE;
-BOOL gLogMessages = FALSE;
-std::string gChannelName = LL_CHANNEL;
-BOOL gUseAudio = TRUE;
BOOL gUseQuickTime = TRUE;
-LLString gCmdLineFirstName;
-LLString gCmdLineLastName;
-LLString gCmdLinePassword;
-
-BOOL gAutoLogin = FALSE;
const char* DEFAULT_SETTINGS_FILE = "settings.xml";
-BOOL gRequestInventoryLibrary = TRUE;
-BOOL gGodConnect = FALSE;
BOOL gAcceptTOS = FALSE;
BOOL gAcceptCriticalMessage = FALSE;
@@ -279,7 +261,6 @@ F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME;
LLUUID gInventoryLibraryOwner;
LLUUID gInventoryLibraryRoot;
-BOOL gDisableVoice = FALSE;
BOOL gDisconnected = FALSE;
// Map scale in pixels per region
@@ -291,17 +272,11 @@ LLFrameTimer gRestoreGLTimer;
BOOL gRestoreGL = FALSE;
BOOL gUseWireframe = FALSE;
-F32 gMouseSensitivity = 3.f;
-BOOL gInvertMouse = FALSE;
-
// VFS globals - see llappviewer.h
LLVFS* gStaticVFS = NULL;
LLMemoryInfo gSysMemory;
-bool gPreloadImages = true;
-bool gPreloadSounds = true;
-
LLString gLastVersionChannel;
LLVector3 gWindVec(3.0, 3.0, 0.0);
@@ -311,34 +286,14 @@ U32 gPacketsIn = 0;
BOOL gPrintMessagesThisFrame = FALSE;
-BOOL gUseConsole = TRUE;
-
BOOL gRandomizeFramerate = FALSE;
BOOL gPeriodicSlowFrame = FALSE;
-BOOL gQAMode = FALSE;
BOOL gLLErrorActivated = FALSE;
-
////////////////////////////////////////////////////////////
// Internal globals... that should be removed.
-static F32 gQuitAfterSeconds = 0.f;
-static BOOL gRotateRight = FALSE;
-static BOOL gIgnorePixelDepth = FALSE;
-
-// Allow multiple viewers in ReleaseForDownload
-#if LL_RELEASE_FOR_DOWNLOAD
-static BOOL gMultipleViewersOK = FALSE;
-#else
-static BOOL gMultipleViewersOK = TRUE;
-#endif
-
-static std::map<std::string, std::string> gCommandLineSettings;
-static std::map<std::string, std::string> gCommandLineForcedSettings;
-
static LLString gArgs;
-static LLString gOldSettingsFileName;
-static const char* LEGACY_DEFAULT_SETTINGS_FILE = "settings.ini";
const char* MARKER_FILE_NAME = "SecondLife.exec_marker";
const char* ERROR_MARKER_FILE_NAME = "SecondLife.error_marker";
const char* LLERROR_MARKER_FILE_NAME = "SecondLife.llerror_marker";
@@ -360,52 +315,10 @@ std::string gLoginPage;
std::vector<std::string> gLoginURIs;
static std::string gHelperURI;
-static const char USAGE[] = "\n"
-"usage:\tviewer [options]\n"
-"options:\n"
-" -login <first> <last> <password> log in as a user\n"
-" -autologin log in as last saved user\n"
-" -loginpage <URL> login authentication page to use\n"
-" -loginuri <URI> login server and CGI script to use\n"
-" -helperuri <URI> helper web CGI prefix to use\n"
-" -settings <filename> specify the filename of a\n"
-" configuration file\n"
-" default is settings.xml\n"
-" -setdefault <variable> <value> specify the value of a particular\n"
-" configuration variable which can be\n"
-" overridden by settings.xml\n"
-" -set <variable> <value> specify the value of a particular\n"
-" configuration variable that\n"
-" overrides all other settings\n"
-#if !LL_RELEASE_FOR_DOWNLOAD
-" -sim <simulator_ip> specify the simulator ip address\n"
-#endif
-" -god log in as god if you have god access\n"
-" -purge delete files in cache\n"
-" -safe reset preferences, run in safe mode\n"
-" -noutc logs in local time, not UTC\n"
-" -nothread run vfs in single thread\n"
-" -noinvlib Do not request inventory library\n"
-" -multiple allow multiple viewers\n"
-" -nomultiple block multiple viewers\n"
-" -novoice disable voice\n"
-" -ignorepixeldepth ignore pixel depth settings\n"
-" -cooperative [ms] yield some idle time to local host\n"
-" -skin ui/branding skin folder to use\n"
-#if LL_WINDOWS
-" -noprobe disable hardware probe\n"
-#endif
-" -noquicktime disable QuickTime movies, speeds startup\n"
-" -nopreload don't preload UI images or sounds, speeds startup\n"
-// these seem to be unused
-//" -noenv turn off environmental effects\n"
-//" -proxy <proxy_ip> specify the proxy ip address\n"
-"\n";
-
void idle_afk_check()
{
// check idle timers
- if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gAFKTimeout))
+ if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getF32("AFKTimeout")))
{
gAgent.setAFK();
}
@@ -444,7 +357,7 @@ void request_initial_instant_messages()
// Use these strictly for things that are constructed at startup,
// or for things that are performance critical. JC
-static void saved_settings_to_globals()
+static void settings_to_globals()
{
LLBUTTON_H_PAD = gSavedSettings.getS32("ButtonHPad");
LLBUTTON_V_PAD = gSavedSettings.getS32("ButtonVPad");
@@ -482,15 +395,15 @@ static void saved_settings_to_globals()
gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");
gAllowIdleAFK = gSavedSettings.getBOOL("AllowIdleAFK");
- gAFKTimeout = gSavedSettings.getF32("AFKTimeout");
- gMouseSensitivity = gSavedSettings.getF32("MouseSensitivity");
- gInvertMouse = gSavedSettings.getBOOL("InvertMouse");
gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");
gMapScale = gSavedSettings.getF32("MapScale");
gMiniMapScale = gSavedSettings.getF32("MiniMapScale");
gHandleKeysAsync = gSavedSettings.getBOOL("AsyncKeyboard");
LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips");
+}
+static void settings_modify()
+{
LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderUseFBO");
LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors");
LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor");
@@ -532,367 +445,74 @@ static void saved_settings_to_globals()
// propagate push to talk preference to current status
gSavedSettings.setBOOL("PTTCurrentlyEnabled", gSavedSettings.getBOOL("EnablePushToTalk"));
-
- settings_setup_listeners();
-
- // gAgent.init() also loads from saved settings.
}
-int parse_args(int argc, char **argv)
+void initGridChoice()
{
- // Sometimes IP addresses passed in on the command line have leading
- // or trailing white space. Use LLString to clean that up.
- LLString ip_string;
- S32 j;
-
- for (j = 1; j < argc; j++)
- {
+ LLString gridChoice = gSavedSettings.getString("GridChoice");
+ if(!gridChoice.empty())
// Used to show first chunk of each argument passed in the
// window title.
- gArgs += argv[j];
- gArgs += " ";
-
- LLString argument = argv[j];
- if ((!strcmp(argv[j], "-port")) && (++j < argc))
- {
- sscanf(argv[j], "%u", &(gAgent.mViewerPort));
- }
- else if ((!strcmp(argv[j], "-drop")) && (++j < argc))
- {
- sscanf(argv[j], "%f", &gPacketDropPercentage);
- }
- else if ((!strcmp(argv[j], "-inbw")) && (++j < argc))
- {
- sscanf(argv[j], "%f", &gInBandwidth);
- }
- else if ((!strcmp(argv[j], "-outbw")) && (++j < argc))
- {
- sscanf(argv[j], "%f", &gOutBandwidth);
- }
- else if (!strcmp(argv[j], "--aditi"))
- {
- gGridChoice = GRID_INFO_ADITI;
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--agni"))
- {
- gGridChoice = GRID_INFO_AGNI;
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--aruna"))
- {
- gGridChoice = GRID_INFO_ARUNA;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--durga"))
- {
- gGridChoice = GRID_INFO_DURGA;
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--ganga"))
- {
- gGridChoice = GRID_INFO_GANGA;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--mitra"))
- {
- gGridChoice = GRID_INFO_MITRA;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--mohini"))
- {
- gGridChoice = GRID_INFO_MOHINI;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--nandi"))
- {
- gGridChoice = GRID_INFO_NANDI;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--radha"))
- {
- gGridChoice = GRID_INFO_RADHA;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--ravi"))
- {
- gGridChoice = GRID_INFO_RAVI;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--siva"))
- {
- gGridChoice = GRID_INFO_SIVA;
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--shakti"))
- {
- gGridChoice = GRID_INFO_SHAKTI;
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--soma"))
- {
- gGridChoice = GRID_INFO_SOMA;
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--uma"))
- {
- gGridChoice = GRID_INFO_UMA;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--vaak"))
- {
- gGridChoice = GRID_INFO_VAAK;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "--yami"))
- {
- gGridChoice = GRID_INFO_YAMI;
- sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
- }
- else if (!strcmp(argv[j], "-loginpage") && (++j < argc))
- {
- LLAppViewer::instance()->setLoginPage(utf8str_trim(argv[j]));
- }
- else if (!strcmp(argv[j], "-loginuri") && (++j < argc))
- {
- LLAppViewer::instance()->addLoginURI(utf8str_trim(argv[j]));
- }
- else if (!strcmp(argv[j], "-helperuri") && (++j < argc))
- {
- LLAppViewer::instance()->setHelperURI(utf8str_trim(argv[j]));
- }
- else if (!strcmp(argv[j], "-debugviews"))
- {
- LLView::sDebugRects = TRUE;
- }
- else if (!strcmp(argv[j], "-skin") && (++j < argc))
- {
- std::string folder(argv[j]);
- gDirUtilp->setSkinFolder(folder);
- }
- else if (!strcmp(argv[j], "-autologin") || !strcmp(argv[j], "--autologin")) // keep --autologin for compatibility
- {
- gAutoLogin = TRUE;
- }
- else if (!strcmp(argv[j], "-quitafter") && (++j < argc))
- {
- gQuitAfterSeconds = (F32)atof(argv[j]);
- }
- else if (!strcmp(argv[j], "-rotate"))
- {
- gRotateRight = TRUE;
- }
-// else if (!strcmp(argv[j], "-noenv"))
-// {
- //turn OFF environmental effects for slow machines/video cards
-// gRequestParaboloidMap = FALSE;
-// }
- else if (!strcmp(argv[j], "-noaudio"))
- {
- gUseAudio = FALSE;
- }
- else if (!strcmp(argv[j], "-nosound")) // tends to be popular cmdline on Linux.
- {
- gUseAudio = FALSE;
- }
- else if (!strcmp(argv[j], "-noprobe"))
- {
- gProbeHardware = FALSE;
- }
- else if (!strcmp(argv[j], "-noquicktime"))
- {
- // Developers can log in faster if they don't load all the
- // quicktime dlls.
- gUseQuickTime = false;
- }
- else if (!strcmp(argv[j], "-nopreload"))
- {
- // Developers can log in faster if they don't decode sounds
- // or images on startup, ~5 seconds faster.
- gPreloadSounds = false;
- gPreloadImages = false;
- }
- else if (!strcmp(argv[j], "-purge"))
- {
- LLAppViewer::instance()->purgeCache();
- }
- else if(!strcmp(argv[j], "-noinvlib"))
- {
- gRequestInventoryLibrary = FALSE;
- }
- else if (!strcmp(argv[j], "-log"))
- {
- gLogMessages = TRUE;
- continue;
- }
- else if (!strcmp(argv[j], "-logfile") && (++j < argc))
- {
- // *NOTE: This buffer size is hard coded into scanf() below.
- char logfile[256]; // Flawfinder: ignore
- sscanf(argv[j], "%255s", logfile); // Flawfinder: ignore
- llinfos << "Setting log file to " << logfile << llendl;
- LLFile::remove(logfile);
- LLError::logToFile(logfile);
- }
- else if (!strcmp(argv[j], "-settings") && (++j < argc))
- {
- gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, argv[j]);
- }
- else if (!strcmp(argv[j], "-setdefault") && (j + 2 < argc))
- {
- std::string control_name;
- std::string control_value;
-
- j++;
- if (argv[j]) control_name = std::string(argv[j]);
+ {
+ // find the grid choice from the user setting.
+ int gridIndex = GRID_INFO_NONE;
+ for(;gridIndex < GRID_INFO_OTHER; ++gridIndex )
+ {
+ if(0 == LLString::compareInsensitive(gGridInfo[gridIndex].mLabel, gridChoice.c_str()))
+ {
+ gGridChoice = (EGridInfo)gridIndex;
+
+ if(GRID_INFO_LOCAL == gGridChoice)
+ {
+ gGridName = LOOPBACK_ADDRESS_STRING;
+ break;
+ }
+ else
+ {
+ gGridName = gGridInfo[gGridChoice].mName;
+ break;
+ }
+ }
+ }
+
+ if(GRID_INFO_OTHER == gridIndex)
+ {
+ // *FIX:MEP Can and should we validate that this is an IP address?
+ gGridChoice = (EGridInfo)gridIndex;
+ gGridName = llformat("%s", gSavedSettings.getString("GridChoice").c_str());
+
+ }
+ }
- j++;
- if (argv[j]) control_value = std::string(argv[j]);
-
- // grab control name and value
- if (!control_name.empty())
- {
- gCommandLineSettings[control_name] = control_value;
- }
- }
- else if (!strcmp(argv[j], "-set") && (j + 2 < argc))
- {
- std::string control_name;
- std::string control_value;
-
- j++;
- if (argv[j]) control_name = std::string(argv[j]);
- j++;
- if (argv[j]) control_value = std::string(argv[j]);
-
- // grab control name and value
- if (!control_name.empty())
- {
- gCommandLineForcedSettings[control_name] = control_value;
- }
- }
- else if (!strcmp(argv[j], "-login"))
- {
- if (j + 3 < argc)
- {
- j++;
- gCmdLineFirstName = argv[j];
- j++;
- gCmdLineLastName = argv[j];
- j++;
- gCmdLinePassword = argv[j];
- }
- else
- {
- // only works if -login is last parameter on command line
- llerrs << "Not enough parameters to -login. Did you mean -loginuri?" << llendl;
- }
- }
- else if (!strcmp(argv[j], "-god"))
- {
- gGodConnect = TRUE;
- }
- else if (!strcmp(argv[j], "-noconsole"))
- {
- gUseConsole = FALSE;
- }
- else if (!strcmp(argv[j], "-safe"))
- {
- llinfos << "Setting viewer feature table to run in safe mode, resetting prefs" << llendl;
- gFeatureManagerp->setSafe(TRUE);
- }
- else if (!strcmp(argv[j], "-multiple"))
- {
- gMultipleViewersOK = TRUE;
- }
- else if (!strcmp(argv[j], "-nomultiple"))
- {
- gMultipleViewersOK = FALSE;
- }
- else if (!strcmp(argv[j], "-novoice"))
- {
- gDisableVoice = TRUE;
- }
- else if (!strcmp(argv[j], "-nothread"))
- {
- LLVFile::ALLOW_ASYNC = FALSE;
- llinfos << "Running VFS in nothread mode" << llendl;
- }
- // some programs don't respect the command line options in protocol handlers (I'm looking at you, Opera)
- // so this allows us to parse the URL straight off the command line without a "-url" paramater
- else if (LLURLDispatcher::isSLURL(argv[j])
- || !strcmp(argv[j], "-url") && (++j < argc))
+#if !LL_RELEASE_FOR_DOWNLOAD
+ if (gGridChoice == GRID_INFO_NONE)
+ {
+ // Development version: load last server choice by default (overridden by cmd line args)
+ S32 server = gSavedSettings.getS32("ServerChoice");
+ if (server != 0)
+ gGridChoice = (EGridInfo)llclamp(server, 0, (S32)GRID_INFO_COUNT - 1);
+ if (server == GRID_INFO_OTHER)
{
- std::string slurl = argv[j];
- if (LLURLDispatcher::isSLURLCommand(slurl))
+ LLString custom_server = gSavedSettings.getString("CustomServer");
+ if (custom_server.empty())
{
- LLStartUp::sSLURLCommand = slurl;
+ gGridName = "none";
}
else
{
- LLURLSimString::setString(slurl);
+ gGridName = custom_server.c_str();
}
- // *NOTE: After setting the url, bail. What can happen is
- // that someone can use IE (or potentially other browsers)
- // and do the rough equivalent of command injection and
- // steal passwords. Phoenix. SL-55321
- return 0;
- }
- else if (!strcmp(argv[j], "-ignorepixeldepth"))
- {
- gIgnorePixelDepth = TRUE;
- }
- else if (!strcmp(argv[j], "-cooperative"))
- {
- S32 ms_to_yield = 0;
- if(++j < argc)
- {
- S32 rv = sscanf(argv[j], "%d", &ms_to_yield);
- if(0 == rv)
- {
- --j;
- }
- }
- else
- {
- --j;
- }
- gYieldMS = ms_to_yield;
- gYieldTime = TRUE;
- }
- else if (!strcmp(argv[j], "-no-verify-ssl-cert"))
- {
- gVerifySSLCert = false;
- }
- else if ( (!strcmp(argv[j], "--channel") || !strcmp(argv[j], "-channel")) && (++j < argc))
- {
- gChannelName = argv[j];
- }
-#if LL_DARWIN
- else if (!strncmp(argv[j], "-psn_", 5))
- {
- // this is the Finder passing the process session number
- // we ignore this
}
+ gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mName);
+ }
#endif
- else if(!strncmp(argv[j], "-qa", 3))
- {
- gQAMode = TRUE;
- }
- else
- {
- // DBC - Mac OS X passes some stuff by default on the command line (e.g. psn).
- // Second Life URLs are passed this way as well?
- llwarns << "Possible unknown keyword " << argv[j] << llendl;
-
- // print usage information
- llinfos << USAGE << llendl;
- // return 1;
- }
+ if (gGridChoice == GRID_INFO_NONE)
+ {
+ gGridChoice = GridDefaultChoice;
+ gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mName);
}
- return 0;
}
bool send_url_to_other_instance(const std::string& url)
@@ -938,11 +558,12 @@ LLAppViewer::LLAppViewer() :
mReportedCrash(false),
mNumSessions(0),
mPurgeCache(false),
- mPurgeOnExit(false),
- mSecondInstance(false),
+ mPurgeOnExit(false),
+ mSecondInstance(false),
mSavedFinalSnapshot(false),
- mQuitRequested(false),
- mLogoutRequestSent(false)
+ mQuitRequested(false),
+ mLogoutRequestSent(false),
+ mYieldTime(-1)
{
if(NULL != sInstance)
{
@@ -958,13 +579,6 @@ LLAppViewer::~LLAppViewer()
removeMarkerFile();
}
-bool LLAppViewer::tempStoreCommandOptions(int argc, char** argv)
-{
- gTempArgC = argc;
- gTempArgV = argv;
- return true;
-}
-
bool LLAppViewer::init()
{
// *NOTE:Mani - LLCurl::initClass is not thread safe.
@@ -973,7 +587,6 @@ bool LLAppViewer::init()
initThreads();
- initEarlyConfiguration();
//
// Start of the application
@@ -993,61 +606,24 @@ bool LLAppViewer::init()
//
// OK to write stuff to logs now, we've now crash reported if necessary
//
-
- // Set up some defaults...
- gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE);
- gOldSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, LEGACY_DEFAULT_SETTINGS_FILE);
-
if (!initConfiguration())
return false;
+ writeSystemInfo();
+
+ // Build a string representing the current version number.
+ gCurrentVersion = llformat("%s %d.%d.%d.%d",
+ gSavedSettings.getString("VersionChannelName").c_str(),
+ LL_VERSION_MAJOR,
+ LL_VERSION_MINOR,
+ LL_VERSION_PATCH,
+ LL_VERSION_BUILD );
+
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// *FIX: The following code isn't grouped into functions yet.
-
- //
- // Write system information into the debug log (CPU, OS, etc.)
- //
- writeSystemInfo();
-
- // Build a string representing the current version number.
- gCurrentVersion = llformat("%s %d.%d.%d.%d", gChannelName.c_str(), LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD );
-
- //
- // Merge with the command line overrides
- gSavedSettings.applyOverrides(gCommandLineSettings);
-
- // Need to do this before calling parseAlerts
- gUICtrlFactory = new LLViewerUICtrlFactory();
-
- // Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/)
- // Do this *before* loading the settings file
- LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE);
-
- // Overwrite default settings with user settings
- llinfos << "Loading configuration file " << gSettingsFileName << llendl;
- if (0 == gSavedSettings.loadFromFile(gSettingsFileName))
- {
- llinfos << "Failed to load settings from " << gSettingsFileName << llendl;
- llinfos << "Loading legacy settings from " << gOldSettingsFileName << llendl;
- gSavedSettings.loadFromFileLegacy(gOldSettingsFileName);
- }
-
- // need to do this here - need to have initialized global settings first
- LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
- if ( nextLoginLocation.length() )
- {
- LLURLSimString::setString( nextLoginLocation.c_str() );
- };
-
- // Merge with the command line overrides
- gSavedSettings.applyOverrides(gCommandLineForcedSettings);
-
- gLastRunVersion = gSavedSettings.getString("LastRunVersion");
-
- fixup_settings();
// Get the single value from the crash settings file, if it exists
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
@@ -1087,56 +663,25 @@ bool LLAppViewer::init()
{
LLError::setPrintLocation(true);
}
-
-#if !LL_RELEASE_FOR_DOWNLOAD
- if (gGridChoice == GRID_INFO_NONE)
- {
- // Development version: load last server choice by default (overridden by cmd line args)
-
- S32 server = gSavedSettings.getS32("ServerChoice");
- if (server != 0)
- gGridChoice = (EGridInfo)llclamp(server, 0, (S32)GRID_INFO_COUNT - 1);
- if (server == GRID_INFO_OTHER)
- {
- LLString custom_server = gSavedSettings.getString("CustomServer");
- if (custom_server.empty())
- {
- snprintf(gGridName, MAX_STRING, "none"); /* Flawfinder: ignore */
- }
- else
- {
- snprintf(gGridName, MAX_STRING, "%s", custom_server.c_str()); /* Flawfinder: ignore */
- }
- }
- }
-#endif
-
- if (gGridChoice == GRID_INFO_NONE)
- {
- gGridChoice = GridDefaultChoice;
- }
// Load art UUID information, don't require these strings to be declared in code.
LLString viewer_art_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"viewerart.xml");
llinfos << "Loading art table from " << viewer_art_filename << llendl;
- gViewerArt.loadFromFile(viewer_art_filename.c_str(), FALSE);
+ gViewerArt.loadFromFileLegacy(viewer_art_filename.c_str(), FALSE);
LLString textures_filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", "textures.xml");
llinfos << "Loading art table from " << textures_filename << llendl;
- gViewerArt.loadFromFile(textures_filename.c_str(), FALSE);
+ gViewerArt.loadFromFileLegacy(textures_filename.c_str(), FALSE);
LLString colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml");
llinfos << "Loading base colors from " << colors_base_filename << llendl;
- gColors.loadFromFile(colors_base_filename.c_str(), FALSE, TYPE_COL4U);
+ gColors.loadFromFileLegacy(colors_base_filename.c_str(), FALSE, TYPE_COL4U);
// Load overrides from user colors file
LLString user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml");
llinfos << "Loading user colors from " << user_colors_filename << llendl;
- if (gColors.loadFromFile(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0)
+ if (gColors.loadFromFileLegacy(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0)
{
- llinfos << "Failed to load user colors from " << user_colors_filename << llendl;
- LLString user_legacy_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.ini");
- llinfos << "Loading legacy colors from " << user_legacy_colors_filename << llendl;
- gColors.loadFromFileLegacy(user_legacy_colors_filename.c_str(), FALSE, TYPE_COL4U);
+ llinfos << "Cannot load user colors from " << user_colors_filename << llendl;
}
// Widget construction depends on LLUI being initialized
@@ -1159,16 +704,18 @@ bool LLAppViewer::init()
LLAgent::parseTeleportMessages("teleport_strings.xml");
+ LLViewerJointMesh::updateVectorize();
+
// load MIME type -> media impl mappings
LLMIMETypes::parseMIMETypes( "mime_types.xml" );
- mCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
-
- LLVectorPerformanceOptions::initClass();
-
- // Move certain saved settings into global variables for speed
- saved_settings_to_globals();
+ // Copy settings to globals. *TODO: Remove or move to appropriage class initializers
+ settings_to_globals();
+ // Setup settings listeners
+ settings_setup_listeners();
+ // Modify settings based on system configuration and compile options
+ settings_modify();
// Find partition serial number (Windows) or hardware serial (Mac)
mSerialNumber = generateSerialNumber();
@@ -1433,9 +980,9 @@ bool LLAppViewer::mainLoop()
bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads");
// yield some time to the os based on command line option
- if(gYieldTime)
+ if(mYieldTime >= 0)
{
- ms_sleep(gYieldMS);
+ ms_sleep(mYieldTime);
}
// yield cooperatively when not running as foreground window
@@ -1707,11 +1254,11 @@ 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(gSettingsFileName, TRUE);
- if (!gPerAccountSettingsFileName.empty())
- {
- gSavedPerAccountSettings.saveToFile(gPerAccountSettingsFileName, TRUE);
- }
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
+
+ // UserSettingsFile 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("UserSettingsFile"), TRUE);
llinfos << "Saved settings" << llendflush;
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
@@ -1806,10 +1353,10 @@ bool LLAppViewer::cleanup()
end_messaging_system();
- // *NOTE:Mani - The following call is not thread safe.
- LLCurl::cleanupClass();
+ // *NOTE:Mani - The following call is not thread safe.
+ LLCurl::cleanupClass();
- // If we're exiting to launch an URL, do that here so the screen
+ // If we're exiting to launch an URL, do that here so the screen
// is at the right resolution before we launch IE.
if (!gLaunchFileOnQuit.empty())
{
@@ -1830,106 +1377,6 @@ bool LLAppViewer::cleanup()
return true;
}
-bool LLAppViewer::initEarlyConfiguration()
-{
- // *FIX: globals - This method sets a bunch of globals early in the init process.
- int argc = gTempArgC;
- char** argv = gTempArgV;
-
- // HACK! We REALLY want to know what grid they were trying to connect to if they
- // crashed hard.
- // So we walk through the command line args ONLY looking for the
- // userserver arguments first. And we don't do ANYTHING but set
- // the gGridName (which gets passed to the crash reporter).
- // We're assuming that they're trying to log into the same grid as last
- // time, which seems fairly reasonable.
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GridDefaultChoice].mName); // Flawfinder: ignore
- S32 j;
- for (j = 1; j < argc; j++)
- {
- if (!strcmp(argv[j], "--aditi"))
- {
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_ADITI].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--agni"))
- {
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_AGNI].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--siva"))
- {
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SIVA].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--shakti"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_SHAKTI].mName);
- }
- else if (!strcmp(argv[j], "--durga"))
- {
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_DURGA].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--soma"))
- {
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SOMA].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--ganga"))
- {
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_GANGA].mName); // Flawfinder: ignore
- }
- else if (!strcmp(argv[j], "--vaak"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_VAAK].mName);
- }
- else if (!strcmp(argv[j], "--uma"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_UMA].mName);
- }
- else if (!strcmp(argv[j], "--mohini"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_MOHINI].mName);
- }
- else if (!strcmp(argv[j], "--yami"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_YAMI].mName);
- }
- else if (!strcmp(argv[j], "--nandi"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_NANDI].mName);
- }
- else if (!strcmp(argv[j], "--mitra"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_MITRA].mName);
- }
- else if (!strcmp(argv[j], "--radha"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_RADHA].mName);
- }
- else if (!strcmp(argv[j], "--ravi"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_RAVI].mName);
- }
- else if (!strcmp(argv[j], "--aruna"))
- {
- sprintf(gGridName,"%s", gGridInfo[GRID_INFO_ARUNA].mName);
- }
- else if (!strcmp(argv[j], "-multiple"))
- {
- // Hack to detect -multiple so we can disable the marker file check (which will always fail)
- gMultipleViewersOK = TRUE;
- }
- else if (!strcmp(argv[j], "-novoice"))
- {
- // May need to know this early also
- gDisableVoice = TRUE;
- }
- else if (!strcmp(argv[j], "-url") && (++j < argc))
- {
- LLURLSimString::setString(argv[j]);
- }
- }
-
- return true;
-}
-
bool LLAppViewer::initThreads()
{
#if MEM_TRACK_MEM
@@ -1990,14 +1437,275 @@ bool LLAppViewer::initLogging()
return true;
}
+void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index)
+{
+ for(LLSD::map_iterator itr = mSettingsFileList.beginMap(); itr != mSettingsFileList.endMap(); ++itr)
+ {
+ LLString settings_name = (*itr).first;
+ LLString settings_file = mSettingsFileList[settings_name].asString();
+ LLString full_settings_path = gDirUtilp->getExpandedFilename(path_index, settings_file);
+ if(gSettings.find(settings_name) == gSettings.end())
+ {
+ llwarns << "Cannot load " << settings_file << " - No matching settings group for name " << settings_name << llendl;
+ continue;
+ }
+ if(!gSettings[settings_name]->loadFromFile(gDirUtilp->getExpandedFilename(path_index, settings_file)))
+ {
+ llwarns << "Cannot load " << full_settings_path << " - No settings found." << llendl;
+ }
+ else
+ {
+ llinfos << "Loaded settings file " << full_settings_path << llendl;
+ }
+ }
+}
+
bool LLAppViewer::initConfiguration()
{
- // Ye olde parse_args()...
- if(!doConfigFromCommandLine())
+ //Set up internal pointers
+ gSettings["Global"] = &gSavedSettings;
+ gSettings["PerAccount"] = &gSavedPerAccountSettings;
+ gSettings["CrashSettings"] = &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;
+ if (0 == settings_control.loadFromFile(settings_file_list))
{
- return false;
+ llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
}
+
+ mSettingsFileList = settings_control.getLLSD("Files");
+ //Order of loading
+ // - App Settings (Defaults)
+ // - user_settings (Client Overrides)
+ // - user directory (user specific overrides, happens in llstartup)
+ loadSettingsFromDirectory(LL_PATH_APP_SETTINGS);
+
+ //Fix settings that require compiled information
+ gSavedSettings.setString("ClientSettingsFile",
+ gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE));
+ gSavedSettings.setString("VersionChannelName", LL_CHANNEL);
+ #ifndef LL_RELEASE_FOR_DOWNLOAD
+ gSavedSettings.setBOOL("ShowConsoleWindow", TRUE);
+ #endif
+
+ // 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
+ // for disable/reset ability
+ LLFirstUse::addConfigVariable("FirstBalanceIncrease");
+ LLFirstUse::addConfigVariable("FirstBalanceDecrease");
+ LLFirstUse::addConfigVariable("FirstSit");
+ LLFirstUse::addConfigVariable("FirstMap");
+ LLFirstUse::addConfigVariable("FirstGoTo");
+ LLFirstUse::addConfigVariable("FirstBuild");
+ LLFirstUse::addConfigVariable("FirstLeftClickNoHit");
+ LLFirstUse::addConfigVariable("FirstTeleport");
+ LLFirstUse::addConfigVariable("FirstOverrideKeys");
+ LLFirstUse::addConfigVariable("FirstAttach");
+ LLFirstUse::addConfigVariable("FirstAppearance");
+ LLFirstUse::addConfigVariable("FirstInventory");
+ LLFirstUse::addConfigVariable("FirstSandbox");
+ LLFirstUse::addConfigVariable("FirstFlexible");
+ LLFirstUse::addConfigVariable("FirstDebugMenus");
+ LLFirstUse::addConfigVariable("FirstStreamingMusic");
+ LLFirstUse::addConfigVariable("FirstStreamingVideo");
+ LLFirstUse::addConfigVariable("FirstSculptedPrim");
+ LLFirstUse::addConfigVariable("FirstVoice");
+ LLFirstUse::addConfigVariable("FirstMedia");
+
+ //////
+ // *FIX:Mani - Find a way to remove the gUICtrlFactory and
+ // LLAlertDialog::parseAlerts dependecies on the being loaded
+ // *before* the user settings. Having to do this init here
+ // seems odd.
+
+ // Need to do this before calling parseAlerts
+ gUICtrlFactory = new LLViewerUICtrlFactory();
+
+ // Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/)
+ // Do this *before* loading the settings file
+ LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE);
+
+ // Overwrite default user settings with user settings
+ loadSettingsFromDirectory(LL_PATH_USER_SETTINGS);
+
+ // Parse command line settings.
+ LLControlGroupCLP clp;
+ std::string cmd_line_config = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,
+ "cmd_line.xml");
+ clp.configure(cmd_line_config, &gSavedSettings);
+
+ if(!initParseCommandLine(clp))
+ {
+ llwarns
+ << "Error parsing command line options. Command Line options ignored."
+ << llendl;
+
+ llinfos << "Command line usage:\n" << clp << llendl;
+ }
+
+ // If the user has specified a alternate settings file name.
+ // Load it now.
+ if(clp.hasOption("settings"))
+ {
+ std::string user_settings_filename = clp.getOption("settings")[0];
+ std::string full_settings_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ user_settings_filename);
+
+ llinfos << "Loading command line specified settings file: " << full_settings_path << llendl;
+
+ if(!gSavedSettings.loadFromFile(full_settings_path))
+ {
+ llwarns << "File not found: " << full_settings_path << llendl;
+ }
+
+ gSavedSettings.setString("ClientSettingsFile", full_settings_path);
+ }
+
+ // Apply the command line params to the settings system.
+ // Anyway the following call to notify depends upon the settings being init'd.
+ clp.notify();
+
+ // Start up the debugging console before handling other options.
+ if (gSavedSettings.getBOOL("ShowConsoleWindow"))
+ {
+ initConsole();
+ }
+
+ if(clp.hasOption("help"))
+ {
+ llinfos << "Command line usage:\n" << clp << llendl;
+ 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["global"]->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");
+ if(0x1 & set_values.size())
+ {
+ llwarns << "Invalid '--set' parameter count." << llendl;
+ }
+ else
+ {
+ LLCommandLineParser::token_vector_t::const_iterator itr = set_values.begin();
+ for(; itr != set_values.end(); ++itr)
+ {
+ const std::string& name = *itr;
+ const std::string& value = *(++itr);
+ LLControlVariable* c = gSettings["Global"]->getControl(name);
+ if(c)
+ {
+ c->setValue(value, false);
+ }
+ else
+ {
+ llwarns << "'--set' specified with unknown setting: '"
+ << name << "'." << llendl;
+ }
+ }
+ }
+ }
+
+ initGridChoice();
+
+ // Handle slurl use. NOTE: Don't let SL-55321 reappear.
+
+ // *FIX: This init code should be made more robust to prevent
+ // the issue SL-55321 from returning. One thought is to allow
+ // only select options to be set from command line when a slurl
+ // is specified. More work on the settings system is needed to
+ // achieve this. For now...
+
+ // *NOTE:Mani The command line parser parses tokens and is
+ // setup to bail after parsing the '--url' option or the
+ // first option specified without a '--option' flag (or
+ // any other option that uses the 'last_option' setting -
+ // see LLControlGroupCLP::configure())
+
+ // What can happen is that someone can use IE (or potentially
+ // other browsers) and do the rough equivalent of command
+ // injection and steal passwords. Phoenix. SL-55321
+ if(clp.hasOption("url"))
+ {
+ std::string slurl = clp.getOption("url")[0];
+ if (LLURLDispatcher::isSLURLCommand(slurl))
+ {
+ LLStartUp::sSLURLCommand = slurl;
+ }
+ else
+ {
+ LLURLSimString::setString(slurl);
+ }
+ }
+ else if(clp.hasOption("slurl"))
+ {
+ std::string slurl = clp.getOption("slurl")[0];
+ if(LLURLDispatcher::isSLURL(slurl))
+ {
+ if (LLURLDispatcher::isSLURLCommand(slurl))
+ {
+ LLStartUp::sSLURLCommand = slurl;
+ }
+ else
+ {
+ LLURLSimString::setString(slurl);
+ }
+ }
+ }
+
+ const LLControlVariable* loginuri = gSavedSettings.getControl("LoginURI");
+ if(loginuri && LLString::null != loginuri->getValue().asString())
+ {
+ addLoginURI(loginuri->getValue().asString());
+ }
+
+ const LLControlVariable* helperuri = gSavedSettings.getControl("HelperURI");
+ if(helperuri && LLString::null != helperuri->getValue().asString())
+ {
+ setHelperURI(helperuri->getValue().asString());
+ }
+
+ const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinFolder");
+ if(skinfolder && LLString::null != skinfolder->getValue().asString())
+ {
+ gDirUtilp->setSkinFolder(skinfolder->getValue().asString());
+ }
+
+ mYieldTime = gSavedSettings.getS32("YieldTime");
+
// XUI:translate
gSecondLife = "Second Life";
@@ -2068,19 +1776,6 @@ bool LLAppViewer::initConfiguration()
gStartTime = totalTime();
- ////////////////////////////////////////
- //
- // Process ini files
- //
-
- // declare all possible setting variables
- declare_settings();
-
-#if !LL_RELEASE_FOR_DOWNLOAD
-// only write the defaults for non-release builds!
- gSavedSettings.saveToFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings_default.xml").c_str(), FALSE);
-#endif
-
//
// Set the name of the window
//
@@ -2093,7 +1788,7 @@ bool LLAppViewer::initConfiguration()
#endif
LLString::truncate(gWindowTitle, 255);
- if (!gMultipleViewersOK)
+ if (!gSavedSettings.getBOOL("AllowMultipleViewers"))
{
//
// Check for another instance of the app running
@@ -2219,12 +1914,12 @@ bool LLAppViewer::initConfiguration()
if (mSecondInstance)
{
- gDisableVoice = TRUE;
+ gSavedSettings.setBOOL("CmdLineDisableVoice", TRUE);
/* Don't start another instance if using -multiple
//RN: if we received a URL, hand it off to the existing instance
- if (LLURLSimString::parse())
- {
- LLURLSimString::send_to_other_instance();
+ if (LLURLSimString::parse())
+ {
+ LLURLSimString::send_to_other_instance();
return 1;
}
*/
@@ -2233,95 +1928,15 @@ bool LLAppViewer::initConfiguration()
initMarkerFile();
}
- return true; // Config was successful.
-}
-
-bool LLAppViewer::doConfigFromCommandLine()
-{
- // *FIX: This is what parse args used to do, minus the arg reading part.
- // Now the arg parsing is handled by LLApp::parseCommandOptions() and this
- // method need only interpret settings. Perhaps some day interested parties
- // can ask an app about a setting rather than have the app set
- // a gazzillion globals.
-
- /////////////////////////////////////////
- //
- // Process command line arguments
- //
- S32 args_result = 0;
-
-#if LL_DARWIN
- {
- // On the Mac, read in arguments.txt (if it exists) and process it for additional arguments.
- LLString args;
- if(_read_file_into_string(args, "arguments.txt")) /* Flawfinder: ignore*/
- {
- // The arguments file exists.
- // It should consist of command line arguments separated by newlines.
- // Split it into individual arguments and build a fake argv[] to pass to parse_args.
- std::vector<std::string> arglist;
-
- arglist.push_back("newview");
-
- llinfos << "Reading additional command line arguments from arguments.txt..." << llendl;
-
- typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer;
- boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'");
- tokenizer tokens(args, sep);
- tokenizer::iterator token_iter;
-
- for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
- {
- llinfos << "argument: '" << (token_iter->c_str()) << "'" << llendl;
-
- arglist.push_back(*token_iter);
- }
-
- char **fakeargv = new char*[arglist.size()];
- int i;
- for(i=0; i < arglist.size(); i++)
- fakeargv[i] = const_cast<char*>(arglist[i].c_str());
-
- args_result = parse_args(arglist.size(), fakeargv);
- delete[] fakeargv;
- }
-
- // Get the user's preferred language string based on the Mac OS localization mechanism.
- // To add a new localization:
- // go to the "Resources" section of the project
- // get info on "language.txt"
- // in the "General" tab, click the "Add Localization" button
- // create a new localization for the language you're adding
- // set the contents of the new localization of the file to the string corresponding to our localization
- // (i.e. "en-us", "ja", etc. Use the existing ones as a guide.)
- CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL);
- char path[MAX_PATH];
- if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path)))
- {
- LLString lang;
- if(_read_file_into_string(lang, path)) /* Flawfinder: ignore*/
- {
- gCommandLineForcedSettings["SystemLanguage"] = lang;
- }
- }
- CFRelease(url);
- }
-#endif
-
- int argc = gTempArgC;
- char** argv = gTempArgV;
-
- //
- // Parse the command line arguments
- //
- args_result |= parse_args(argc, argv);
- if (args_result)
+ // need to do this here - need to have initialized global settings first
+ LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
+ if ( nextLoginLocation.length() )
{
- removeMarkerFile();
- return false;
- }
+ LLURLSimString::setString( nextLoginLocation.c_str() );
+ };
- return true;
+ gLastRunVersion = gSavedSettings.getString("LastRunVersion");
+ return true; // Config was successful.
}
bool LLAppViewer::initWindow()
@@ -2340,10 +1955,11 @@ bool LLAppViewer::initWindow()
window_title_str[sizeof(window_title_str) - 1] = '\0';
// always start windowed
+ BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
gViewerWindow = new LLViewerWindow(window_title_str, "Second Life",
gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
- FALSE, gIgnorePixelDepth);
+ FALSE, ignorePixelDepth);
if (gSavedSettings.getBOOL("FullScreen"))
{
@@ -2365,14 +1981,14 @@ bool LLAppViewer::initWindow()
// Set this flag in case we crash while initializing GL
gSavedSettings.setBOOL("RenderInitError", TRUE);
- gSavedSettings.saveToFile( gSettingsFileName, TRUE );
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
gPipeline.init();
stop_glerror();
gViewerWindow->initGLDefaults();
gSavedSettings.setBOOL("RenderInitError", FALSE);
- gSavedSettings.saveToFile( gSettingsFileName, TRUE );
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
}
LLUI::sWindow = gViewerWindow->getWindow();
@@ -2380,11 +1996,6 @@ bool LLAppViewer::initWindow()
LLAlertDialog::parseAlerts("alerts.xml");
LLNotifyBox::parseNotify("notify.xml");
- // *TODO - remove this when merging into release
- // DON'T Clean up the feature manager lookup table - settings are needed
- // for setting the graphics level.
- //gFeatureManagerp->cleanupFeatureTables();
-
// Show watch cursor
gViewerWindow->setCursor(UI_CURSOR_WAIT);
@@ -2474,7 +2085,7 @@ void LLAppViewer::writeSystemInfo()
{
gDebugInfo["SLLog"] = LLError::logFileName();
- gDebugInfo["ClientInfo"]["Name"] = gChannelName;
+ gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName");
gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
@@ -2525,7 +2136,7 @@ void LLAppViewer::handleViewerCrash()
}
pApp->mReportedCrash = TRUE;
- gDebugInfo["SettingsFilename"] = gSettingsFileName;
+ gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");
gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName().c_str();
gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath().c_str();
@@ -2666,7 +2277,11 @@ void LLAppViewer::initMarkerFile()
ll_apr_file_remove(error_marker_file);
//Freeze case checks
- if(anotherInstanceRunning()) return;
+ if(anotherInstanceRunning())
+ {
+ return;
+ }
+
fMarker = ll_apr_file_open(mMarkerFileName, LL_APR_RB);
if (fMarker != NULL)
{
@@ -2872,7 +2487,7 @@ bool LLAppViewer::initCache()
char static_vfs_index_file[LL_MAX_PATH]; // Flawfinder: ignore
char static_vfs_data_file[LL_MAX_PATH]; // Flawfinder: ignore
- if (gMultipleViewersOK)
+ if (gSavedSettings.getBOOL("AllowMultipleViewers"))
{
// don't mess with renaming the VFS in this case
new_salt = old_salt;
@@ -3071,17 +2686,6 @@ void LLAppViewer::setHelperURI(const std::string& uri)
gHelperURI = uri;
}
-void LLAppViewer::setLoginPage(const std::string& login_page)
-{
- gLoginPage = login_page;
-}
-
-const std::string& LLAppViewer::getLoginPage()
-{
- return gLoginPage;
-}
-
-
// Callback from a dialog indicating user was logged out.
void finish_disconnect(S32 option, void* userdata)
{
@@ -3250,8 +2854,6 @@ void LLAppViewer::idle()
// Update frame timers
static LLTimer idle_timer;
- LLControlBase::updateAllListeners();
-
LLFrameTimer::updateFrameTime();
LLEventTimer::updateClass();
LLCriticalDamp::updateInterpolants();
@@ -3272,9 +2874,10 @@ void LLAppViewer::idle()
// Smoothly weight toward current frame
gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f;
- if (gQuitAfterSeconds > 0.f)
+ F32 qas = gSavedSettings.getF32("QuitAfterSeconds");
+ if (qas > 0.f)
{
- if (gRenderStartTime.getElapsedTimeF32() > gQuitAfterSeconds)
+ if (gRenderStartTime.getElapsedTimeF32() > qas)
{
LLAppViewer::instance()->forceQuit();
}
@@ -3313,7 +2916,7 @@ void LLAppViewer::idle()
// Update simulator agent state
//
- if (gRotateRight)
+ if (gSavedSettings.getBOOL("RotateRight"))
{
gAgent.moveYaw(-1.f);
}
@@ -3521,7 +3124,6 @@ void LLAppViewer::idle()
//
// Update weather effects
//
-
if (!gNoRender)
{
gWorldp->updateClouds(gFrameDTClamped);
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 9518636f87..40a69f7868 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -36,15 +36,21 @@ class LLTextureCache;
class LLWorkerThread;
class LLTextureFetch;
+class LLCommandLineParser;
+
class LLAppViewer : public LLApp
{
public:
LLAppViewer();
virtual ~LLAppViewer();
- // *NOTE:Mani - Don't use this!
- // Having
- static LLAppViewer* instance() {return sInstance; }
+ /**
+ * @brief Access to the LLAppViewer singleton.
+ *
+ * The LLAppViewer singleton is created in main()/WinMain().
+ * So don't use it in pre-entry (static initialization) code.
+ */
+ static LLAppViewer* instance() {return sInstance; }
//
// Main application logic
@@ -64,10 +70,6 @@ public:
bool quitRequested() { return mQuitRequested; }
bool logoutRequestSent() { return mLogoutRequestSent; }
- // *FIX: This is meant to stay only until the command line issues are hashed out with repect to LLApp::parseCommandLine
- // This version stores the argc and argv for later usage, make sure the params passed in last as long as this class.
- bool tempStoreCommandOptions(int argc, char** argv);
-
void closeDebug();
const LLOSInfo& getOSInfo() const { return mSysOSInfo; }
@@ -87,9 +89,6 @@ public:
const std::string& getSerialNumber() { return mSerialNumber; }
- // *FIX:Mani purgeCache was made public for parse_args().
- // If that beast is gone, make it private.
- void purgeCache(); // Clear the local cache.
bool getPurgeCache() const { return mPurgeCache; }
const LLString& getSecondLifeTitle() const; // The Second Life title.
@@ -101,8 +100,6 @@ public:
const std::vector<std::string>& getLoginURIs() const;
const std::string& getHelperURI() const;
void resetURIs() const;
- void setLoginPage(const std::string& login_page);
- const std::string& getLoginPage();
void forceDisconnect(const LLString& msg); // Force disconnection, with a message to the user.
void badNetworkHandler(); // Cause a crash state due to bad network packet.
@@ -125,23 +122,26 @@ public:
virtual void forceErrorInifiniteLoop();
virtual void forceErrorSoftwareException();
+ void loadSettingsFromDirectory(ELLPath path_index);
protected:
virtual bool initWindow(); // Initialize the viewer's window.
virtual bool initLogging(); // Initialize log files, logging system, return false on failure.
+ virtual void initConsole() {}; // Initialize OS level debugging console.
virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit.
+
+ virtual bool initParseCommandLine(LLCommandLineParser& clp)
+ { return true; } // Allow platforms to specify the command line args.
virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.
private:
- bool initEarlyConfiguration(); // Initialize setting needed by crash reporting.
bool initThreads(); // Initialize viewer threads, return false on failure.
bool initConfiguration(); // Initialize settings from the command line/config file.
bool initCache(); // Initialize local client cache.
-
- bool doConfigFromCommandLine(); // calls parse args.
+ void purgeCache(); // Clear the local cache.
void cleanupSavedSettings(); // Sets some config data to current or default values during cleanup.
void removeCacheFiles(const char *filemask); // Deletes cached files the match the given wildcard.
@@ -186,6 +186,8 @@ private:
bool mQuitRequested; // User wants to quit, may have modified documents open.
bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
+ S32 mYieldTime;
+ LLSD mSettingsFileList;
};
// consts from viewer.h
@@ -196,31 +198,16 @@ const S32 AGENT_UPDATES_PER_SECOND = 10;
//
// "// llstartup" indicates that llstartup is the only client for this global.
-extern bool gVerifySSLCert; // parse_args setting used by llxmlrpctransaction.cpp
extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp
-extern BOOL gProbeHardware;
extern LLString gDisabledMessage; // llstartup
extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup
extern LLSD gDebugInfo;
extern BOOL gAllowIdleAFK;
-extern F32 gAFKTimeout;
extern BOOL gShowObjectUpdates;
-extern BOOL gLogMessages; // llstartup
-extern std::string gChannelName;
-extern BOOL gUseAudio; // llstartup
-
-extern LLString gCmdLineFirstName; // llstartup
-extern LLString gCmdLineLastName;
-extern LLString gCmdLinePassword;
-
-extern BOOL gAutoLogin; // llstartup
extern const char* DEFAULT_SETTINGS_FILE; // llstartup
-extern BOOL gRequestInventoryLibrary; // llstartup
-extern BOOL gGodConnect; // llstartup
-
extern BOOL gAcceptTOS;
extern BOOL gAcceptCriticalMessage;
@@ -265,7 +252,6 @@ extern LLUUID gInventoryLibraryOwner;
extern LLUUID gInventoryLibraryRoot;
extern BOOL gDisconnected;
-extern BOOL gDisableVoice;
// Map scale in pixels per region
extern F32 gMapScale;
@@ -275,9 +261,6 @@ extern LLFrameTimer gRestoreGLTimer;
extern BOOL gRestoreGL;
extern BOOL gUseWireframe;
-extern F32 gMouseSensitivity;
-extern BOOL gInvertMouse;
-
// VFS globals - gVFS is for general use
// gStaticVFS is read-only and is shipped w/ the viewer
// it has pre-cache data like the UI .TGAs
@@ -285,9 +268,6 @@ extern LLVFS *gStaticVFS;
extern LLMemoryInfo gSysMemory;
-extern bool gPreloadImages;
-extern bool gPreloadSounds;
-
extern LLString gLastVersionChannel;
extern LLVector3 gWindVec;
@@ -298,10 +278,7 @@ extern BOOL gPrintMessagesThisFrame;
extern LLUUID gSunTextureID;
extern LLUUID gMoonTextureID;
-extern BOOL gUseConsole;
-
extern BOOL gRandomizeFramerate;
extern BOOL gPeriodicSlowFrame;
-extern BOOL gQAMode;
#endif // LL_LLAPPVIEWER_H
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index 1993fd0a76..c36dd2955e 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -31,9 +31,11 @@
#include "llviewerprecompiledheaders.h"
-#include "llmemtype.h"
#include "llappviewerlinux.h"
+#include "llcommandlineparser.h"
+
+#include "llmemtype.h"
#include "llviewernetwork.h"
#include "llmd5.h"
@@ -54,6 +56,12 @@
# include <ucontext.h>
#endif
+namespace
+{
+ int gArgC = 0;
+ char **gArgV = NULL;
+}
+
int main( int argc, char **argv )
{
LLMemType mt1(LLMemType::MTYPE_STARTUP);
@@ -62,18 +70,14 @@ int main( int argc, char **argv )
asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
#endif
+ gArgC = argc;
+ gArgV = argv;
+
LLAppViewer* viewer_app_ptr = new LLAppViewerLinux();
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
- bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv);
- if(!ok)
- {
- llwarns << "Unable to parse command line." << llendl;
- return -1;
- }
-
- ok = viewer_app_ptr->init();
+ bool ok = viewer_app_ptr->init();
if(!ok)
{
llwarns << "Application init failed." << llendl;
@@ -321,7 +325,7 @@ void LLAppViewerLinux::handleCrashReporting()
{(char*)cmd.c_str(),
ask_dialog,
(char*)"-user",
- (char*)gGridName,
+ (char*)gGridName.c_str(),
(char*)"-name",
(char*)LLAppViewer::instance()->getSecondLifeTitle().c_str(),
NULL};
@@ -403,6 +407,12 @@ bool LLAppViewerLinux::initLogging()
return LLAppViewer::initLogging();
}
+bool LLAppViewerLinux::initParseCommandLine(LLCommandLineParser& clp)
+{
+ clp.parseCommandLine(gArgC, gArgV);
+ return true;
+}
+
std::string LLAppViewerLinux::generateSerialNumber()
{
char serial_md5[MD5HEX_STR_SIZE];
diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h
index f38a64a8cd..ce91b6b8b6 100644
--- a/indra/newview/llappviewerlinux.h
+++ b/indra/newview/llappviewerlinux.h
@@ -36,6 +36,8 @@
#include "llappviewer.h"
#endif
+class LLCommandLineParser;
+
class LLAppViewerLinux : public LLAppViewer
{
public:
@@ -54,6 +56,7 @@ protected:
virtual void handleCrashReporting();
virtual bool initLogging();
+ virtual bool initParseCommandLine(LLCommandLineParser& clp);
};
#endif // LL_LLAPPVIEWERLINUX_H
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 2d7091a075..ba3f28911f 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -36,6 +36,8 @@
#endif
#include "llappviewermacosx.h"
+#include "llcommandlineparser.h"
+
#include "llmemtype.h"
#include "llviewernetwork.h"
@@ -45,6 +47,13 @@
#include "llurldispatcher.h"
#include <Carbon/Carbon.h>
+namespace
+{
+ // The command line args stored.
+ // They are not used immediately by the app.
+ int gArgC;
+ char** gArgV;
+}
int main( int argc, char **argv )
{
@@ -61,14 +70,11 @@ int main( int argc, char **argv )
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
- bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv);
- if(!ok)
- {
- llwarns << "Unable to parse command line." << llendl;
- return -1;
- }
-
- ok = viewer_app_ptr->init();
+ // Store off the command line args for use later.
+ gArgC = argc;
+ gArgV = argv;
+
+ bool ok = viewer_app_ptr->init();
if(!ok)
{
llwarns << "Application init failed." << llendl;
@@ -108,6 +114,27 @@ bool LLAppViewerMacOSX::init()
return LLAppViewer::init();
}
+bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp)
+{
+ // First parse the command line, not often used on the mac.
+ clp.parseCommandLine(gArgC, gArgV);
+
+ // Now read in the args from arguments txt.
+ // Succesive calls to clp.parse... will NOT override earlier
+ // options.
+ const char* filename = "arguments.txt";
+ llifstream ifs(filename, llifstream::binary);
+ if (!ifs.is_open())
+ {
+ llwarns << "Unable to open file" << filename << llendl;
+ return false;
+ }
+
+
+ clp.parseCommandLineFile(ifs);
+ return true;
+}
+
void LLAppViewerMacOSX::handleCrashReporting()
{
// Macintosh
diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h
index 2c61e5a01c..cc4a7f5eb5 100644
--- a/indra/newview/llappviewermacosx.h
+++ b/indra/newview/llappviewermacosx.h
@@ -51,6 +51,7 @@ public:
protected:
virtual void handleCrashReporting();
std::string generateSerialNumber();
+ virtual bool initParseCommandLine(LLCommandLineParser& clp);
};
#endif // LL_LLAPPVIEWERMACOSX_H
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 09bcf6f7cc..fb726e7c97 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -55,41 +55,13 @@
#include "llviewernetwork.h"
#include "llmd5.h"
-void fill_args(int& argc, char** argv, const S32 max_args, LPSTR cmd_line)
-{
- char *token = NULL;
- if( cmd_line[0] == '\"' )
- {
- // Exe name is enclosed in quotes
- token = strtok( cmd_line, "\"" );
- argv[argc++] = token;
- token = strtok( NULL, " \t," );
- }
- else
- {
- // Exe name is not enclosed in quotes
- token = strtok( cmd_line, " \t," );
- }
+#include "llcommandlineparser.h"
- while( (token != NULL) && (argc < max_args) )
- {
- argv[argc++] = token;
- /* Get next token: */
- if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore*/
- {
- token = strtok( NULL, "\"");
- }
- else
- {
- token = strtok( NULL, " \t," );
- }
- }
-}
-
-// *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)
{
- // Translate the signals/exceptions into cross-platform stuff
+ // *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
+
+ // Translate the signals/exceptions into cross-platform stuff
// Windows implementation
llinfos << "Entering Windows Exception Handler..." << llendl;
@@ -144,21 +116,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
// *FIX: global
gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
- // In Win32, we need to generate argc and argv ourselves...
- // Note: GetCommandLine() returns a potentially return a LPTSTR
- // which can resolve to a LPWSTR (unicode string).
- // (That's why it's different from lpCmdLine which is a LPSTR.)
- // We don't currently do unicode, so call the non-unicode version
- // directly.
- LPSTR cmd_line_including_exe_name = GetCommandLineA();
-
- const S32 MAX_ARGS = 100;
- int argc = 0;
- char* argv[MAX_ARGS]; /* Flawfinder: ignore */
-
- fill_args(argc, argv, MAX_ARGS, cmd_line_including_exe_name);
-
- LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32();
+ LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(lpCmdLine);
// *FIX:Mani This method is poorly named, since the exception
// is now handled by LLApp.
@@ -180,13 +138,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
- ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv);
- if(!ok)
- {
- llwarns << "Unable to parse command line." << llendl;
- return -1;
- }
-
ok = viewer_app_ptr->init();
if(!ok)
{
@@ -308,7 +259,8 @@ void create_console()
setvbuf( stderr, NULL, _IONBF, 0 );
}
-LLAppViewerWin32::LLAppViewerWin32()
+LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) :
+ mCmdLine(cmd_line)
{
}
@@ -339,15 +291,11 @@ bool LLAppViewerWin32::cleanup()
return result;
}
-bool LLAppViewerWin32::initWindow()
+void LLAppViewerWin32::initConsole()
{
- // pop up debug console if necessary
- if (gUseConsole && gSavedSettings.getBOOL("ShowConsoleWindow"))
- {
- create_console();
- }
-
- return LLAppViewer::initWindow();
+ // pop up debug console
+ create_console();
+ return LLAppViewer::initConsole();
}
void write_debug_dx(const char* str)
@@ -368,7 +316,7 @@ bool LLAppViewerWin32::initHardwareTest()
// Do driver verification and initialization based on DirectX
// hardware polling and driver versions
//
- if (gProbeHardware)
+ if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))
{
BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup");
@@ -431,6 +379,11 @@ bool LLAppViewerWin32::initHardwareTest()
return true;
}
+bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp)
+{
+ return clp.parseCommandLineString(mCmdLine);
+}
+
void LLAppViewerWin32::handleCrashReporting()
{
// Windows only behaivor. Spawn win crash reporter.
@@ -486,4 +439,4 @@ std::string LLAppViewerWin32::generateSerialNumber()
llwarns << "GetVolumeInformation failed" << llendl;
}
return serial_md5;
-} \ No newline at end of file
+}
diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h
index 23e7337618..66653c48f5 100644
--- a/indra/newview/llappviewerwin32.h
+++ b/indra/newview/llappviewerwin32.h
@@ -39,7 +39,7 @@
class LLAppViewerWin32 : public LLAppViewer
{
public:
- LLAppViewerWin32();
+ LLAppViewerWin32(const char* cmd_line);
virtual ~LLAppViewerWin32();
//
@@ -49,15 +49,18 @@ public:
virtual bool cleanup();
protected:
- virtual bool initWindow(); // Initialize the viewer's window.
+ virtual void initConsole(); // Initialize OS level debugging console.
virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware.
- virtual void handleCrashReporting();
+ virtual bool initParseCommandLine(LLCommandLineParser& clp);
+
+ virtual void handleCrashReporting();
std::string generateSerialNumber();
private:
void disableWinErrorReporting();
+ std::string mCmdLine;
};
#endif // LL_LLAPPVIEWERWIN32_H
diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp
new file mode 100644
index 0000000000..2f99ca1247
--- /dev/null
+++ b/indra/newview/llcommandlineparser.cpp
@@ -0,0 +1,535 @@
+/**
+ * @file llcommandlineparser.cpp
+ * @brief The LLCommandLineParser class definitions
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llcommandlineparser.h"
+
+// *NOTE: The boost::lexical_cast generates
+// the warning C4701(local used with out assignment) in VC7.1.
+// Disable the warning for the boost includes.
+#if _MSC_VER
+# pragma warning(push)
+# pragma warning( disable : 4701 )
+#else
+// NOTE: For the other platforms?
+#endif
+
+#include <boost/program_options.hpp>
+#include <boost/bind.hpp>
+#include<boost/tokenizer.hpp>
+
+#if _MSC_VER
+# pragma warning(pop)
+#endif
+
+#include "llsdserialize.h"
+#include <iostream>
+#include <sstream>
+
+#include "llcontrol.h"
+
+namespace po = boost::program_options;
+
+// *NTOE:MEP - Currently the boost object reside in file scope.
+// This has a couple of negatives, they are always around and
+// there can be only one instance of each.
+// The plus is that the boost-ly-ness of this implementation is
+// hidden from the rest of the world.
+// Its importatnt to realize that multiple LLCommandLineParser objects
+// will all have this single repository of option escs and parsed options.
+// This could be good or bad, and probably won't matter for most use cases.
+namespace
+{
+ po::options_description gOptionsDesc;
+ po::positional_options_description gPositionalOptions;
+ po::variables_map gVariableMap;
+
+ const LLCommandLineParser::token_vector_t gEmptyValue;
+
+ void read_file_into_string(std::string& str, const std::basic_istream < char >& file)
+ {
+ std::ostringstream oss;
+ oss << file.rdbuf();
+ str = oss.str();
+ }
+
+ bool gPastLastOption = false;
+}
+
+class LLCLPError : public std::logic_error {
+public:
+ LLCLPError(const std::string& what) : std::logic_error(what) {}
+};
+
+class LLCLPLastOption : public std::logic_error {
+public:
+ LLCLPLastOption(const std::string& what) : std::logic_error(what) {}
+};
+
+class LLCLPValue : public po::value_semantic_codecvt_helper<char>
+{
+ unsigned mMinTokens;
+ unsigned mMaxTokens;
+ bool mIsComposing;
+ typedef boost::function1<void, const LLCommandLineParser::token_vector_t&> notify_callback_t;
+ notify_callback_t mNotifyCallback;
+ bool mLastOption;
+
+public:
+ LLCLPValue() :
+ mMinTokens(0),
+ mMaxTokens(0),
+ mIsComposing(false),
+ mLastOption(false)
+ {}
+
+ virtual ~LLCLPValue() {};
+
+ void setMinTokens(unsigned c)
+ {
+ mMinTokens = c;
+ }
+
+ void setMaxTokens(unsigned c)
+ {
+ mMaxTokens = c;
+ }
+
+ void setComposing(bool c)
+ {
+ mIsComposing = c;
+ }
+
+ void setLastOption(bool c)
+ {
+ mLastOption = c;
+ }
+
+ void setNotifyCallback(notify_callback_t f)
+ {
+ mNotifyCallback = f;
+ }
+
+ // Overrides to support the value_semantic interface.
+ virtual std::string name() const
+ {
+ const std::string arg("arg");
+ const std::string args("args");
+ return (max_tokens() > 1) ? args : arg;
+ }
+
+ virtual unsigned min_tokens() const
+ {
+ return mMinTokens;
+ }
+
+ virtual unsigned max_tokens() const
+ {
+ return mMaxTokens;
+ }
+
+ virtual bool is_composing() const
+ {
+ return mIsComposing;
+ }
+
+ virtual bool apply_default(boost::any& value_store) const
+ {
+ return false; // No defaults.
+ }
+
+ virtual void notify(const boost::any& value_store) const
+ {
+ const LLCommandLineParser::token_vector_t* value =
+ boost::any_cast<const LLCommandLineParser::token_vector_t>(&value_store);
+ if(mNotifyCallback)
+ {
+ mNotifyCallback(*value);
+ }
+
+ }
+
+protected:
+ void xparse(boost::any& value_store,
+ const std::vector<std::string>& new_tokens) const
+ {
+ if(gPastLastOption)
+ {
+ throw(LLCLPLastOption("Don't parse no more!"));
+ }
+
+ // Error checks. Needed?
+ if (!value_store.empty() && !is_composing())
+ {
+ throw(LLCLPError("Non composing value with multiple occurences."));
+ }
+ if (new_tokens.size() < min_tokens() || new_tokens.size() > max_tokens())
+ {
+ throw(LLCLPError("Illegal number of tokens specified."));
+ }
+
+ if(value_store.empty())
+ {
+ value_store = boost::any(LLCommandLineParser::token_vector_t());
+ }
+ LLCommandLineParser::token_vector_t* tv =
+ boost::any_cast<LLCommandLineParser::token_vector_t>(&value_store);
+
+ for(unsigned i = 0; i < new_tokens.size() && i < mMaxTokens; ++i)
+ {
+ tv->push_back(new_tokens[i]);
+ }
+
+ if(mLastOption)
+ {
+ gPastLastOption = true;
+ }
+ }
+};
+
+//----------------------------------------------------------------------------
+// LLCommandLineParser defintions
+//----------------------------------------------------------------------------
+void LLCommandLineParser::addOptionDesc(const LLString& option_name,
+ boost::function1<void, const token_vector_t&> notify_callback,
+ unsigned int token_count,
+ const LLString& description,
+ const LLString& short_name,
+ bool composing,
+ bool positional,
+ bool last_option)
+{
+ // Compose the name for boost::po.
+ // It takes the format "long_name, short name"
+ const LLString comma(",");
+ LLString boost_option_name = option_name;
+ if(short_name != LLString::null)
+ {
+ boost_option_name += comma;
+ boost_option_name += short_name;
+ }
+
+ LLCLPValue* value_desc = new LLCLPValue();
+ value_desc->setMinTokens(token_count);
+ value_desc->setMaxTokens(token_count);
+ value_desc->setComposing(composing);
+ value_desc->setLastOption(last_option);
+
+ boost::shared_ptr<po::option_description> d(
+ new po::option_description(boost_option_name.c_str(),
+ value_desc,
+ description.c_str()));
+
+ if(!notify_callback.empty())
+ {
+ value_desc->setNotifyCallback(notify_callback);
+ }
+
+ gOptionsDesc.add(d);
+
+ if(positional)
+ {
+ gPositionalOptions.add(boost_option_name.c_str(), token_count);
+ }
+}
+
+bool parseAndStoreResults(po::command_line_parser& clp)
+{
+ try
+ {
+ clp.options(gOptionsDesc);
+ clp.positional(gPositionalOptions);
+ clp.style(po::command_line_style::default_style
+ | po::command_line_style::allow_long_disguise);
+ po::basic_parsed_options<char> opts = clp.run();
+ po::store(opts, gVariableMap);
+ }
+ catch(po::error& e)
+ {
+ llwarns << "Caught Error:" << e.what() << llendl;
+ return false;
+ }
+ catch(LLCLPError& e)
+ {
+ llwarns << "Caught Error:" << e.what() << llendl;
+ return false;
+ }
+ catch(LLCLPLastOption&)
+ {
+ // Continue without parsing.
+ llwarns << "Found tokens past last option. Ignoring." << llendl;
+
+ // boost::po will have stored a mal-formed option.
+ // All such options will be removed below.
+ for(po::variables_map::iterator i = gVariableMap.begin(); i != gVariableMap.end();)
+ {
+ po::variables_map::iterator tempI = i++;
+ if(tempI->second.empty())
+ {
+ gVariableMap.erase(tempI);
+ }
+ }
+ }
+ return true;
+}
+
+bool LLCommandLineParser::parseCommandLine(int argc, char **argv)
+{
+ po::command_line_parser clp(argc, argv);
+ return parseAndStoreResults(clp);
+}
+
+bool LLCommandLineParser::parseCommandLineString(const std::string& str)
+{
+ // Split the string content into tokens
+ boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'");
+ boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep);
+ std::vector<std::string> tokens;
+ // std::copy(tok.begin(), tok.end(), std::back_inserter(tokens));
+ for(boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin();
+ i != tok.end();
+ ++i)
+ {
+ if(0 != i->size())
+ {
+ tokens.push_back(*i);
+ }
+ }
+
+ po::command_line_parser clp(tokens);
+ return parseAndStoreResults(clp);
+
+}
+
+bool LLCommandLineParser::parseCommandLineFile(const std::basic_istream < char >& file)
+{
+ std::string args;
+ read_file_into_string(args, file);
+
+ return parseCommandLineString(args);
+}
+
+void LLCommandLineParser::notify()
+{
+ po::notify(gVariableMap);
+}
+
+void LLCommandLineParser::printOptions() const
+{
+ for(po::variables_map::iterator i = gVariableMap.begin(); i != gVariableMap.end(); ++i)
+ {
+ std::string name = i->first;
+ token_vector_t values = i->second.as<token_vector_t>();
+ std::ostringstream oss;
+ oss << name << ": ";
+ for(token_vector_t::iterator t_itr = values.begin(); t_itr != values.end(); ++t_itr)
+ {
+ oss << t_itr->c_str() << " ";
+ }
+ llinfos << oss.str() << llendl;
+ }
+}
+
+std::ostream& LLCommandLineParser::printOptionsDesc(std::ostream& os) const
+{
+ return os << gOptionsDesc;
+}
+
+bool LLCommandLineParser::hasOption(const std::string& name) const
+{
+ return gVariableMap.count(name) > 0;
+}
+
+const LLCommandLineParser::token_vector_t& LLCommandLineParser::getOption(const std::string& name) const
+{
+ if(hasOption(name))
+ {
+ return gVariableMap[name].as<token_vector_t>();
+ }
+
+ return gEmptyValue;
+}
+
+//----------------------------------------------------------------------------
+// LLControlGroupCLP defintions
+//----------------------------------------------------------------------------
+void setControlValueCB(const LLCommandLineParser::token_vector_t& value,
+ const LLString& opt_name,
+ LLControlGroup* ctrlGroup)
+{
+ if(value.size() > 1)
+ {
+ llwarns << "Ignoring extra tokens mapped to the setting: " << opt_name << "." << llendl;
+ }
+
+ // *FIX: Do sematic conversion here.
+ // LLSD (ImplString) Is no good for doing string to type conversion for...
+ // booleans
+ // compound types
+ // ?...
+
+ LLControlVariable* ctrl = ctrlGroup->getControl(opt_name);
+ if(NULL != ctrl)
+ {
+ switch(ctrl->type())
+ {
+ case TYPE_BOOLEAN:
+ if(value.size() > 1)
+ {
+ llwarns << "Ignoring extra tokens." << llendl;
+ }
+
+ if(value.size() > 0)
+ {
+ // There's a token. check the string for true/false/1/0 etc.
+ BOOL result = false;
+ BOOL gotSet = LLString::convertToBOOL(value[0], result);
+ if(gotSet)
+ {
+ ctrl->setValue(LLSD(result), false);
+ }
+ }
+ else
+ {
+ ctrl->setValue(LLSD(true), false);
+ }
+ break;
+
+ default:
+ {
+ // For the default types, let llsd do the conversion.
+ if(value.size() > 1)
+ {
+ // Assume its an array...
+ LLSD llsdArray;
+ for(unsigned int i = 0; i < value.size(); ++i)
+ {
+ LLSD llsdValue;
+ llsdValue.assign(LLSD::String(value[i]));
+ llsdArray.set(i, llsdValue);
+ }
+
+ ctrl->setValue(llsdArray, false);
+ }
+ else if(value.size() > 0)
+ {
+ LLSD llsdValue;
+ llsdValue.assign(LLSD::String(value[0]));
+ ctrl->setValue(llsdValue, false);
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ llwarns << "Command Line option mapping '"
+ << opt_name
+ << "' not found! Ignoring."
+ << llendl;
+ }
+}
+
+void LLControlGroupCLP::configure(const LLString& config_filename, LLControlGroup* controlGroup)
+{
+ // This method reads the llsd based config file, and uses it to set
+ // members of a control group.
+ LLSD clpConfigLLSD;
+
+ llifstream input_stream;
+ input_stream.open(config_filename.c_str(), std::ios::in | std::ios::binary);
+
+ if(input_stream.is_open())
+ {
+ LLSDSerialize::fromXML(clpConfigLLSD, input_stream);
+ for(LLSD::map_iterator option_itr = clpConfigLLSD.beginMap();
+ option_itr != clpConfigLLSD.endMap();
+ ++option_itr)
+ {
+ LLSD::String long_name = option_itr->first;
+ LLSD option_params = option_itr->second;
+
+ LLString desc("n/a");
+ if(option_params.has("desc"))
+ {
+ desc = option_params["desc"].asString();
+ }
+
+ LLString short_name = LLString::null;
+ if(option_params.has("short"))
+ {
+ short_name = option_params["short"].asString();
+ }
+
+ unsigned int token_count = 0;
+ if(option_params.has("count"))
+ {
+ token_count = option_params["count"].asInteger();
+ }
+
+ bool composing = false;
+ if(option_params.has("compose"))
+ {
+ composing = option_params["compose"].asBoolean();
+ }
+
+ bool positional = false;
+ if(option_params.has("positional"))
+ {
+ positional = option_params["positional"].asBoolean();
+ }
+
+ bool last_option = false;
+ if(option_params.has("last_option"))
+ {
+ last_option = option_params["last_option"].asBoolean();
+ }
+
+ boost::function1<void, const token_vector_t&> callback;
+ if(option_params.has("map-to") && (NULL != controlGroup))
+ {
+ LLString controlName = option_params["map-to"].asString();
+ callback = boost::bind(setControlValueCB, _1,
+ controlName, controlGroup);
+ }
+
+ this->addOptionDesc(
+ long_name,
+ callback,
+ token_count,
+ desc,
+ short_name,
+ composing,
+ positional,
+ last_option);
+ }
+ }
+}
diff --git a/indra/newview/llcommandlineparser.h b/indra/newview/llcommandlineparser.h
new file mode 100644
index 0000000000..6cc40ee8b4
--- /dev/null
+++ b/indra/newview/llcommandlineparser.h
@@ -0,0 +1,131 @@
+/**
+ * @file llcommandlineparser.h
+ * @brief LLCommandLineParser class declaration
+ *
+ * $LicenseInfo:firstyear=2007&license=viewergpl$
+ *
+ * Copyright (c) 2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+*/
+
+#ifndef LL_LLCOMMANDLINEPARSER_H
+#define LL_LLCOMMANDLINEPARSER_H
+
+#include <boost/function/function1.hpp>
+
+/**
+ * @class LLCommandLineParser
+ * @brief Handle defining and parsing the command line.
+ */
+class LLCommandLineParser
+{
+public:
+ typedef std::vector< std::string > token_vector_t;
+
+ /**
+ * @brief Add a value-less option to the command line description.
+ * @param option_name The long name of the cmd-line option.
+ * @param description The text description of the option usage.
+ */
+ void addOptionDesc(
+ const LLString& option_name,
+ boost::function1<void, const token_vector_t&> notify_callback = 0,
+ unsigned int num_tokens = 0,
+ const LLString& description = LLString::null,
+ const LLString& short_name = LLString::null,
+ bool composing = false,
+ bool positional = false,
+ bool last_option = false);
+
+
+ /**
+ * @brief Parse the command line given by argc/argv.
+ */
+ bool parseCommandLine(int argc, char **argv);
+
+ /**
+ * @brief Parse the command line contained by the given file.
+ */
+ bool parseCommandLineString(const std::string& str);
+
+ /**
+ * @brief Parse the command line contained by the given file.
+ */
+ bool parseCommandLineFile(const std::basic_istream< char >& file);
+
+ /**
+ * @brief Call callbacks associated with option descriptions.
+ *
+ * Use this to handle the results of parsing.
+ */
+ void notify();
+
+ /** @brief Print a description of the configured options.
+ *
+ * Use this to print a description of options to the
+ * given ostream. Useful for displaying usage info.
+ */
+ std::ostream& printOptionsDesc(std::ostream& os) const;
+
+ /** @brief Manual option setting accessors.
+ *
+ * Use these to retrieve get the values set for an option.
+ * getOption will return an empty value if the option isn't
+ * set.
+ */
+ bool hasOption(const std::string& name) const;
+ const token_vector_t& getOption(const std::string& name) const;
+
+ void printOptions() const;
+};
+
+inline std::ostream& operator<<(std::ostream& out, const LLCommandLineParser& clp)
+{
+ return clp.printOptionsDesc(out);
+}
+
+class LLControlGroup;
+
+/**
+ * @class LLControlGroupCLP
+ * @brief Uses the CLP to configure an LLControlGroup
+ *
+ *
+ */
+class LLControlGroupCLP : public LLCommandLineParser
+{
+public:
+ /**
+ * @brief Configure the command line parser according the given config file.
+ *
+ * @param config_filename The name of the XML based LLSD config file.
+ * @param clp A reference to the command line parser object to configure.
+ *
+ * *FIX:Mani Specify config file format.
+ */
+ void configure(const LLString& config_filename,
+ LLControlGroup* controlGroup);
+};
+
+#endif // LL_LLCOMMANDLINEPARSER_H
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index bf7d48f911..e6fcfb6d40 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -483,7 +483,7 @@ void LLFeatureManager::applyFeatures(bool skipFeatures)
}
// get the control setting
- LLControlBase* ctrl = gSavedSettings.getControl(mIt->first);
+ LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
if(ctrl == NULL)
{
llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl;
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 97ebc02ba1..b00450eec6 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -49,7 +49,8 @@ std::set<LLString> LLFirstUse::sConfigVariables;
// static
void LLFirstUse::addConfigVariable(const LLString& var)
{
- gSavedSettings.addWarning(var);
+ //Don't add the warning, now that we're storing the default in the settings_default.xml file
+ //gSavedSettings.addWarning(var);
sConfigVariables.insert(var);
}
@@ -256,13 +257,15 @@ void LLFirstUse::useSculptedPrim()
// static
void LLFirstUse::useVoice()
{
- if (gDisableVoice) return;
- if (gSavedSettings.getWarning("FirstVoice"))
- {
- gSavedSettings.setWarning("FirstVoice", FALSE);
-
- LLFloaterVoiceWizard::showInstance();
- }
+ if (!gSavedSettings.getBOOL("CmdLineDisableVoice"))
+ {
+ if (gSavedSettings.getWarning("FirstVoice"))
+ {
+ gSavedSettings.setWarning("FirstVoice", FALSE);
+
+ LLFloaterVoiceWizard::showInstance();
+ }
+ }
}
// static
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 4edf6f3652..3a1fc6146a 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -84,7 +84,7 @@ LLFloaterAbout::LLFloaterAbout()
+ llformat(" %d.%d.%d (%d) %s %s (%s)",
LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD,
__DATE__, __TIME__,
- gChannelName.c_str());
+ gSavedSettings.getString("VersionChannelName").c_str());
support.append(version);
support.append("\n\n");
diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp
index 4573ca75d2..7a0f01e5a6 100644
--- a/indra/newview/llfloatergroups.cpp
+++ b/indra/newview/llfloatergroups.cpp
@@ -173,8 +173,7 @@ bool LLPanelGroups::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
reset();
return true;
}
-
- return LLView::handleEvent(event, userdata);
+ return false;
}
// Default constructor
diff --git a/indra/newview/llfloatergroups.h b/indra/newview/llfloatergroups.h
index a1740861d5..6d99f34085 100644
--- a/indra/newview/llfloatergroups.h
+++ b/indra/newview/llfloatergroups.h
@@ -83,7 +83,7 @@ protected:
static instance_map_t sInstances;
};
-class LLPanelGroups : public LLPanel
+class LLPanelGroups : public LLPanel, public LLSimpleListener
{
public:
LLPanelGroups();
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 584d7479e4..345561f551 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -446,7 +446,7 @@ void LLFloaterPreference::onBtnOK( void* userdata )
fp->apply();
fp->close(false);
- gSavedSettings.saveToFile( gSettingsFileName, TRUE );
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
// save all settings, even if equals defaults
diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp
new file mode 100644
index 0000000000..7975bd95ef
--- /dev/null
+++ b/indra/newview/llfloatersettingsdebug.cpp
@@ -0,0 +1,490 @@
+/**
+ * @file llfloatersettingsdebug.cpp
+ * @brief floater for debugging internal viewer settings
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloatersettingsdebug.h"
+#include "llfloater.h"
+#include "llvieweruictrlfactory.h"
+#include "llfirstuse.h"
+#include "llcombobox.h"
+#include "llspinctrl.h"
+#include "llcolorswatch.h"
+#include "llviewercontrol.h"
+
+LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL;
+
+LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater("Configuration Editor")
+{
+}
+
+LLFloaterSettingsDebug::~LLFloaterSettingsDebug()
+{
+ sInstance = NULL;
+}
+
+BOOL LLFloaterSettingsDebug::postBuild()
+{
+ LLComboBox* settings_combo = LLUICtrlFactory::getComboBoxByName(this, "settings_combo");
+
+ struct f : public LLControlGroup::ApplyFunctor
+ {
+ LLComboBox* combo;
+ f(LLComboBox* c) : combo(c) {}
+ virtual void apply(const LLString& name, LLControlVariable* control)
+ {
+ combo->add(name, (void*)control);
+ }
+ } func(settings_combo);
+
+ gSavedSettings.applyToAll(&func);
+ gSavedPerAccountSettings.applyToAll(&func);
+ gColors.applyToAll(&func);
+
+ settings_combo->sortByName();
+ settings_combo->setCommitCallback(onSettingSelect);
+ settings_combo->setCallbackUserData(this);
+ settings_combo->updateSelection();
+
+ childSetCommitCallback("val_spinner_1", onCommitSettings);
+ childSetUserData("val_spinner_1", this);
+ childSetCommitCallback("val_spinner_2", onCommitSettings);
+ childSetUserData("val_spinner_2", this);
+ childSetCommitCallback("val_spinner_3", onCommitSettings);
+ childSetUserData("val_spinner_3", this);
+ childSetCommitCallback("val_spinner_4", onCommitSettings);
+ childSetUserData("val_spinner_4", this);
+ childSetCommitCallback("val_text", onCommitSettings);
+ childSetUserData("val_text", this);
+ childSetCommitCallback("boolean_combo", onCommitSettings);
+ childSetUserData("boolean_combo", this);
+ childSetCommitCallback("color_swatch", onCommitSettings);
+ childSetUserData("color_swatch", this);
+ childSetAction("default_btn", onClickDefault, this);
+ mComment = getChild<LLTextEditor>("comment_text");
+ return TRUE;
+}
+
+void LLFloaterSettingsDebug::draw()
+{
+ LLComboBox* settings_combo = getChild<LLComboBox>("settings_combo");
+ LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata();
+ updateControl(controlp);
+
+ LLFloater::draw();
+}
+
+//static
+void LLFloaterSettingsDebug::show(void*)
+{
+ if (sInstance == NULL)
+ {
+ sInstance = new LLFloaterSettingsDebug();
+
+ gUICtrlFactory->buildFloater(sInstance, "floater_settings_debug.xml");
+ }
+
+ sInstance->open(); /* Flawfinder: ignore */
+}
+
+//static
+void LLFloaterSettingsDebug::onSettingSelect(LLUICtrl* ctrl, void* user_data)
+{
+ LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data;
+ LLComboBox* combo_box = (LLComboBox*)ctrl;
+ LLControlVariable* controlp = (LLControlVariable*)combo_box->getCurrentUserdata();
+
+ floaterp->updateControl(controlp);
+}
+
+//static
+void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data)
+{
+ LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data;
+
+ LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo");
+ LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata();
+
+ LLVector3 vector;
+ LLVector3d vectord;
+ LLRect rect;
+ LLColor4 col4;
+ LLColor3 col3;
+ LLColor4U col4U;
+ LLColor4 color_with_alpha;
+
+ switch(controlp->type())
+ {
+ case TYPE_U32:
+ controlp->set(floaterp->childGetValue("val_spinner_1"));
+ break;
+ case TYPE_S32:
+ controlp->set(floaterp->childGetValue("val_spinner_1"));
+ break;
+ case TYPE_F32:
+ controlp->set(LLSD(floaterp->childGetValue("val_spinner_1").asReal()));
+ break;
+ case TYPE_BOOLEAN:
+ controlp->set(floaterp->childGetValue("boolean_combo"));
+ break;
+ case TYPE_STRING:
+ controlp->set(LLSD(floaterp->childGetValue("val_text").asString()));
+ break;
+ case TYPE_VEC3:
+ vector.mV[VX] = (F32)floaterp->childGetValue("val_spinner_1").asReal();
+ vector.mV[VY] = (F32)floaterp->childGetValue("val_spinner_2").asReal();
+ vector.mV[VZ] = (F32)floaterp->childGetValue("val_spinner_3").asReal();
+ controlp->set(vector.getValue());
+ break;
+ case TYPE_VEC3D:
+ vectord.mdV[VX] = floaterp->childGetValue("val_spinner_1").asReal();
+ vectord.mdV[VY] = floaterp->childGetValue("val_spinner_2").asReal();
+ vectord.mdV[VZ] = floaterp->childGetValue("val_spinner_3").asReal();
+ controlp->set(vectord.getValue());
+ break;
+ case TYPE_RECT:
+ rect.mLeft = floaterp->childGetValue("val_spinner_1").asInteger();
+ rect.mRight = floaterp->childGetValue("val_spinner_2").asInteger();
+ rect.mBottom = floaterp->childGetValue("val_spinner_3").asInteger();
+ rect.mTop = floaterp->childGetValue("val_spinner_4").asInteger();
+ controlp->set(rect.getValue());
+ break;
+ case TYPE_COL4:
+ col3.setValue(floaterp->childGetValue("color_swatch"));
+ col4 = LLColor4(col3, (F32)floaterp->childGetValue("val_spinner_4").asReal());
+ controlp->set(col4.getValue());
+ break;
+ case TYPE_COL3:
+ controlp->set(floaterp->childGetValue("color_swatch"));
+ //col3.mV[VRED] = (F32)floaterp->childGetValue("val_spinner_1").asC();
+ //col3.mV[VGREEN] = (F32)floaterp->childGetValue("val_spinner_2").asReal();
+ //col3.mV[VBLUE] = (F32)floaterp->childGetValue("val_spinner_3").asReal();
+ //controlp->set(col3.getValue());
+ break;
+ case TYPE_COL4U:
+ col3.setValue(floaterp->childGetValue("color_swatch"));
+ col4U.setVecScaleClamp(col3);
+ col4U.mV[VALPHA] = floaterp->childGetValue("val_spinner_4").asInteger();
+ controlp->set(col4U.getValue());
+ break;
+ default:
+ break;
+ }
+}
+
+// static
+void LLFloaterSettingsDebug::onClickDefault(void* user_data)
+{
+ LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data;
+ LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo");
+ LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata();
+
+ if (controlp)
+ {
+ controlp->resetToDefault();
+ floaterp->updateControl(controlp);
+ }
+}
+
+// we've switched controls, or doing per-frame update, so update spinners, etc.
+void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp)
+{
+ LLSpinCtrl* spinner1 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_1");
+ LLSpinCtrl* spinner2 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_2");
+ LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3");
+ LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4");
+ LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("color_swatch");
+
+ if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch)
+ {
+ llwarns << "Could not find all desired controls by name"
+ << llendl;
+ return;
+ }
+
+ spinner1->setVisible(FALSE);
+ spinner2->setVisible(FALSE);
+ spinner3->setVisible(FALSE);
+ spinner4->setVisible(FALSE);
+ color_swatch->setVisible(FALSE);
+ childSetVisible("val_text", FALSE);
+ childSetVisible("boolean_combo", FALSE);
+ mComment->setText(LLString::null);
+
+ if (controlp)
+ {
+ eControlType type = controlp->type();
+ mComment->setText(controlp->getComment());
+ spinner1->setMaxValue(F32_MAX);
+ spinner2->setMaxValue(F32_MAX);
+ spinner3->setMaxValue(F32_MAX);
+ spinner4->setMaxValue(F32_MAX);
+ spinner1->setMinValue(-F32_MAX);
+ spinner2->setMinValue(-F32_MAX);
+ spinner3->setMinValue(-F32_MAX);
+ spinner4->setMinValue(-F32_MAX);
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setIncrement(0.1f);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setIncrement(0.1f);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setIncrement(0.1f);
+ }
+ if (!spinner4->hasFocus())
+ {
+ spinner4->setIncrement(0.1f);
+ }
+
+ LLSD sd = controlp->get();
+ switch(type)
+ {
+ case TYPE_U32:
+ spinner1->setVisible(TRUE);
+ spinner1->setLabel(LLString("value")); // Debug, don't translate
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setValue(sd);
+ spinner1->setMinValue((F32)U32_MIN);
+ spinner1->setMaxValue((F32)U32_MAX);
+ spinner1->setIncrement(1.f);
+ spinner1->setPrecision(0);
+ }
+ break;
+ case TYPE_S32:
+ spinner1->setVisible(TRUE);
+ spinner1->setLabel(LLString("value")); // Debug, don't translate
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setValue(sd);
+ spinner1->setMinValue((F32)S32_MIN);
+ spinner1->setMaxValue((F32)S32_MAX);
+ spinner1->setIncrement(1.f);
+ spinner1->setPrecision(0);
+ }
+ break;
+ case TYPE_F32:
+ spinner1->setVisible(TRUE);
+ spinner1->setLabel(LLString("value")); // Debug, don't translate
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(3);
+ spinner1->setValue(sd);
+ }
+ break;
+ case TYPE_BOOLEAN:
+ childSetVisible("boolean_combo", TRUE);
+
+ if (!childHasFocus("boolean_combo"))
+ {
+ if (sd.asBoolean())
+ {
+ childSetValue("boolean_combo", LLSD("true"));
+ }
+ else
+ {
+ childSetValue("boolean_combo", LLSD(""));
+ }
+ }
+ break;
+ case TYPE_STRING:
+ childSetVisible("val_text", TRUE);
+ if (!childHasFocus("val_text"))
+ {
+ childSetValue("val_text", sd);
+ }
+ break;
+ case TYPE_VEC3:
+ {
+ LLVector3 v;
+ v.setValue(sd);
+ spinner1->setVisible(TRUE);
+ spinner1->setLabel(LLString("X"));
+ spinner2->setVisible(TRUE);
+ spinner2->setLabel(LLString("Y"));
+ spinner3->setVisible(TRUE);
+ spinner3->setLabel(LLString("Z"));
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(3);
+ spinner1->setValue(v[VX]);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setPrecision(3);
+ spinner2->setValue(v[VY]);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setPrecision(3);
+ spinner3->setValue(v[VZ]);
+ }
+ break;
+ }
+ case TYPE_VEC3D:
+ {
+ LLVector3d v;
+ v.setValue(sd);
+ spinner1->setVisible(TRUE);
+ spinner1->setLabel(LLString("X"));
+ spinner2->setVisible(TRUE);
+ spinner2->setLabel(LLString("Y"));
+ spinner3->setVisible(TRUE);
+ spinner3->setLabel(LLString("Z"));
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(3);
+ spinner1->setValue(v[VX]);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setPrecision(3);
+ spinner2->setValue(v[VY]);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setPrecision(3);
+ spinner3->setValue(v[VZ]);
+ }
+ break;
+ }
+ case TYPE_RECT:
+ {
+ LLRect r;
+ r.setValue(sd);
+ spinner1->setVisible(TRUE);
+ spinner1->setLabel(LLString("Left"));
+ spinner2->setVisible(TRUE);
+ spinner2->setLabel(LLString("Right"));
+ spinner3->setVisible(TRUE);
+ spinner3->setLabel(LLString("Bottom"));
+ spinner4->setVisible(TRUE);
+ spinner4->setLabel(LLString("Top"));
+ if (!spinner1->hasFocus())
+ {
+ spinner1->setPrecision(0);
+ spinner1->setValue(r.mLeft);
+ }
+ if (!spinner2->hasFocus())
+ {
+ spinner2->setPrecision(0);
+ spinner2->setValue(r.mRight);
+ }
+ if (!spinner3->hasFocus())
+ {
+ spinner3->setPrecision(0);
+ spinner3->setValue(r.mBottom);
+ }
+ if (!spinner4->hasFocus())
+ {
+ spinner4->setPrecision(0);
+ spinner4->setValue(r.mTop);
+ }
+
+ spinner1->setMinValue((F32)S32_MIN);
+ spinner1->setMaxValue((F32)S32_MAX);
+ spinner1->setIncrement(1.f);
+
+ spinner2->setMinValue((F32)S32_MIN);
+ spinner2->setMaxValue((F32)S32_MAX);
+ spinner2->setIncrement(1.f);
+
+ spinner3->setMinValue((F32)S32_MIN);
+ spinner3->setMaxValue((F32)S32_MAX);
+ spinner3->setIncrement(1.f);
+
+ spinner4->setMinValue((F32)S32_MIN);
+ spinner4->setMaxValue((F32)S32_MAX);
+ spinner4->setIncrement(1.f);
+ break;
+ }
+ case TYPE_COL4:
+ {
+ LLColor4 clr;
+ clr.setValue(sd);
+ color_swatch->setVisible(TRUE);
+ // only set if changed so color picker doesn't update
+ if(clr != LLColor4(color_swatch->getValue()))
+ {
+ color_swatch->set(LLColor4(sd), TRUE, FALSE);
+ }
+ spinner4->setVisible(TRUE);
+ spinner4->setLabel(LLString("Alpha"));
+ if (!spinner4->hasFocus())
+ {
+ spinner4->setPrecision(3);
+ spinner4->setMinValue(0.0);
+ spinner4->setMaxValue(1.f);
+ spinner4->setValue(clr.mV[VALPHA]);
+ }
+ break;
+ }
+ case TYPE_COL3:
+ {
+ LLColor3 clr;
+ clr.setValue(sd);
+ color_swatch->setVisible(TRUE);
+ color_swatch->setValue(sd);
+ break;
+ }
+ case TYPE_COL4U:
+ {
+ LLColor4U clr;
+ clr.setValue(sd);
+ color_swatch->setVisible(TRUE);
+ if(LLColor4(clr) != LLColor4(color_swatch->getValue()))
+ {
+ color_swatch->set(LLColor4(clr), TRUE, FALSE);
+ }
+ spinner4->setVisible(TRUE);
+ spinner4->setLabel(LLString("Alpha"));
+ if(!spinner4->hasFocus())
+ {
+ spinner4->setPrecision(0);
+ spinner4->setValue(clr.mV[VALPHA]);
+ }
+
+ spinner4->setMinValue(0);
+ spinner4->setMaxValue(255);
+ spinner4->setIncrement(1.f);
+
+ break;
+ }
+ default:
+ mComment->setText(LLString("unknown"));
+ break;
+ }
+ }
+
+}
diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h
new file mode 100644
index 0000000000..389a474467
--- /dev/null
+++ b/indra/newview/llfloatersettingsdebug.h
@@ -0,0 +1,61 @@
+/**
+ * @file llfloatersettingsdebug.h
+ * @brief floater for debugging internal viewer settings
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2007, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLFLOATERDEBUGSETTINGS_H
+#define LLFLOATERDEBUGSETTINGS_H
+
+#include "llcontrol.h"
+#include "llfloater.h"
+#include "lltexteditor.h"
+
+class LLFloaterSettingsDebug : public LLFloater
+{
+public:
+ LLFloaterSettingsDebug();
+ virtual ~LLFloaterSettingsDebug();
+
+ virtual BOOL postBuild();
+ virtual void draw();
+
+ void updateControl(LLControlVariable* control);
+
+ static void show(void*);
+ static void onSettingSelect(LLUICtrl* ctrl, void* user_data);
+ static void onCommitSettings(LLUICtrl* ctrl, void* user_data);
+ static void onClickDefault(void* user_data);
+
+protected:
+ static LLFloaterSettingsDebug* sInstance;
+ LLTextEditor* mComment;
+};
+
+#endif //LLFLOATERDEBUGSETTINGS_H
+
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 7ceb40499f..e24b5251e0 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -163,8 +163,6 @@ LLNetMap::LLNetMap(
mPopupMenuHandle = menu->getHandle();
sInstance = this;
-
- gSavedSettings.getControl("MiniMapRotate")->addListener(&mNetMapListener);
}
LLNetMap::~LLNetMap()
@@ -828,9 +826,3 @@ void LLNetMap::handleZoomLevel(void* which)
break;
}
}
-
-bool LLRotateNetMapListener::handleEvent(LLPointer<LLEvent> event, const LLSD& user_data)
-{
- LLNetMap::setRotateMap(event->getValue().asBoolean());
- return true;
-}
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index d375413d1d..dc696238ea 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -45,12 +45,6 @@ class LLCoordGL;
class LLTextBox;
class LLMenuGL;
-class LLRotateNetMapListener : public LLSimpleListener
-{
-public:
- bool handleEvent(LLPointer<LLEvent>, const LLSD& user_data);
-};
-
class LLNetMap : public LLUICtrl
{
public:
@@ -117,8 +111,6 @@ public:
LLTextBox* mTextBoxNorthWest;
LLTextBox* mTextBoxSouthWest;
- LLRotateNetMapListener mNetMapListener;
-
static BOOL sRotateMap;
static LLNetMap* sInstance;
};
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 1e933706e1..b6e8c1a7f3 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -206,7 +206,7 @@ void LLLoginHandler::parse(const LLSD& queryMap)
if (LLAppViewer::instance()->getLoginURIs().size() == 0)
{
- snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); /* Flawfinder: ignore */
+ gGridName = gGridInfo[gGridChoice].mName; /* Flawfinder: ignore */
LLAppViewer::instance()->resetURIs();
}
@@ -429,7 +429,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLTextBox* channel_text = LLUICtrlFactory::getTextBoxByName(this, "channel_text");
if (channel_text)
{
- channel_text->setText(gChannelName);
+ channel_text->setText(gSavedSettings.getString("VersionChannelName"));
channel_text->setClickedCallback(onClickVersion);
channel_text->setCallbackUserData(this);
}
@@ -471,7 +471,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// kick off a request to grab the url manually
gResponsePtr = LLIamHereLogin::build( this );
- std::string login_page = LLAppViewer::instance()->getLoginPage();
+ std::string login_page = gSavedSettings.getString("LoginPage");
if (login_page.empty())
{
login_page = getString( "real_url" );
@@ -927,7 +927,7 @@ void LLPanelLogin::loadLoginPage()
std::ostringstream oStr;
- std::string login_page = LLAppViewer::instance()->getLoginPage();
+ std::string login_page = gSavedSettings.getString("LoginPage");
if (login_page.empty())
{
login_page = sInstance->getString( "real_url" );
@@ -984,24 +984,24 @@ void LLPanelLogin::loadLoginPage()
}
LLString firstname, lastname;
-
- if (gCmdLineFirstName.empty())
+
+ if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
+ {
+ LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
+ firstname = cmd_line_login[0].asString();
+ lastname = cmd_line_login[1].asString();
+ password = cmd_line_login[2].asString();
+ }
+
+ if (firstname.empty())
{
firstname = gSavedSettings.getString("FirstName");
}
- else
- {
- firstname = gCmdLineFirstName;
- }
- if (gCmdLineLastName.empty())
+ if (lastname.empty())
{
lastname = gSavedSettings.getString("LastName");
}
- else
- {
- lastname = gCmdLineLastName;
- }
LLString version = llformat("%d.%d.%d (%d)",
LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD);
@@ -1020,9 +1020,9 @@ void LLPanelLogin::loadLoginPage()
curl_free(curl_version);
- if (!gCmdLinePassword.empty())
+ if (!password.empty())
{
- oStr << "&password=" << gCmdLinePassword;
+ oStr << "&password=" << password;
}
else if (!(password = load_password_from_disk()).empty())
{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index d2bc8f4100..f2475d84d9 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -447,7 +447,7 @@ BOOL idle_startup()
{
fclose(found_template);
- U32 port = gAgent.mViewerPort;
+ U32 port = gSavedSettings.getU32("UserConnectionPort");
if ((NET_USE_OS_ASSIGNED_PORT == port) && // if nothing specified on command line (-port)
(gSavedSettings.getBOOL("ConnectionPortEnabled")))
@@ -497,7 +497,7 @@ BOOL idle_startup()
invalid_message_callback,
NULL);
- if (gSavedSettings.getBOOL("LogMessages") || gLogMessages)
+ if (gSavedSettings.getBOOL("LogMessages"))
{
llinfos << "Message logging activated!" << llendl;
msg->startLogging();
@@ -516,18 +516,23 @@ BOOL idle_startup()
}
gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS);
- msg->mPacketRing.setDropPercentage(gPacketDropPercentage);
- if (gInBandwidth != 0.f)
+
+ F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage");
+ msg->mPacketRing.setDropPercentage(dropPercent);
+
+ F32 inBandwidth = gSavedSettings.getF32("InBandwidth");
+ F32 outBandwidth = gSavedSettings.getF32("OutBandwidth");
+ if (inBandwidth != 0.f)
{
- llinfos << "Setting packetring incoming bandwidth to " << gInBandwidth << llendl;
+ llinfos << "Setting packetring incoming bandwidth to " << inBandwidth << llendl;
msg->mPacketRing.setUseInThrottle(TRUE);
- msg->mPacketRing.setInBandwidth(gInBandwidth);
+ msg->mPacketRing.setInBandwidth(inBandwidth);
}
- if (gOutBandwidth != 0.f)
+ if (outBandwidth != 0.f)
{
- llinfos << "Setting packetring outgoing bandwidth to " << gOutBandwidth << llendl;
+ llinfos << "Setting packetring outgoing bandwidth to " << outBandwidth << llendl;
msg->mPacketRing.setUseOutThrottle(TRUE);
- msg->mPacketRing.setOutBandwidth(gOutBandwidth);
+ msg->mPacketRing.setOutBandwidth(outBandwidth);
}
}
@@ -541,7 +546,7 @@ BOOL idle_startup()
// or audio cues in connection UI.
//-------------------------------------------------
- if (gUseAudio)
+ if (FALSE == gSavedSettings.getBOOL("NoAudio"))
{
#if LL_FMOD
gAudiop = (LLAudioEngine *) new LLAudioEngine_FMOD();
@@ -586,14 +591,13 @@ BOOL idle_startup()
show_connect_box = FALSE;
}
- else if( !gCmdLineFirstName.empty()
- && !gCmdLineLastName.empty()
- && !gCmdLinePassword.empty())
- {
- firstname = gCmdLineFirstName;
- lastname = gCmdLineLastName;
+ else if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
+ {
+ LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
+ firstname = cmd_line_login[0].asString();
+ lastname = cmd_line_login[1].asString();
- LLMD5 pass((unsigned char*)gCmdLinePassword.c_str());
+ LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str());
char md5pass[33]; /* Flawfinder: ignore */
pass.hex_digest(md5pass);
password = md5pass;
@@ -604,9 +608,9 @@ BOOL idle_startup()
#else
show_connect_box = FALSE;
#endif
- gAutoLogin = TRUE;
- }
- else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin"))
+ gSavedSettings.setBOOL("AutoLogin", TRUE);
+ }
+ else if (gSavedSettings.getBOOL("AutoLogin"))
{
firstname = gSavedSettings.getString("FirstName");
lastname = gSavedSettings.getString("LastName");
@@ -781,19 +785,14 @@ BOOL idle_startup()
// create necessary directories
// *FIX: these mkdir's should error check
gDirUtilp->setLindenUserDir(firstname.c_str(), lastname.c_str());
+ LLFile::mkdir(gDirUtilp->getLindenUserDir().c_str());
+ // Set UserSettingsFile to the default value.
+ gSavedSettings.setString("UserSettingsFile",
+ gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, DEFAULT_SETTINGS_FILE));
- LLFile::mkdir(gDirUtilp->getLindenUserDir().c_str());
-
- // the mute list is loaded in the llmutelist class.
-
- gSavedSettings.loadFromFile(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml"));
-
- // handle the per account settings setup
- gPerAccountSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, DEFAULT_SETTINGS_FILE);
-
- // per account settings. Set defaults here if not found. If we get a bunch of these, eventually move to a function.
- gSavedPerAccountSettings.loadFromFile(gPerAccountSettingsFileName);
+ // Overwrite default user settings with user settings
+ LLAppViewer::instance()->loadSettingsFromDirectory(LL_PATH_PER_SL_ACCOUNT);
// Need to set the LastLogoff time here if we don't have one. LastLogoff is used for "Recent Items" calculation
// and startup time is close enough if we don't have a real value.
@@ -828,7 +827,7 @@ BOOL idle_startup()
gSavedSettings.setS32("ServerChoice", gGridChoice);
if (gGridChoice == GRID_INFO_OTHER)
{
- snprintf(gGridName, MAX_STRING, "%s", server_label.c_str());/* Flawfinder: ignore */
+ gGridName = server_label;/* Flawfinder: ignore */
}
if ( user_picked_server )
@@ -932,7 +931,7 @@ BOOL idle_startup()
//requested_options.push_back("inventory-meat");
//requested_options.push_back("inventory-skel-targets");
#if (!defined LL_MINIMIAL_REQUESTED_OPTIONS)
- if(gRequestInventoryLibrary)
+ if(FALSE == gSavedSettings.getBOOL("NoInventoryLibrary"))
{
requested_options.push_back("inventory-lib-root");
requested_options.push_back("inventory-lib-owner");
@@ -952,7 +951,7 @@ BOOL idle_startup()
requested_options.push_back("tutorial_setting");
requested_options.push_back("login-flags");
requested_options.push_back("global-textures");
- if(gGodConnect)
+ if(gSavedSettings.getBOOL("ConnectAsGod"))
{
gSavedSettings.setBOOL("UseDebugMenus", TRUE);
requested_options.push_back("god-connect");
@@ -1240,7 +1239,6 @@ BOOL idle_startup()
<< (sAuthUriNum + 1) << ". ";
auth_desc = s.str();
LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE );
- sAuthUriNum++;
return do_normal_idle;
}
break;
@@ -1490,7 +1488,7 @@ BOOL idle_startup()
args["[ERROR_MESSAGE]"] = emsg.str();
gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);
reset_login();
- gAutoLogin = FALSE;
+ gSavedSettings.setBOOL("AutoLogin", FALSE);
show_connect_box = TRUE;
}
@@ -1510,7 +1508,7 @@ BOOL idle_startup()
args["[ERROR_MESSAGE]"] = emsg.str();
gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);
reset_login();
- gAutoLogin = FALSE;
+ gSavedSettings.setBOOL("AutoLogin", FALSE);
show_connect_box = TRUE;
// Don't save an incorrect password to disk.
save_password_to_disk(NULL);
@@ -1534,7 +1532,7 @@ BOOL idle_startup()
// Since we connected, save off the settings so the user doesn't have to
// type the name/password again if we crash.
- gSavedSettings.saveToFile(gSettingsFileName, TRUE);
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
//
// Initialize classes w/graphics stuff.
@@ -2101,7 +2099,7 @@ BOOL idle_startup()
gSavedSettings.setString( "NextLoginLocation", "" );
// and make sure it's saved
- gSavedSettings.saveToFile( gSettingsFileName, TRUE );
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );
};
if (!gNoRender)
@@ -2393,7 +2391,7 @@ void login_show()
if( GRID_INFO_OTHER == gGridChoice )
{
- LLPanelLogin::addServer( gGridName, GRID_INFO_OTHER );
+ LLPanelLogin::addServer( gGridName.c_str(), GRID_INFO_OTHER );
}
else
{
@@ -2441,7 +2439,7 @@ void login_callback(S32 option, void *userdata)
{
// turn off the setting and write out to disk
gSavedSettings.setBOOL("RememberPassword", FALSE);
- gSavedSettings.saveToFile(gSettingsFileName, TRUE);
+ gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );
// stomp the saved password on disk
save_password_to_disk(NULL);
@@ -2635,7 +2633,7 @@ void login_alert_status(S32 option, void* user_data)
void update_app(BOOL mandatory, const std::string& auth_msg)
{
// store off config state, as we might quit soon
- gSavedSettings.saveToFile(gSettingsFileName, TRUE);
+ gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
std::ostringstream message;
@@ -2735,7 +2733,7 @@ void update_dialog_callback(S32 option, void *userdata)
// *TODO change userserver to be grid on both viewer and sim, since
// userserver no longer exists.
query_map["userserver"] = gGridName;
- query_map["channel"] = gChannelName;
+ query_map["channel"] = gSavedSettings.getString("VersionChannelName");
// *TODO constantize this guy
LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map);
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index ffa921125a..9c8bb97343 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -80,14 +80,10 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)
{
if( gAgent.cameraMouselook() )
{
- #if 1 //LL_WINDOWS || LL_DARWIN
- const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f;
- #else
- const F32 NOMINAL_MOUSE_SENSITIVITY = 0.025f;
- #endif
+ const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f;
-
- F32 mouse_sensitivity = clamp_rescale(gMouseSensitivity, 0.f, 15.f, 0.5f, 2.75f) * NOMINAL_MOUSE_SENSITIVITY;
+ F32 mouse_sensitivity = gSavedSettings.getF32("MouseSensitivity");
+ mouse_sensitivity = clamp_rescale(mouse_sensitivity, 0.f, 15.f, 0.5f, 2.75f) * NOMINAL_MOUSE_SENSITIVITY;
// ...move the view with the mouse
@@ -98,7 +94,7 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)
if (dx != 0 || dy != 0)
{
// ...actually moved off center
- if (gInvertMouse)
+ if (gSavedSettings.getBOOL("InvertMouse"))
{
gAgent.pitch(mouse_sensitivity * -dy);
}
diff --git a/indra/newview/llvectorperfoptions.cpp b/indra/newview/llvectorperfoptions.cpp
index ca8ae2e886..34c10a4f72 100644
--- a/indra/newview/llvectorperfoptions.cpp
+++ b/indra/newview/llvectorperfoptions.cpp
@@ -31,101 +31,4 @@
#include "llviewerprecompiledheaders.h"
-#include "llvectorperfoptions.h"
-#include "llviewerjointmesh.h"
-#include "llviewercontrol.h"
-
-// Initially, we test the performance of the vectorization code, then
-// turn it off if it ends up being slower. JC
-BOOL gVectorizePerfTest = TRUE;
-BOOL gVectorizeEnable = FALSE;
-U32 gVectorizeProcessor = 0;
-BOOL gVectorizeSkin = FALSE;
-
-void update_vector_performances(void)
-{
- char *vp;
-
- switch(gVectorizeProcessor)
- {
- case 2: vp = "SSE2"; break; // *TODO: replace the magic #s
- case 1: vp = "SSE"; break;
- default: vp = "COMPILER DEFAULT"; break;
- }
- llinfos << "Vectorization : " << ( gVectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ;
- llinfos << "Vector Processor : " << vp << llendl ;
- llinfos << "Vectorized Skinning : " << ( gVectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ;
-
- if(gVectorizeEnable && gVectorizeSkin)
- {
- switch(gVectorizeProcessor)
- {
- case 2:
- LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE2;
- break;
- case 1:
- LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE;
- break;
- default:
- LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryVectorized;
- break;
- }
- }
- else
- {
- LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryOriginal;
- }
-}
-
-
-class LLVectorizationEnableListener: public LLSimpleListener
-{
- bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
- {
- gVectorizeEnable = event->getValue().asBoolean();
- update_vector_performances();
- return true;
- }
-};
-static LLVectorizationEnableListener vectorization_enable_listener;
-
-class LLVectorizeSkinListener: public LLSimpleListener
-{
- bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
- {
- gVectorizeSkin = event->getValue().asBoolean();
- update_vector_performances();
- return true;
- }
-};
-static LLVectorizeSkinListener vectorize_skin_listener;
-
-class LLVectorProcessorListener: public LLSimpleListener
-{
- bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
- {
- gVectorizeProcessor = event->getValue().asInteger();
- update_vector_performances();
- return true;
- }
-};
-static LLVectorProcessorListener vector_processor_listener;
-
-void LLVectorPerformanceOptions::initClass()
-{
- gVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest");
- gVectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable");
- gVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor");
- gVectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin");
- update_vector_performances();
-
- // these are currently static in this file, so they can't move to settings_setup_listeners
- gSavedSettings.getControl("VectorizeEnable")->addListener(&vectorization_enable_listener);
- gSavedSettings.getControl("VectorizeProcessor")->addListener(&vector_processor_listener);
- gSavedSettings.getControl("VectorizeSkin")->addListener(&vectorize_skin_listener);
-}
-
-void LLVectorPerformanceOptions::cleanupClass()
-{
-}
-
+// Deprecated - moved into llviewerjointmesh
diff --git a/indra/newview/llvectorperfoptions.h b/indra/newview/llvectorperfoptions.h
index dac4d1f86c..e2a0a37e33 100644
--- a/indra/newview/llvectorperfoptions.h
+++ b/indra/newview/llvectorperfoptions.h
@@ -32,10 +32,6 @@
#ifndef LL_VECTORPERFOPTIONS_H
#define LL_VECTORPERFOPTIONS_H
-namespace LLVectorPerformanceOptions
-{
- void initClass(); // Run after configuration files are read.
- void cleanupClass();
-};
+// Deprecated - moved into llviewerjointmesh
#endif
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index affce91b79..fd85ac1bc1 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -65,7 +65,7 @@ void init_audio()
BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
- if (!mute_audio && gPreloadSounds)
+ if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload"))
{
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert")));
gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke")));
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 9c81f89e99..7733ef5ae1 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -36,26 +36,47 @@
#include "indra_constants.h"
-#include "v3math.h"
-#include "v3dmath.h"
-#include "llrect.h"
-#include "v4color.h"
-#include "v4coloru.h"
-#include "v3color.h"
-
-#include "llfloater.h"
-#include "llvieweruictrlfactory.h"
-#include "llfirstuse.h"
-#include "llcombobox.h"
-#include "llspinctrl.h"
-#include "llcolorswatch.h"
+// For Listeners
+#include "audioengine.h"
+#include "llagent.h"
+#include "llconsole.h"
+#include "lldrawpoolterrain.h"
+#include "llflexibleobject.h"
+#include "llfeaturemanager.h"
+#include "llglslshader.h"
+#include "llnetmap.h"
+#include "llpanelgeneral.h"
+#include "llpanelinput.h"
+#include "llsky.h"
+#include "llvieweraudio.h"
+#include "llviewerimagelist.h"
+#include "llviewerthrottle.h"
+#include "llviewerwindow.h"
+#include "llvoavatar.h"
+#include "llvoiceclient.h"
+#include "llvosky.h"
+#include "llvotree.h"
+#include "llvovolume.h"
+#include "llworld.h"
+#include "pipeline.h"
+#include "llviewerjoystick.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+#include "llnotify.h"
+#include "llkeyboard.h"
+#include "llerrorcontrol.h"
+#include "llversionviewer.h"
+#include "llappviewer.h"
+#include "llvosurfacepatch.h"
+#include "llvowlsky.h"
+#include "llglimmediate.h"
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
BOOL gHackGodmode = FALSE;
#endif
-LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL;
+std::map<LLString, LLControlGroup*> gSettings;
LLControlGroup gSavedSettings; // saved at end of session
LLControlGroup gSavedPerAccountSettings; // saved at end of session
LLControlGroup gViewerArt; // read-only
@@ -65,461 +86,440 @@ LLControlGroup gCrashSettings; // saved at end of session
LLString gLastRunVersion;
LLString gCurrentVersion;
-LLString gSettingsFileName;
-LLString gPerAccountSettingsFileName;
+extern BOOL gResizeScreenTexture;
-LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater("Configuration Editor")
+////////////////////////////////////////////////////////////////////////////
+// Listeners
+
+static bool handleRenderAvatarMouselookChanged(const LLSD& newvalue)
+{
+ LLVOAvatar::sVisibleInFirstPerson = newvalue.asBoolean();
+ return true;
+}
+
+static bool handleRenderFarClipChanged(const LLSD& newvalue)
{
+ F32 draw_distance = (F32) newvalue.asReal();
+ gAgent.mDrawDistance = draw_distance;
+ if (gWorldPointer)
+ {
+ gWorldPointer->setLandFarClip(draw_distance);
+ }
+ return true;
}
-LLFloaterSettingsDebug::~LLFloaterSettingsDebug()
+static bool handleTerrainDetailChanged(const LLSD& newvalue)
{
- sInstance = NULL;
+ LLDrawPoolTerrain::sDetailMode = newvalue.asInteger();
+ return true;
}
-BOOL LLFloaterSettingsDebug::postBuild()
+
+static bool handleSetShaderChanged(const LLSD& newvalue)
{
- LLComboBox* settings_combo = LLUICtrlFactory::getComboBoxByName(this, "settings_combo");
+ LLShaderMgr::setShaders();
+ return true;
+}
- LLControlGroup::ctrl_name_table_t::iterator name_it;
- for(name_it = gSavedSettings.mNameTable.begin(); name_it != gSavedSettings.mNameTable.end(); ++name_it)
+static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
+{
+ if (gPipeline.isInit())
{
- settings_combo->add(name_it->first, (void*)name_it->second);
+ gPipeline.releaseGLBuffers();
+ gPipeline.createGLBuffers();
}
- for(name_it = gSavedPerAccountSettings.mNameTable.begin(); name_it != gSavedPerAccountSettings.mNameTable.end(); ++name_it)
+ return true;
+}
+
+static bool handleVolumeLODChanged(const LLSD& newvalue)
+{
+ LLVOVolume::sLODFactor = (F32) newvalue.asReal();
+ LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f;
+ return true;
+}
+
+static bool handleAvatarLODChanged(const LLSD& newvalue)
+{
+ LLVOAvatar::sLODFactor = (F32) newvalue.asReal();
+ return true;
+}
+
+static bool handleTerrainLODChanged(const LLSD& newvalue)
+{
+ LLVOSurfacePatch::sLODFactor = (F32)newvalue.asReal();
+ //sqaure lod factor to get exponential range of [0,4] and keep
+ //a value of 1 in the middle of the detail slider for consistency
+ //with other detail sliders (see panel_preferences_graphics1.xml)
+ LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor;
+ return true;
+}
+
+static bool handleTreeLODChanged(const LLSD& newvalue)
+{
+ LLVOTree::sTreeFactor = (F32) newvalue.asReal();
+ return true;
+}
+
+static bool handleFlexLODChanged(const LLSD& newvalue)
+{
+ LLVolumeImplFlexible::sUpdateFactor = (F32) newvalue.asReal();
+ return true;
+}
+
+static bool handleGammaChanged(const LLSD& newvalue)
+{
+ F32 gamma = (F32) newvalue.asReal();
+ if (gamma == 0.0f)
{
- settings_combo->add(name_it->first, (void*)name_it->second);
+ gamma = 1.0f; // restore normal gamma
}
- for(name_it = gColors.mNameTable.begin(); name_it != gColors.mNameTable.end(); ++name_it)
+ if (gViewerWindow && gViewerWindow->getWindow() && gamma != gViewerWindow->getWindow()->getGamma())
{
- settings_combo->add(name_it->first, (void*)name_it->second);
+ // Only save it if it's changed
+ if (!gViewerWindow->getWindow()->setGamma(gamma))
+ {
+ llwarns << "setGamma failed!" << llendl;
+ }
}
- settings_combo->sortByName();
- settings_combo->setCommitCallback(onSettingSelect);
- settings_combo->setCallbackUserData(this);
- settings_combo->updateSelection();
-
- childSetCommitCallback("val_spinner_1", onCommitSettings);
- childSetUserData("val_spinner_1", this);
- childSetCommitCallback("val_spinner_2", onCommitSettings);
- childSetUserData("val_spinner_2", this);
- childSetCommitCallback("val_spinner_3", onCommitSettings);
- childSetUserData("val_spinner_3", this);
- childSetCommitCallback("val_spinner_4", onCommitSettings);
- childSetUserData("val_spinner_4", this);
- childSetCommitCallback("val_text", onCommitSettings);
- childSetUserData("val_text", this);
- childSetCommitCallback("boolean_combo", onCommitSettings);
- childSetUserData("boolean_combo", this);
- childSetCommitCallback("color_swatch", onCommitSettings);
- childSetUserData("color_swatch", this);
- childSetAction("default_btn", onClickDefault, this);
- mComment = getChild<LLTextEditor>("comment_text");
- return TRUE;
-}
-
-void LLFloaterSettingsDebug::draw()
-{
- LLComboBox* settings_combo = getChild<LLComboBox>("settings_combo");
- LLControlBase* controlp = (LLControlBase*)settings_combo->getCurrentUserdata();
- updateControl(controlp);
-
- LLFloater::draw();
-}
-
-//static
-void LLFloaterSettingsDebug::show(void*)
-{
- if (sInstance == NULL)
- {
- sInstance = new LLFloaterSettingsDebug();
- gUICtrlFactory->buildFloater(sInstance, "floater_settings_debug.xml");
- }
+ return true;
+}
- sInstance->open(); /* Flawfinder: ignore */
-}
-
-//static
-void LLFloaterSettingsDebug::onSettingSelect(LLUICtrl* ctrl, void* user_data)
-{
- LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data;
- LLComboBox* combo_box = (LLComboBox*)ctrl;
- LLControlBase* controlp = (LLControlBase*)combo_box->getCurrentUserdata();
-
- floaterp->updateControl(controlp);
-}
-
-//static
-void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data)
-{
- LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data;
-
- LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo");
- LLControlBase* controlp = (LLControlBase*)settings_combo->getCurrentUserdata();
-
- LLVector3 vector;
- LLVector3d vectord;
- LLRect rect;
- LLColor4 col4;
- LLColor3 col3;
- LLColor4U col4U;
- LLColor4 color_with_alpha;
-
- switch(controlp->type())
- {
- case TYPE_U32:
- controlp->set(floaterp->childGetValue("val_spinner_1"));
- break;
- case TYPE_S32:
- controlp->set(floaterp->childGetValue("val_spinner_1"));
- break;
- case TYPE_F32:
- controlp->set(LLSD(floaterp->childGetValue("val_spinner_1").asReal()));
- break;
- case TYPE_BOOLEAN:
- controlp->set(floaterp->childGetValue("boolean_combo"));
- break;
- case TYPE_STRING:
- controlp->set(LLSD(floaterp->childGetValue("val_text").asString()));
- break;
- case TYPE_VEC3:
- vector.mV[VX] = (F32)floaterp->childGetValue("val_spinner_1").asReal();
- vector.mV[VY] = (F32)floaterp->childGetValue("val_spinner_2").asReal();
- vector.mV[VZ] = (F32)floaterp->childGetValue("val_spinner_3").asReal();
- controlp->set(vector.getValue());
- break;
- case TYPE_VEC3D:
- vectord.mdV[VX] = floaterp->childGetValue("val_spinner_1").asReal();
- vectord.mdV[VY] = floaterp->childGetValue("val_spinner_2").asReal();
- vectord.mdV[VZ] = floaterp->childGetValue("val_spinner_3").asReal();
- controlp->set(vectord.getValue());
- break;
- case TYPE_RECT:
- rect.mLeft = floaterp->childGetValue("val_spinner_1").asInteger();
- rect.mRight = floaterp->childGetValue("val_spinner_2").asInteger();
- rect.mBottom = floaterp->childGetValue("val_spinner_3").asInteger();
- rect.mTop = floaterp->childGetValue("val_spinner_4").asInteger();
- controlp->set(rect.getValue());
- break;
- case TYPE_COL4:
- col3.setValue(floaterp->childGetValue("color_swatch"));
- col4 = LLColor4(col3, (F32)floaterp->childGetValue("val_spinner_4").asReal());
- controlp->set(col4.getValue());
- break;
- case TYPE_COL3:
- controlp->set(floaterp->childGetValue("color_swatch"));
- //col3.mV[VRED] = (F32)floaterp->childGetValue("val_spinner_1").asC();
- //col3.mV[VGREEN] = (F32)floaterp->childGetValue("val_spinner_2").asReal();
- //col3.mV[VBLUE] = (F32)floaterp->childGetValue("val_spinner_3").asReal();
- //controlp->set(col3.getValue());
- break;
- case TYPE_COL4U:
- col3.setValue(floaterp->childGetValue("color_swatch"));
- col4U.setVecScaleClamp(col3);
- col4U.mV[VALPHA] = floaterp->childGetValue("val_spinner_4").asInteger();
- controlp->set(col4U.getValue());
- break;
- default:
- break;
- }
+const F32 MAX_USER_FOG_RATIO = 10.f;
+const F32 MIN_USER_FOG_RATIO = 0.5f;
+
+static bool handleFogRatioChanged(const LLSD& newvalue)
+{
+ F32 fog_ratio = llmax(MIN_USER_FOG_RATIO, llmin((F32) newvalue.asReal(), MAX_USER_FOG_RATIO));
+ gSky.setFogRatio(fog_ratio);
+ return true;
+}
+
+static bool handleMaxPartCountChanged(const LLSD& newvalue)
+{
+ LLViewerPartSim::setMaxPartCount(newvalue.asInteger());
+ return true;
}
-// static
-void LLFloaterSettingsDebug::onClickDefault(void* user_data)
+const S32 MAX_USER_COMPOSITE_LIMIT = 100;
+const S32 MIN_USER_COMPOSITE_LIMIT = 0;
+
+static bool handleCompositeLimitChanged(const LLSD& newvalue)
{
- LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data;
- LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo");
- LLControlBase* controlp = (LLControlBase*)settings_combo->getCurrentUserdata();
+ S32 composite_limit = llmax(MIN_USER_COMPOSITE_LIMIT, llmin((S32)newvalue.asInteger(), MAX_USER_COMPOSITE_LIMIT));
+ LLVOAvatar::sMaxOtherAvatarsToComposite = composite_limit;
+ return true;
+}
- if (controlp)
+static bool handleVideoMemoryChanged(const LLSD& newvalue)
+{
+ gImageList.updateMaxResidentTexMem(newvalue.asInteger());
+ return true;
+}
+
+static bool handleBandwidthChanged(const LLSD& newvalue)
+{
+ gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal());
+ return true;
+}
+
+static bool handleChatFontSizeChanged(const LLSD& newvalue)
+{
+ if(gConsole)
{
- controlp->resetToDefault();
- floaterp->updateControl(controlp);
+ gConsole->setFontSize(newvalue.asInteger());
}
+ return true;
}
-// we've switched controls, or doing per-frame update, so update spinners, etc.
-void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp)
+static bool handleChatPersistTimeChanged(const LLSD& newvalue)
{
- LLSpinCtrl* spinner1 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_1");
- LLSpinCtrl* spinner2 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_2");
- LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3");
- LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4");
- LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("color_swatch");
+ if(gConsole)
+ {
+ gConsole->setLinePersistTime((F32) newvalue.asReal());
+ }
+ return true;
+}
- if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch)
+static bool handleConsoleMaxLinesChanged(const LLSD& newvalue)
+{
+ if(gConsole)
{
- llwarns << "Could not find all desired controls by name"
- << llendl;
- return;
+ gConsole->setMaxLines(newvalue.asInteger());
}
+ return true;
+}
- spinner1->setVisible(FALSE);
- spinner2->setVisible(FALSE);
- spinner3->setVisible(FALSE);
- spinner4->setVisible(FALSE);
- color_swatch->setVisible(FALSE);
- childSetVisible("val_text", FALSE);
- mComment->setText(LLString::null);
+static void handleAudioVolumeChanged(const LLSD& newvalue)
+{
+ audio_update_volume(true);
+}
- if (controlp)
- {
- eControlType type = controlp->type();
- mComment->setText(controlp->getComment());
- spinner1->setMaxValue(F32_MAX);
- spinner2->setMaxValue(F32_MAX);
- spinner3->setMaxValue(F32_MAX);
- spinner4->setMaxValue(F32_MAX);
- spinner1->setMinValue(-F32_MAX);
- spinner2->setMinValue(-F32_MAX);
- spinner3->setMinValue(-F32_MAX);
- spinner4->setMinValue(-F32_MAX);
- if (!spinner1->hasFocus())
- {
- spinner1->setIncrement(0.1f);
- }
- if (!spinner2->hasFocus())
- {
- spinner2->setIncrement(0.1f);
- }
- if (!spinner3->hasFocus())
- {
- spinner3->setIncrement(0.1f);
- }
- if (!spinner4->hasFocus())
- {
- spinner4->setIncrement(0.1f);
- }
+static bool handleJoystickChanged(const LLSD& newvalue)
+{
+ LLViewerJoystick::updateCamera(TRUE);
+ return true;
+}
- LLSD sd = controlp->get();
- switch(type)
+static bool handleAudioStreamMusicChanged(const LLSD& newvalue)
+{
+ if (gAudiop)
+ {
+ if ( newvalue.asBoolean() )
{
- case TYPE_U32:
- spinner1->setVisible(TRUE);
- spinner1->setLabel(LLString("value")); // Debug, don't translate
- childSetVisible("boolean_combo", FALSE);
- if (!spinner1->hasFocus())
+ if (gParcelMgr
+ && gParcelMgr->getAgentParcel()
+ && !gParcelMgr->getAgentParcel()->getMusicURL().empty())
{
- spinner1->setValue(sd);
- spinner1->setMinValue((F32)U32_MIN);
- spinner1->setMaxValue((F32)U32_MAX);
- spinner1->setIncrement(1.f);
- spinner1->setPrecision(0);
- }
- break;
- case TYPE_S32:
- spinner1->setVisible(TRUE);
- spinner1->setLabel(LLString("value")); // Debug, don't translate
- childSetVisible("boolean_combo", FALSE);
- if (!spinner1->hasFocus())
- {
- spinner1->setValue(sd);
- spinner1->setMinValue((F32)S32_MIN);
- spinner1->setMaxValue((F32)S32_MAX);
- spinner1->setIncrement(1.f);
- spinner1->setPrecision(0);
- }
- break;
- case TYPE_F32:
- spinner1->setVisible(TRUE);
- spinner1->setLabel(LLString("value")); // Debug, don't translate
- childSetVisible("boolean_combo", FALSE);
- if (!spinner1->hasFocus())
- {
- spinner1->setPrecision(3);
- spinner1->setValue(sd);
- }
- break;
- case TYPE_BOOLEAN:
- childSetVisible("boolean_combo", TRUE);
-
- if (!childHasFocus("boolean_combo"))
- {
- if (sd.asBoolean())
+ // if stream is already playing, don't call this
+ // otherwise music will briefly stop
+ if ( ! gAudiop->isInternetStreamPlaying() )
{
- childSetValue("boolean_combo", LLSD("true"));
+ gAudiop->startInternetStream(gParcelMgr->getAgentParcel()->getMusicURL().c_str());
}
- else
- {
- childSetValue("boolean_combo", LLSD(""));
- }
- }
- break;
- case TYPE_STRING:
- childSetVisible("val_text", TRUE);
- childSetVisible("boolean_combo", FALSE);
- if (!childHasFocus("val_text"))
- {
- childSetValue("val_text", sd);
- }
- break;
- case TYPE_VEC3:
- {
- childSetVisible("boolean_combo", FALSE);
- LLVector3 v;
- v.setValue(sd);
- spinner1->setVisible(TRUE);
- spinner1->setLabel(LLString("X"));
- spinner2->setVisible(TRUE);
- spinner2->setLabel(LLString("Y"));
- spinner3->setVisible(TRUE);
- spinner3->setLabel(LLString("Z"));
- if (!spinner1->hasFocus())
- {
- spinner1->setPrecision(3);
- spinner1->setValue(v[VX]);
- }
- if (!spinner2->hasFocus())
- {
- spinner2->setPrecision(3);
- spinner2->setValue(v[VY]);
- }
- if (!spinner3->hasFocus())
- {
- spinner3->setPrecision(3);
- spinner3->setValue(v[VZ]);
- }
- break;
- }
- case TYPE_VEC3D:
- {
- childSetVisible("boolean_combo", FALSE);
- LLVector3d v;
- v.setValue(sd);
- spinner1->setVisible(TRUE);
- spinner1->setLabel(LLString("X"));
- spinner2->setVisible(TRUE);
- spinner2->setLabel(LLString("Y"));
- spinner3->setVisible(TRUE);
- spinner3->setLabel(LLString("Z"));
- if (!spinner1->hasFocus())
- {
- spinner1->setPrecision(3);
- spinner1->setValue(v[VX]);
- }
- if (!spinner2->hasFocus())
- {
- spinner2->setPrecision(3);
- spinner2->setValue(v[VY]);
- }
- if (!spinner3->hasFocus())
- {
- spinner3->setPrecision(3);
- spinner3->setValue(v[VZ]);
- }
- break;
- }
- case TYPE_RECT:
- {
- childSetVisible("boolean_combo", FALSE);
- LLRect r;
- r.setValue(sd);
- spinner1->setVisible(TRUE);
- spinner1->setLabel(LLString("Left"));
- spinner2->setVisible(TRUE);
- spinner2->setLabel(LLString("Right"));
- spinner3->setVisible(TRUE);
- spinner3->setLabel(LLString("Bottom"));
- spinner4->setVisible(TRUE);
- spinner4->setLabel(LLString("Top"));
- if (!spinner1->hasFocus())
- {
- spinner1->setPrecision(0);
- spinner1->setValue(r.mLeft);
- }
- if (!spinner2->hasFocus())
- {
- spinner2->setPrecision(0);
- spinner2->setValue(r.mRight);
- }
- if (!spinner3->hasFocus())
- {
- spinner3->setPrecision(0);
- spinner3->setValue(r.mBottom);
- }
- if (!spinner4->hasFocus())
- {
- spinner4->setPrecision(0);
- spinner4->setValue(r.mTop);
}
+ }
+ else
+ {
+ gAudiop->stopInternetStream();
+ }
+ }
+ return true;
+}
- spinner1->setMinValue((F32)S32_MIN);
- spinner1->setMaxValue((F32)S32_MAX);
- spinner1->setIncrement(1.f);
-
- spinner2->setMinValue((F32)S32_MIN);
- spinner2->setMaxValue((F32)S32_MAX);
- spinner2->setIncrement(1.f);
-
- spinner3->setMinValue((F32)S32_MIN);
- spinner3->setMaxValue((F32)S32_MAX);
- spinner3->setIncrement(1.f);
-
- spinner4->setMinValue((F32)S32_MIN);
- spinner4->setMaxValue((F32)S32_MAX);
- spinner4->setIncrement(1.f);
- break;
- }
- case TYPE_COL4:
- {
- childSetVisible("boolean_combo", FALSE);
- LLColor4 clr;
- clr.setValue(sd);
- color_swatch->setVisible(TRUE);
- // only set if changed so color picker doesn't update
- if(clr != LLColor4(color_swatch->getValue()))
- {
- color_swatch->set(LLColor4(sd), TRUE, FALSE);
- }
- spinner4->setVisible(TRUE);
- spinner4->setLabel(LLString("Alpha"));
- if (!spinner4->hasFocus())
- {
- spinner4->setPrecision(3);
- spinner4->setMinValue(0.0);
- spinner4->setMaxValue(1.f);
- spinner4->setValue(clr.mV[VALPHA]);
- }
- break;
- }
- case TYPE_COL3:
- {
- childSetVisible("boolean_combo", FALSE);
- LLColor3 clr;
- clr.setValue(sd);
- color_swatch->setVisible(TRUE);
- color_swatch->setValue(sd);
- break;
- }
- case TYPE_COL4U:
- {
- childSetVisible("boolean_combo", FALSE);
- LLColor4U clr;
- clr.setValue(sd);
- color_swatch->setVisible(TRUE);
- if(LLColor4(clr) != LLColor4(color_swatch->getValue()))
- {
- color_swatch->set(LLColor4(clr), TRUE, FALSE);
- }
- spinner4->setVisible(TRUE);
- spinner4->setLabel(LLString("Alpha"));
- if(!spinner4->hasFocus())
- {
- spinner4->setPrecision(0);
- spinner4->setValue(clr.mV[VALPHA]);
- }
+static bool handleUseOcclusionChanged(const LLSD& newvalue)
+{
+ LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery
+ && gFeatureManagerp->isFeatureAvailable("UseOcclusion") && !gUseWireframe) ? 2 : 0;
+ return true;
+}
- spinner4->setMinValue(0);
- spinner4->setMaxValue(255);
- spinner4->setIncrement(1.f);
+static bool handleNumpadControlChanged(const LLSD& newvalue)
+{
+ if (gKeyboard)
+ {
+ gKeyboard->setNumpadDistinct(static_cast<LLKeyboard::e_numpad_distinct>(newvalue.asInteger()));
+ }
+ return true;
+}
- break;
- }
- default:
- mComment->setText(LLString("unknown"));
- break;
- }
+static bool handleRenderUseVBOChanged(const LLSD& newvalue)
+{
+ if (gPipeline.isInit())
+ {
+ gPipeline.setUseVBO(newvalue.asBoolean());
+ }
+ return true;
+}
+
+static bool handleWLSkyDetailChanged(const LLSD&)
+{
+ if (gSky.mVOWLSkyp.notNull())
+ {
+ gSky.mVOWLSkyp->updateGeometry(gSky.mVOWLSkyp->mDrawable);
}
+ return true;
+}
+static bool handleRenderLightingDetailChanged(const LLSD& newvalue)
+{
+ if (gPipeline.isInit())
+ {
+ gPipeline.setLightingDetail(newvalue.asInteger());
+ }
+ return true;
}
+
+static bool handleResetVertexBuffersChanged(const LLSD&)
+{
+ if (gPipeline.isInit())
+ {
+ gPipeline.resetVertexBuffers();
+ }
+ return true;
+}
+
+static bool handleRenderDynamicLODChanged(const LLSD& newvalue)
+{
+ LLPipeline::sDynamicLOD = newvalue.asBoolean();
+ return true;
+}
+
+static bool handleRenderUseFBOChanged(const LLSD& newvalue)
+{
+ LLRenderTarget::sUseFBO = newvalue.asBoolean();
+ if (gPipeline.isInit())
+ {
+ gPipeline.releaseGLBuffers();
+ gPipeline.createGLBuffers();
+ }
+ return true;
+}
+
+static bool handleRenderUseImpostorsChanged(const LLSD& newvalue)
+{
+ LLVOAvatar::sUseImpostors = newvalue.asBoolean();
+ return true;
+}
+
+static bool handleRenderUseCleverUIChanged(const LLSD& newvalue)
+{
+ gGL.setClever(newvalue.asBoolean());
+ return true;
+}
+
+static bool handleRenderResolutionDivisorChanged(const LLSD&)
+{
+ gResizeScreenTexture = TRUE;
+ return true;
+}
+
+static bool handleDebugViewsChanged(const LLSD& newvalue)
+{
+ LLView::sDebugRects = newvalue.asBoolean();
+ return true;
+}
+
+static bool handleLogFileChanged(const LLSD& newvalue)
+{
+ std::string log_filename = newvalue.asString();
+ LLFile::remove(log_filename.c_str());
+ LLError::logToFile(log_filename);
+ return true;
+}
+
+bool handleHideGroupTitleChanged(const LLSD& newvalue)
+{
+ gAgent.setHideGroupTitle(newvalue);
+ return true;
+}
+
+bool handleEffectColorChanged(const LLSD& newvalue)
+{
+ gAgent.setEffectColor(LLColor4(newvalue));
+ return true;
+}
+
+bool handleRotateNetMapChanged(const LLSD& newvalue)
+{
+ LLNetMap::setRotateMap(newvalue.asBoolean());
+ return true;
+}
+
+bool handleVectorizeChanged(const LLSD& newvalue)
+{
+ LLViewerJointMesh::updateVectorize();
+ return true;
+}
+
+bool handleVoiceClientPrefsChanged(const LLSD& newvalue)
+{
+ if(gVoiceClient)
+ {
+ // Note: Ignore the specific event value, look up the ones we want
+
+ gVoiceClient->setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat"));
+ gVoiceClient->setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
+ std::string keyString = gSavedSettings.getString("PushToTalkButton");
+ gVoiceClient->setPTTKey(keyString);
+ gVoiceClient->setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
+ gVoiceClient->setEarLocation(gSavedSettings.getS32("VoiceEarLocation"));
+ std::string serverName = gSavedSettings.getString("VivoxDebugServerName");
+ gVoiceClient->setVivoxDebugServerName(serverName);
+
+ std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
+ gVoiceClient->setCaptureDevice(inputDevice);
+ std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
+ gVoiceClient->setRenderDevice(outputDevice);
+ }
+ return true;
+}
+
+////////////////////////////////////////////////////////////////////////////
+
+void settings_setup_listeners()
+{
+ gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _1));
+ gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _1));
+ gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _1));
+ gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("RenderDynamicReflections")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1));
+ gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("EnableRippleWater")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("RenderGlowResolutionPow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1));
+ gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
+ gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _1));
+ gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _1));
+ gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _1));
+ gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _1));
+ gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _1));
+ gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _1));
+ gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _1));
+ gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _1));
+ gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _1));
+ gSavedSettings.getControl("RenderDynamicLOD")->getSignal()->connect(boost::bind(&handleRenderDynamicLODChanged, _1));
+ gSavedSettings.getControl("RenderDebugTextureBind")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1));
+ gSavedSettings.getControl("RenderFastAlpha")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1));
+ gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1));
+ gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1));
+ gSavedSettings.getControl("RenderUseFBO")->getSignal()->connect(boost::bind(&handleRenderUseFBOChanged, _1));
+ gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _1));
+ gSavedSettings.getControl("RenderUseCleverUI")->getSignal()->connect(boost::bind(&handleRenderUseCleverUIChanged, _1));
+ gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _1));
+ gSavedSettings.getControl("AvatarCompositeLimit")->getSignal()->connect(boost::bind(&handleCompositeLimitChanged, _1));
+ gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _1));
+ gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _1));
+ gSavedSettings.getControl("ChatPersistTime")->getSignal()->connect(boost::bind(&handleChatPersistTimeChanged, _1));
+ gSavedSettings.getControl("ConsoleMaxLines")->getSignal()->connect(boost::bind(&handleConsoleMaxLinesChanged, _1));
+ gSavedSettings.getControl("UseOcclusion")->getSignal()->connect(boost::bind(&handleUseOcclusionChanged, _1));
+ gSavedSettings.getControl("AudioLevelMaster")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelSFX")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelDistance")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelDoppler")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _1));
+ gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("MuteVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("MuteAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("MuteUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1));
+ gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleRenderUseVBOChanged, _1));
+ gSavedSettings.getControl("WLSkyDetail")->getSignal()->connect(boost::bind(&handleWLSkyDetailChanged, _1));
+ gSavedSettings.getControl("RenderLightingDetail")->getSignal()->connect(boost::bind(&handleRenderLightingDetailChanged, _1));
+ gSavedSettings.getControl("NumpadControl")->getSignal()->connect(boost::bind(&handleNumpadControlChanged, _1));
+ gSavedSettings.getControl("FlycamAxis0")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1));
+ gSavedSettings.getControl("FlycamAxis1")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1));
+ gSavedSettings.getControl("FlycamAxis2")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1));
+ gSavedSettings.getControl("FlycamAxis3")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1));
+ gSavedSettings.getControl("FlycamAxis4")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1));
+ gSavedSettings.getControl("FlycamAxis5")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1));
+ gSavedSettings.getControl("FlycamAxis6")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1));
+ gSavedSettings.getControl("DebugViews")->getSignal()->connect(boost::bind(&handleDebugViewsChanged, _1));
+ gSavedSettings.getControl("UserLogFile")->getSignal()->connect(boost::bind(&handleLogFileChanged, _1));
+ gSavedSettings.getControl("RenderHideGroupTitle")->getSignal()->connect(boost::bind(handleHideGroupTitleChanged, _1));
+ gSavedSettings.getControl("EffectColor")->getSignal()->connect(boost::bind(handleEffectColorChanged, _1));
+ gSavedSettings.getControl("MiniMapRotate")->getSignal()->connect(boost::bind(handleRotateNetMapChanged, _1));
+ gSavedSettings.getControl("VectorizePerfTest")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1));
+ gSavedSettings.getControl("VectorizeEnable")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1));
+ gSavedSettings.getControl("VectorizeProcessor")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1));
+ gSavedSettings.getControl("VectorizeSkin")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1));
+ gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+ gSavedSettings.getControl("PTTCurrentlyEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+ gSavedSettings.getControl("PushToTalkButton")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+ gSavedSettings.getControl("PushToTalkToggle")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+ gSavedSettings.getControl("VoiceEarLocation")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+ gSavedSettings.getControl("VivoxDebugServerName")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+ gSavedSettings.getControl("VoiceInputAudioDevice")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+ gSavedSettings.getControl("VoiceOutputAudioDevice")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1));
+}
+
diff --git a/indra/newview/llviewercontrol.h b/indra/newview/llviewercontrol.h
index c2a9dc9096..2727e36b53 100644
--- a/indra/newview/llviewercontrol.h
+++ b/indra/newview/llviewercontrol.h
@@ -32,9 +32,8 @@
#ifndef LL_LLVIEWERCONTROL_H
#define LL_LLVIEWERCONTROL_H
+#include <map>
#include "llcontrol.h"
-#include "llfloater.h"
-#include "lltexteditor.h"
// Enabled this definition to compile a 'hacked' viewer that
// allows a hacked godmode to be toggled on and off.
@@ -43,33 +42,12 @@
extern BOOL gHackGodmode;
#endif
-class LLFloaterSettingsDebug : public LLFloater
-{
-public:
- LLFloaterSettingsDebug();
- virtual ~LLFloaterSettingsDebug();
-
- virtual BOOL postBuild();
- virtual void draw();
-
- void updateControl(LLControlBase* control);
-
- static void show(void*);
- static void onSettingSelect(LLUICtrl* ctrl, void* user_data);
- static void onCommitSettings(LLUICtrl* ctrl, void* user_data);
- static void onClickDefault(void* user_data);
-
-protected:
- static LLFloaterSettingsDebug* sInstance;
- LLTextEditor* mComment;
-};
-
// These functions found in llcontroldef.cpp *TODO: clean this up!
//setting variables are declared in this function
-void declare_settings();
-void fixup_settings();
void settings_setup_listeners();
+extern std::map<LLString, LLControlGroup*> gSettings;
+
// for the graphics settings
void create_graphics_group(LLControlGroup& group);
@@ -90,7 +68,4 @@ extern LLControlGroup gCrashSettings;
extern LLString gLastRunVersion;
extern LLString gCurrentVersion;
-extern LLString gSettingsFileName;
-extern LLString gPerAccountSettingsFileName;
-
#endif // LL_LLVIEWERCONTROL_H
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 2677b33af8..fe00c25c63 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -866,13 +866,53 @@ static F64 sUpdateGeometryRunAvgOn[10];
static U32 sUpdateGeometryRunCount = 0 ;
static U32 sUpdateGeometryCalls = 0 ;
static U32 sUpdateGeometryLastProcessor = 0 ;
+static BOOL sVectorizePerfTest = FALSE;
+static U32 sVectorizeProcessor = 0;
+
+//static
void (*LLViewerJointMesh::sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh);
-void LLViewerJointMesh::updateGeometry()
+//static
+void LLViewerJointMesh::updateVectorize()
{
- extern BOOL gVectorizePerfTest;
- extern U32 gVectorizeProcessor;
+ sVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest");
+ sVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor");
+ BOOL vectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable");
+ BOOL vectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin");
+ std::string vp;
+ switch(sVectorizeProcessor)
+ {
+ case 2: vp = "SSE2"; break; // *TODO: replace the magic #s
+ case 1: vp = "SSE"; break;
+ default: vp = "COMPILER DEFAULT"; break;
+ }
+ llinfos << "Vectorization : " << ( vectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ;
+ llinfos << "Vector Processor : " << vp << llendl ;
+ llinfos << "Vectorized Skinning : " << ( vectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ;
+ if(vectorizeEnable && vectorizeSkin)
+ {
+ switch(sVectorizeProcessor)
+ {
+ case 2:
+ sUpdateGeometryFunc = &updateGeometrySSE2;
+ break;
+ case 1:
+ sUpdateGeometryFunc = &updateGeometrySSE;
+ break;
+ default:
+ sUpdateGeometryFunc = &updateGeometryVectorized;
+ break;
+ }
+ }
+ else
+ {
+ sUpdateGeometryFunc = &updateGeometryOriginal;
+ }
+}
+
+void LLViewerJointMesh::updateGeometry()
+{
if (!(mValid
&& mMesh
&& mFace
@@ -883,7 +923,7 @@ void LLViewerJointMesh::updateGeometry()
return;
}
- if (!gVectorizePerfTest)
+ if (!sVectorizePerfTest)
{
// Once we've measured performance, just run the specified
// code version.
@@ -916,13 +956,13 @@ void LLViewerJointMesh::updateGeometry()
{
F64 time_since_app_start = ug_timer.getElapsedSeconds();
if(sUpdateGeometryGlobalTime == 0.0
- || sUpdateGeometryLastProcessor != gVectorizeProcessor)
+ || sUpdateGeometryLastProcessor != sVectorizeProcessor)
{
sUpdateGeometryGlobalTime = time_since_app_start;
sUpdateGeometryElapsedTime = 0;
sUpdateGeometryCalls = 0;
sUpdateGeometryRunCount = 0;
- sUpdateGeometryLastProcessor = gVectorizeProcessor;
+ sUpdateGeometryLastProcessor = sVectorizeProcessor;
sUpdateGeometryCallPointer = false;
return;
}
@@ -969,7 +1009,7 @@ void LLViewerJointMesh::updateGeometry()
F64 perf_boost = ( sUpdateGeometryElapsedTimeOff - sUpdateGeometryElapsedTimeOn ) / sUpdateGeometryElapsedTimeOn;
llinfos << "run averages (" << (F64)sUpdateGeometryRunCount
<< "/10) vectorize off " << a
- << "% : vectorize type " << gVectorizeProcessor
+ << "% : vectorize type " << sVectorizeProcessor
<< " " << b
<< "% : performance boost "
<< perf_boost * 100.0
@@ -983,7 +1023,6 @@ void LLViewerJointMesh::updateGeometry()
// We have data now on which version is faster. Switch to that
// code and save the data for next run.
- gVectorizePerfTest = FALSE;
gSavedSettings.setBOOL("VectorizePerfTest", FALSE);
if (perf_boost > 0.0)
diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h
index 8e1ee514ff..4cef1552ca 100644
--- a/indra/newview/llviewerjointmesh.h
+++ b/indra/newview/llviewerjointmesh.h
@@ -149,6 +149,9 @@ public:
/*virtual*/ BOOL isAnimatable() { return FALSE; }
+ static void updateVectorize(); // Update globals when settings variables change
+
+private:
// Avatar vertex skinning is a significant performance issue on computers
// with avatar vertex programs turned off (for example, most Macs). We
// therefore have custom versions that use SIMD instructions.
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index f86d822d90..9af072ad6f 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -44,9 +44,6 @@
#include "llmediamanager.h"
#include "lluuid.h"
-// don't want to include llappviewer.h
-extern std::string gChannelName;
-
// Implementation functions not exported into header file
class LLViewerMediaImpl
: public LLMediaObserver
@@ -457,7 +454,7 @@ void LLViewerMedia::initClass()
// append our magic version number string to the browser user agent id
std::ostringstream codec;
codec << "[Second Life ";
- codec << "(" << gChannelName << ")";
+ codec << "(" << gSavedSettings.getString("VersionChannelName") << ")";
codec << " - " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;
codec << "]";
init_data->setBrowserUserAgentId( codec.str() );
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a384d24947..a2b9cde5d1 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -120,6 +120,7 @@
#include "llfloaterregioninfo.h"
#include "llfloaterreporter.h"
#include "llfloaterscriptdebug.h"
+#include "llfloatersettingsdebug.h"
#include "llfloaterenvsettings.h"
#include "llfloaterstats.h"
#include "llfloatertest.h"
@@ -376,6 +377,11 @@ void toggle_cull_small(void *);
void toggle_show_xui_names(void *);
BOOL check_show_xui_names(void *);
+void run_vectorize_perf_test(void *)
+{
+ gSavedSettings.setBOOL("VectorizePerfTest", TRUE);
+}
+
// Debug UI
void handle_web_search_demo(void*);
void handle_slurl_test(void*);
@@ -1091,7 +1097,7 @@ void init_client_menu(LLMenuGL* menu)
&menu_check_control,
(void*)"ShowConsoleWindow"));
- if(gQAMode)
+ if(gSavedSettings.getBOOL("QAMode"))
{
LLMenuGL* sub = NULL;
sub = new LLMenuGL("Debugging");
@@ -1171,7 +1177,6 @@ extern BOOL gDebugClicks;
extern BOOL gDebugWindowProc;
extern BOOL gDebugTextEditorTips;
extern BOOL gDebugSelectMgr;
-extern BOOL gVectorizePerfTest;
void init_debug_ui_menu(LLMenuGL* menu)
{
@@ -1383,7 +1388,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)
(void*)"ShowDepthBuffer"));
sub_menu->append(new LLMenuItemToggleGL("Show Select Buffer", &gDebugSelect));
- sub_menu->append(new LLMenuItemToggleGL("Vectorize Perf Test", &gVectorizePerfTest));
+ sub_menu->append(new LLMenuItemCallGL("Vectorize Perf Test", &run_vectorize_perf_test));
sub_menu = new LLMenuGL("Render Tests");
@@ -4848,7 +4853,7 @@ BOOL menu_check_build_tool( void* user_data )
void handle_reload_settings(void*)
{
gSavedSettings.resetToDefaults();
- gSavedSettings.loadFromFile(gSettingsFileName, TRUE);
+ gSavedSettings.loadFromFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);
llinfos << "Loading colors from colors.xml" << llendl;
std::string color_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"colors.xml");
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 6fb2957023..b0ebc64b7a 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -114,10 +114,5 @@ LLGridData gGridInfo[GRID_INFO_COUNT] =
// Use this to figure out which domain name and login URI to use.
EGridInfo gGridChoice = GRID_INFO_NONE;
-char gGridName[MAX_STRING]; /* Flawfinder: ignore */
-
-F32 gPacketDropPercentage = 0.f;
-F32 gInBandwidth = 0.f;
-F32 gOutBandwidth = 0.f;
-
+LLString gGridName; /* Flawfinder: ignore */
unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 4de73aae7a..4e6c874921 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -55,7 +55,7 @@ enum EGridInfo
GRID_INFO_VAAK,
GRID_INFO_YAMI,
GRID_INFO_LOCAL,
- GRID_INFO_OTHER, // IP address set via -user or other command line option
+ GRID_INFO_OTHER, // IP address set via command line option
GRID_INFO_COUNT
};
@@ -68,12 +68,9 @@ struct LLGridData
const char* mHelperURI;
};
-extern F32 gPacketDropPercentage;
-extern F32 gInBandwidth;
-extern F32 gOutBandwidth;
extern EGridInfo gGridChoice;
extern LLGridData gGridInfo[];
-extern char gGridName[MAX_STRING]; /* Flawfinder: ignore */
+extern LLString gGridName; /* Flawfinder: ignore */
const S32 MAC_ADDRESS_BYTES = 6;
extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 69e08db2bf..e2ea6e6ecf 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -678,31 +678,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)
///////////////////////////////////////////////////////////////////////////////////////////////
-class LLVoiceClientPrefsListener: public LLSimpleListener
-{
- bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
- {
- // Note: Ignore the specific event value, look up the ones we want
-
- gVoiceClient->setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat"));
- gVoiceClient->setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
- std::string keyString = gSavedSettings.getString("PushToTalkButton");
- gVoiceClient->setPTTKey(keyString);
- gVoiceClient->setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
- gVoiceClient->setEarLocation(gSavedSettings.getS32("VoiceEarLocation"));
- std::string serverName = gSavedSettings.getString("VivoxDebugServerName");
- gVoiceClient->setVivoxDebugServerName(serverName);
-
- std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
- gVoiceClient->setCaptureDevice(inputDevice);
- std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
- gVoiceClient->setRenderDevice(outputDevice);
-
- return true;
- }
-};
-static LLVoiceClientPrefsListener voice_prefs_listener;
-
class LLVoiceClientMuteListObserver : public LLMuteListObserver
{
/* virtual */ void onChange() { gVoiceClient->muteListChanged();}
@@ -859,16 +834,6 @@ LLVoiceClient::LLVoiceClient()
std::string renderDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
setRenderDevice(renderDevice);
- // Set up our listener to get updates on all prefs values we care about.
- gSavedSettings.getControl("EnableVoiceChat")->addListener(&voice_prefs_listener);
- gSavedSettings.getControl("PTTCurrentlyEnabled")->addListener(&voice_prefs_listener);
- gSavedSettings.getControl("PushToTalkButton")->addListener(&voice_prefs_listener);
- gSavedSettings.getControl("PushToTalkToggle")->addListener(&voice_prefs_listener);
- gSavedSettings.getControl("VoiceEarLocation")->addListener(&voice_prefs_listener);
- gSavedSettings.getControl("VivoxDebugServerName")->addListener(&voice_prefs_listener);
- gSavedSettings.getControl("VoiceInputAudioDevice")->addListener(&voice_prefs_listener);
- gSavedSettings.getControl("VoiceOutputAudioDevice")->addListener(&voice_prefs_listener);
-
mTuningMode = false;
mTuningEnergy = 0.0f;
mTuningMicVolume = 0;
@@ -1281,7 +1246,7 @@ void LLVoiceClient::stateMachine()
break;
case stateStart:
- if(gDisableVoice)
+ if(gSavedSettings.getBOOL("CmdLineDisableVoice"))
{
// Voice is locked out, we must not launch the vivox daemon.
setState(stateJail);
@@ -3644,7 +3609,7 @@ void LLVoiceClient::setVoiceEnabled(bool enabled)
bool LLVoiceClient::voiceEnabled()
{
- return gSavedSettings.getBOOL("EnableVoiceChat") && !gDisableVoice;
+ return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice");
}
void LLVoiceClient::setUsePTT(bool usePTT)
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index 9dc92efa81..fc4ede5bab 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -238,8 +238,9 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);
mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);
- mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, gVerifySSLCert);
- mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, gVerifySSLCert? 2 : 0);
+ BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
+ mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, vefifySSLCert);
+ mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, vefifySSLCert ? 2 : 0);
// Be a little impatient about establishing connections.
mCurlRequest->setopt(CURLOPT_CONNECTTIMEOUT, 40L);
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index b19e4e2c9c..e87fe8d8ff 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -115,15 +115,15 @@ class ViewerManifest(LLManifest):
if not self.default_grid():
if self.default_channel():
# beta grid viewer
- channel_flags = '-settings settings_beta.xml'
- grid_flags = "-helperuri http://preview-%(grid)s.secondlife.com/helpers/ -loginuri https://login.%(grid)s.lindenlab.com/cgi-bin/login.cgi" % {'grid':self.args['grid']}
+ channel_flags = '--settings settings_beta.xml'
+ grid_flags = "--helperuri http://preview-%(grid)s.secondlife.com/helpers/ --loginuri https://login.%(grid)s.lindenlab.com/cgi-bin/login.cgi" % {'grid':self.args['grid']}
if not self.default_channel():
# some channel on some grid
- channel_flags = '-settings settings_%s.xml -channel "%s"' % (self.channel_lowerword(), self.channel())
+ channel_flags = '--settings settings_%s.xml --channel "%s"' % (self.channel_lowerword(), self.channel())
elif self.login_channel():
# Report a special channel during login, but use default channel elsewhere
- channel_flags = '-channel "%s"' % (self.login_channel())
+ channel_flags = '--channel "%s"' % (self.login_channel())
return " ".join((channel_flags, grid_flags)).strip()