diff options
author | Mark Palange <palange@lindenlab.com> | 2008-03-14 23:21:38 +0000 |
---|---|---|
committer | Mark Palange <palange@lindenlab.com> | 2008-03-14 23:21:38 +0000 |
commit | 04611efae8a3291ceba8a29dd920bdae0d404830 (patch) | |
tree | 43966566a1eeb42cf546a638310348f0585fc395 /indra | |
parent | c0c5bdbbb90e0bcdab558ec22ea352c9d08dc078 (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')
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, <1.0 = diminished doppler effect, >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 "Fly" command (FALSE = fly by using "Fly" 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 'Default' 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 ("All", "Auction", "For Sale")</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'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 "Find" 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 "ShowOverlayTitle" 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'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'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]&s=[COLLECTION]&</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]&m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&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 "pain" 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 "money" 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 "Debug" 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 'busy mode' 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() |