diff options
author | Steven Bennetts <steve@lindenlab.com> | 2008-03-15 01:18:27 +0000 |
---|---|---|
committer | Steven Bennetts <steve@lindenlab.com> | 2008-03-15 01:18:27 +0000 |
commit | 672a76d0ea08a0d0fc824e103ee4c4242b7e03ec (patch) | |
tree | b623a9c884383ad75ed755b2c373db2b90643671 | |
parent | 04611efae8a3291ceba8a29dd920bdae0d404830 (diff) |
reverting premature commit at 82410.
58 files changed, 2519 insertions, 12805 deletions
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index 89b276e3b3..a0fb086029 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 = "settings_crash_behavior.xml"; +const char* const CRASH_SETTINGS_FILE = "crash_settings.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 741b40b787..8ba883a0ee 100644 --- a/indra/llcommon/llevent.h +++ b/indra/llcommon/llevent.h @@ -185,6 +185,13 @@ 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 c44650009d..2a18e5c64c 100644 --- a/indra/llcommon/llfile.cpp +++ b/indra/llcommon/llfile.cpp @@ -271,11 +271,9 @@ void llofstream::open(const char* _Filename, /* Flawfinder: ignore */ void llofstream::close() { // close the C stream - if(is_open()) - { - if (_Filebuffer->close() == 0) - _Myios::setstate(ios_base::failbit); /*Flawfinder: ignore*/ - } + llassert(_Filebuffer); + if (_Filebuffer->close() == 0) + _Myios::setstate(ios_base::failbit); /*Flawfinder: ignore*/ } llofstream::llofstream(const char *_Filename, @@ -287,8 +285,7 @@ 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 8ae6dd2ea5..2bcc89b59f 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -778,8 +778,9 @@ void LLButton::setToggleState(BOOL b) { if( b != mToggleState ) { - setControlValue(b); // will fire LLControlVariable callbacks (if any) - mToggleState = b; // may or may not be redundant + mToggleState = b; + LLValueChangedEvent *evt = new LLValueChangedEvent(this, mToggleState); + fireEvent(evt, ""); } } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 8c62a10f2b..00b4c37bb0 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -827,33 +827,57 @@ void LLMenuItemCallGL::setEnabledControl(LLString enabled_control, LLView *conte // Register new listener if (!enabled_control.empty()) { - LLControlVariable *control = context->findControl(enabled_control); - if (!control) + LLControlBase *control = context->findControl(enabled_control); + if (control) + { + LLSD state = control->registerListener(this, "ENABLED"); + setEnabled(state); + } + else { context->addBoolControl(enabled_control, getEnabled()); control = context->findControl(enabled_control); - llassert_always(control); + control->registerListener(this, "ENABLED"); } - control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("enabled"))); - setEnabled(control->getValue()); } } -void LLMenuItemCallGL::setVisibleControl(LLString visible_control, LLView *context) +void LLMenuItemCallGL::setVisibleControl(LLString enabled_control, LLView *context) { // Register new listener - if (!visible_control.empty()) + if (!enabled_control.empty()) { - LLControlVariable *control = context->findControl(visible_control); - if (!control) + LLControlBase *control = context->findControl(enabled_control); + if (control) { - context->addBoolControl(visible_control, getVisible()); - control = context->findControl(visible_control); - llassert_always(control); + LLSD state = control->registerListener(this, "VISIBLE"); + setVisible(state); } - control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("visible"))); - setVisible(control->getValue()); + 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; } + if (userdata.asString() == "VISIBLE" && event->desc() == "value_changed") + { + LLSD state = event->getValue(); + setVisible(state); + return TRUE; + } + return LLMenuItemGL::handleEvent(event, userdata); } // virtual @@ -976,35 +1000,44 @@ LLMenuItemCheckGL::LLMenuItemCheckGL ( const LLString& name, setControlName(control_name, context); } -//virtual -void LLMenuItemCheckGL::setValue(const LLSD& value) -{ - mChecked = value.asBoolean(); - if(mChecked) - { - mDrawBoolLabel = BOOLEAN_TRUE_PREFIX; - } - else - { - mDrawBoolLabel.clear(); - } -} - void LLMenuItemCheckGL::setCheckedControl(LLString checked_control, LLView *context) { // Register new listener if (!checked_control.empty()) { - LLControlVariable *control = context->findControl(checked_control); - if (!control) + 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); - llassert_always(control); + control->registerListener(this, "CHECKED"); + } + } +} + +// virtual +bool LLMenuItemCheckGL::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) +{ + if (userdata.asString() == "CHECKED" && event->desc() == "value_changed") + { + LLSD state = event->getValue(); + mChecked = state; + if(mChecked) + { + mDrawBoolLabel = BOOLEAN_TRUE_PREFIX; } - control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("value"))); - mChecked = control->getValue(); + else + { + mDrawBoolLabel.clear(); + } + return TRUE; } + return LLMenuItemCallGL::handleEvent(event, userdata); } // virtual @@ -1913,7 +1946,7 @@ void LLMenuGL::parseChildXML(LLXMLNodePtr child, LLView *parent, LLUICtrlFactory { continue; } - LLControlVariable *control = parent->findControl(control_name); + LLControlBase *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 33b226fd99..e9b80e562b 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, public LLObservable +class LLMenuItemCallGL : public LLMenuItemGL { public: // normal constructor @@ -291,6 +291,7 @@ public: //virtual void draw(); + virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata); private: menu_callback mCallback; @@ -340,7 +341,7 @@ public: void setCheckedControl(LLString checked_control, LLView *context); - virtual void setValue(const LLSD& value); + virtual void setValue(const LLSD& value) { mChecked = value.asBoolean(); } virtual EWidgetType getWidgetType() const { return WIDGET_TYPE_MENU_ITEM_CHECK; } virtual LLString getWidgetTag() const { return LL_MENU_ITEM_CHECK_GL_TAG; } @@ -349,6 +350,8 @@ 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 1e9442805f..aed7893df7 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1555,11 +1555,16 @@ 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); } -bool handleShowXUINamesChanged(const LLSD& newvalue) +class LLShowXUINamesListener: public LLSimpleListener { - LLUI::sShowXUINames = newvalue.asBoolean(); - return true; -} + bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) + { + LLUI::sShowXUINames = (BOOL) event->getValue().asBoolean(); + return true; + } +}; +static LLShowXUINamesListener show_xui_names_listener; + void LLUI::initClass(LLControlGroup* config, LLControlGroup* colors, @@ -1579,7 +1584,7 @@ void LLUI::initClass(LLControlGroup* config, LLFontGL::sShadowColor = colors->getColor("ColorDropShadow"); LLUI::sShowXUINames = LLUI::sConfigGroup->getBOOL("ShowXUINames"); - LLUI::sConfigGroup->getControl("ShowXUINames")->getSignal()->connect(boost::bind(&handleShowXUINamesChanged, _1)); + LLUI::sConfigGroup->getControl("ShowXUINames")->addListener(&show_xui_names_listener); } void LLUI::cleanupClass() diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 269796e5de..0a37c03ac5 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -2426,7 +2426,16 @@ LLSimpleListener* LLView::getListenerByName(const LLString& callback_name) return callback; } -LLControlVariable *LLView::findControl(LLString name) +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) { control_map_t::iterator itor = mFloaterControls.find(name); if (itor != mFloaterControls.end()) @@ -2782,15 +2791,9 @@ LLFontGL::StyleFlags LLView::selectFontStyle(LLXMLNodePtr node) return gl_font_style; } -bool LLView::setControlValue(const LLSD& value) +void LLView::setControlValue(const LLSD& value) { - LLString ctrlname = getControlName(); - if (!ctrlname.empty()) - { - LLUI::sConfigGroup->setValue(ctrlname, value); - return true; - } - return false; + LLUI::sConfigGroup->setValue(getControlName(), value); } //virtual @@ -2801,57 +2804,43 @@ void LLView::setControlName(const LLString& control_name, LLView *context) context = this; } + // Unregister from existing listeners if (!mControlName.empty()) { - llwarns << "setControlName called twice on same control!" << llendl; - mControlConnection.disconnect(); // disconnect current signal - mControlName.clear(); + clearDispatchers(); } - + // Register new listener if (!control_name.empty()) { - LLControlVariable *control = context->findControl(control_name); + LLControlBase *control = context->findControl(control_name); if (control) { mControlName = control_name; - mControlConnection = control->getSignal()->connect(boost::bind(&controlListener, _1, getHandle(), std::string("value"))); - setValue(control->getValue()); + LLSD state = control->registerListener(this, "DEFAULT"); + setValue(state); } } } -// static -bool LLView::controlListener(const LLSD& newvalue, LLHandle<LLView> handle, std::string type) +// virtual +bool LLView::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - LLView* view = handle.get(); - if (view) + if (userdata.asString() == "DEFAULT" && event->desc() == "value_changed") { - 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; - } + LLSD state = event->getValue(); + setValue(state); + return TRUE; } - return false; + return FALSE; } void LLView::addBoolControl(LLString name, bool initial_value) { - mFloaterControls[name] = new LLControlVariable(name, TYPE_BOOLEAN, initial_value, "Internal floater control"); + mFloaterControls[name] = new LLControl(name, TYPE_BOOLEAN, initial_value, "Internal floater control"); } -LLControlVariable *LLView::getControl(LLString name) +LLControlBase *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 24a5eb4f89..c8556c7edc 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -65,6 +65,7 @@ const BOOL NOT_MOUSE_OPAQUE = FALSE; const U32 GL_NAME_UI_RESERVED = 2; + /* // virtual functions defined in LLView: @@ -149,7 +150,7 @@ virtual BOOL handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent); * */ -class LLView : public LLMouseHandler, public LLMortician +class LLView : public LLMouseHandler, public LLMortician, public LLSimpleListenerObservable { public: @@ -293,6 +294,7 @@ 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; } @@ -391,13 +393,13 @@ public: void addListenerToControl(LLEventDispatcher *observer, const LLString& name, LLSD filter, LLSD userdata); void addBoolControl(LLString name, bool initial_value); - LLControlVariable *getControl(LLString name); - LLControlVariable *findControl(LLString name); + LLControlBase *getControl(LLString name); + LLControlBase *findControl(LLString name); - bool setControlValue(const LLSD& value); + void 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; @@ -492,12 +494,11 @@ protected: LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask); LLView* childrenHandleRightMouseUp(S32 x, S32 y, MASK mask); - static bool controlListener(const LLSD& newvalue, LLHandle<LLView> handle, std::string type); - - typedef std::map<LLString, LLControlVariable*> control_map_t; + typedef std::map<LLString, LLControlBase*> control_map_t; control_map_t mFloaterControls; virtual LLView* getChildByName(const LLString& name, BOOL recurse = FALSE) const; + private: LLView* mParentView; child_list_t mChildList; @@ -536,8 +537,9 @@ private: dispatch_list_t mDispatchList; LLString mControlName; - boost::signals::connection mControlConnection; - + + +// Just debugging stuff? We should try to hide anything that's not. -MG 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 bd4dfc2d78..b25ec4a86e 100644 --- a/indra/llvfs/llvfile.cpp +++ b/indra/llvfs/llvfile.cpp @@ -45,6 +45,7 @@ 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 cd4fc59174..3d81483308 100644 --- a/indra/llvfs/llvfile.h +++ b/indra/llvfs/llvfile.h @@ -78,6 +78,8 @@ 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 9de426fc03..4ad44f455f 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -57,9 +57,19 @@ #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 LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b) +BOOL LLControl::llsd_compare(const LLSD& a, const LLSD & b) { switch (mType) { @@ -91,154 +101,58 @@ BOOL LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b) return FALSE; } -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); - } -} - -void LLControlVariable::resetToDefault(bool fire_signal) +LLControlBase::~LLControlBase() { - //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])); } -LLSD LLControlVariable::getSaveValue() const +// virtual +void LLControlBase::resetToDefault() { - //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]; } -LLControlVariable* LLControlGroup::getControl(const LLString& name) +LLControlGroup::LLControlGroup(): mNameTable() { - ctrl_name_table_t::iterator iter = mNameTable.find(name); - return iter == mNameTable.end() ? NULL : iter->second; + //mFreeStringOffset = 0; } - -//////////////////////////////////////////////////////////////////////////// - -LLControlGroup::LLControlGroup() +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"; } -LLControlGroup::~LLControlGroup() +LLSD LLControlBase::registerListener(LLSimpleListenerObservable *listener, LLSD userdata) { - cleanup(); + // Symmetric listener relationship + addListener(listener, "", userdata); + listener->addListener(this, "", userdata); + return getValue(); } void LLControlGroup::cleanup() { - for_each(mNameTable.begin(), mNameTable.end(), DeletePairedPointer()); mNameTable.clear(); } -eControlType LLControlGroup::typeStringToEnum(const LLString& typestr) -{ - for(int i = 0; i < (int)TYPE_COUNT; ++i) - { - if(mTypeString[i] == typestr) return (eControlType)i; - } - return (eControlType)-1; -} - -LLString LLControlGroup::typeEnumToString(eControlType typeenum) +LLControlBase* LLControlGroup::getControl(const LLString& name) { - return mTypeString[typeenum]; + ctrl_name_table_t::iterator iter = mNameTable.find(name); + return iter == mNameTable.end() ? NULL : (LLControlBase*)iter->second; } BOOL LLControlGroup::declareControl(const LLString& name, eControlType type, const LLSD initial_val, const LLString& comment, BOOL persist) { - if(mNameTable.find(name) != mNameTable.end()) + if(!mNameTable[name]) { - llwarns << "LLControlGroup::declareControl: Control named " << name << " already exists." << llendl; - mNameTable[name]->setValue(initial_val); + // 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; } - // 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; + else + { + llwarns << "LLControlGroup::declareControl: Control named " << name << " already exists." << llendl; + mNameTable.erase(name); + return FALSE; + } } BOOL LLControlGroup::declareU32(const LLString& name, const U32 initial_val, const LLString& comment, BOOL persist) @@ -296,14 +210,19 @@ BOOL LLControlGroup::declareColor3(const LLString& name, const LLColor3 &initial return declareControl(name, TYPE_COL3, initial_val.getValue(), comment, persist); } -BOOL LLControlGroup::declareLLSD(const LLString& name, const LLSD &initial_val, const LLString& comment, BOOL persist ) +LLSD LLControlGroup::registerListener(const LLString& name, LLSimpleListenerObservable *listener) { - return declareControl(name, TYPE_LLSD, initial_val, comment, persist); + LLControlBase *control = getControl(name); + if (control) + { + return control->registerListener(listener); + } + return LLSD(); } BOOL LLControlGroup::getBOOL(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_BOOLEAN)) return control->get().asBoolean(); @@ -316,7 +235,7 @@ BOOL LLControlGroup::getBOOL(const LLString& name) S32 LLControlGroup::getS32(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_S32)) return control->get().asInteger(); @@ -329,7 +248,7 @@ S32 LLControlGroup::getS32(const LLString& name) U32 LLControlGroup::getU32(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_U32)) return control->get().asInteger(); @@ -342,7 +261,7 @@ U32 LLControlGroup::getU32(const LLString& name) F32 LLControlGroup::getF32(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_F32)) return (F32) control->get().asReal(); @@ -355,7 +274,7 @@ F32 LLControlGroup::getF32(const LLString& name) LLString LLControlGroup::findString(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_STRING)) return control->get().asString(); @@ -364,7 +283,7 @@ LLString LLControlGroup::findString(const LLString& name) LLString LLControlGroup::getString(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_STRING)) return control->get().asString(); @@ -390,7 +309,7 @@ LLString LLControlGroup::getText(const LLString& name) LLVector3 LLControlGroup::getVector3(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_VEC3)) return control->get(); @@ -403,7 +322,7 @@ LLVector3 LLControlGroup::getVector3(const LLString& name) LLVector3d LLControlGroup::getVector3d(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_VEC3D)) return control->get(); @@ -416,7 +335,7 @@ LLVector3d LLControlGroup::getVector3d(const LLString& name) LLRect LLControlGroup::getRect(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_RECT)) return control->get(); @@ -434,7 +353,7 @@ LLColor4 LLControlGroup::getColor(const LLString& name) if (i != mNameTable.end()) { - LLControlVariable* control = i->second; + LLControlBase* control = i->second; switch(control->mType) { @@ -462,7 +381,7 @@ LLColor4 LLControlGroup::getColor(const LLString& name) LLColor4U LLControlGroup::getColor4U(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_COL4U)) return control->get(); @@ -475,7 +394,7 @@ LLColor4U LLControlGroup::getColor4U(const LLString& name) LLColor4 LLControlGroup::getColor4(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_COL4)) return control->get(); @@ -488,7 +407,7 @@ LLColor4 LLControlGroup::getColor4(const LLString& name) LLColor3 LLControlGroup::getColor3(const LLString& name) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_COL3)) return control->get(); @@ -499,16 +418,6 @@ 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); @@ -521,7 +430,7 @@ BOOL LLControlGroup::controlExists(const LLString& name) void LLControlGroup::setBOOL(const LLString& name, BOOL val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_BOOLEAN)) { @@ -536,7 +445,7 @@ void LLControlGroup::setBOOL(const LLString& name, BOOL val) void LLControlGroup::setS32(const LLString& name, S32 val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_S32)) { @@ -551,7 +460,7 @@ void LLControlGroup::setS32(const LLString& name, S32 val) void LLControlGroup::setF32(const LLString& name, F32 val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_F32)) { @@ -566,7 +475,7 @@ void LLControlGroup::setF32(const LLString& name, F32 val) void LLControlGroup::setU32(const LLString& name, U32 val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_U32)) { @@ -581,7 +490,7 @@ void LLControlGroup::setU32(const LLString& name, U32 val) void LLControlGroup::setString(const LLString& name, const LLString &val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_STRING)) { @@ -596,7 +505,7 @@ void LLControlGroup::setString(const LLString& name, const LLString &val) void LLControlGroup::setVector3(const LLString& name, const LLVector3 &val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_VEC3)) { @@ -610,7 +519,7 @@ void LLControlGroup::setVector3(const LLString& name, const LLVector3 &val) void LLControlGroup::setVector3d(const LLString& name, const LLVector3d &val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_VEC3D)) { @@ -624,7 +533,7 @@ void LLControlGroup::setVector3d(const LLString& name, const LLVector3d &val) void LLControlGroup::setRect(const LLString& name, const LLRect &val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_RECT)) { @@ -638,7 +547,7 @@ void LLControlGroup::setRect(const LLString& name, const LLRect &val) void LLControlGroup::setColor4U(const LLString& name, const LLColor4U &val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_COL4U)) { @@ -652,7 +561,7 @@ void LLControlGroup::setColor4U(const LLString& name, const LLColor4U &val) void LLControlGroup::setColor4(const LLString& name, const LLColor4 &val) { - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control && control->isType(TYPE_COL4)) { @@ -664,20 +573,6 @@ 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()) @@ -685,7 +580,7 @@ void LLControlGroup::setValue(const LLString& name, const LLSD& val) return; } - LLControlVariable* control = getControl(name); + LLControlBase* control = getControl(name); if (control) { @@ -701,9 +596,239 @@ void LLControlGroup::setValue(const LLString& name, const LLSD& val) // Load and save //--------------------------------------------------------------- -// Returns number of controls loaded, so 0 if failure 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) +{ LLString name; LLXmlTree xml_controls; @@ -776,9 +901,11 @@ U32 LLControlGroup::loadFromFileLegacy(const LLString& filename, BOOL require_de } // Control name has been declared in code. - LLControlVariable *control = getControl(name); + LLControlBase *control = getControl(name); llassert(control); + + mLoadedSettings.insert(name); switch(control->mType) { @@ -892,43 +1019,59 @@ U32 LLControlGroup::loadFromFileLegacy(const LLString& filename, BOOL require_de 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) { - LLSD settings; - int num_saved = 0; + 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; + for (ctrl_name_table_t::iterator iter = mNameTable.begin(); iter != mNameTable.end(); iter++) { - LLControlVariable* control = iter->second; + LLString name = iter->first; + if (name.empty()) + { + CONTROL_ERRS << "Control with no name found!!!" << llendl; + break; + } + + LLControlBase* control = (LLControlBase *)iter->second; if (!control) { - llwarns << "Tried to save invalid control: " << iter->first << llendl; + llwarns << "Tried to save invalid control: " << name << llendl; } - if( control && control->isPersisted() ) + if( control && control->mPersist ) { - if (!(nondefault_only && (control->isSaveValueDefault()))) + if (!(nondefault_only && (control->mIsDefault))) { - settings[iter->first]["Type"] = typeEnumToString(control->type()); - settings[iter->first]["Comment"] = control->getComment(); - settings[iter->first]["Value"] = control->getSaveValue(); - ++num_saved; + controls.insert( control ); } else { @@ -937,58 +1080,156 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only) } } } + llofstream file; - file.open(filename.c_str()); - if (file.is_open()) - { - LLSDSerialize::toPrettyXML(settings, file); - file.close(); - llinfos << "Saved to " << filename << llendl; - } - else - { - // 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; -} + file.open(filename.c_str()); /*Flawfinder: ignore*/ -U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declaration, eControlType declare_as) -{ - LLString name; - LLSD settings; - LLSD control_map; - llifstream infile; - infile.open(filename.c_str()); - if(!infile.is_open()) + if (!file.is_open()) { - llwarns << "Cannot find file " << filename << " to load." << llendl; + // 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; } - S32 ret = LLSDSerialize::fromXML(settings, infile); - if (ret <= 0) + + // 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) { - infile.close(); - llwarns << "Unable to open LLSD control file " << filename << ". Trying Legacy Method." << llendl; - return loadFromFileLegacy(filename, require_declaration, declare_as); - } + 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; + } + } - U32 validitems = 0; - int persist = 1; - for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr) + // Debug spam + // llinfos << name << " " << control->getValue().asString() << llendl; + }// next + + file << "</settings>\n"; + file.close(); + + return controls.size(); +} + +void LLControlGroup::applyOverrides(const std::map<std::string, std::string>& overrides) +{ + for (std::map<std::string, std::string>::const_iterator iter = overrides.begin(); + iter != overrides.end(); ++iter) { - 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; + 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; + } } - - return validitems; } void LLControlGroup::resetToDefaults() @@ -998,20 +1239,11 @@ void LLControlGroup::resetToDefaults() control_iter != mNameTable.end(); ++control_iter) { - LLControlVariable* control = (*control_iter).second; + LLControlBase* 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 @@ -1032,7 +1264,7 @@ static LLString get_warn_name(const LLString& name) void LLControlGroup::addWarning(const LLString& name) { LLString warnname = get_warn_name(name); - if(mNameTable.find(warnname) == mNameTable.end()) + if(!mNameTable[warnname]) { LLString comment = LLString("Enables ") + name + LLString(" warning dialog"); declareBOOL(warnname, TRUE, comment); @@ -1061,6 +1293,91 @@ 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 @@ -1076,17 +1393,17 @@ void main() llinfos << "Loaded " << count << " controls" << llendl; // test insertion - foo = new LLControlVariable<F32>("gFoo", 5.f, 1.f, 20.f); + foo = new LLControl<F32>("gFoo", 5.f, 1.f, 20.f); gGlobals.addEntry("gFoo", foo); - bar = new LLControlVariable<S32>("gBar", 10, 2, 22); + bar = new LLControl<S32>("gBar", 10, 2, 22); gGlobals.addEntry("gBar", bar); - baz = new LLControlVariable<BOOL>("gBaz", FALSE); + baz = new LLControl<BOOL>("gBaz", FALSE); gGlobals.addEntry("gBaz", baz); // test retrieval - getfoo = (LLControlVariable<F32>*) gGlobals.resolveName("gFoo"); + getfoo = (LLControl<F32>*) gGlobals.resolveName("gFoo"); getfoo->dump(); getbar = (S32_CONTROL) gGlobals.resolveName("gBar"); @@ -1099,10 +1416,10 @@ void main() // Failure modes // ...min > max - // badfoo = new LLControlVariable<F32>("gFoo2", 100.f, 20.f, 5.f); + // badfoo = new LLControl<F32>("gFoo2", 100.f, 20.f, 5.f); // ...initial > max - // badbar = new LLControlVariable<S32>("gBar2", 10, 20, 100000); + // badbar = new LLControl<S32>("gBar2", 10, 20, 100000); // ...misspelled name // getfoo = (F32_CONTROL) gGlobals.resolveName("fooMisspelled"); @@ -1124,4 +1441,3 @@ void main() } #endif - diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index 7a638a7b73..a1a2a4c851 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -38,26 +38,6 @@ #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; @@ -68,7 +48,7 @@ const BOOL NO_PERSIST = FALSE; typedef enum e_control_type { - TYPE_U32 = 0, + TYPE_U32, TYPE_S32, TYPE_F32, TYPE_BOOLEAN, @@ -78,82 +58,159 @@ typedef enum e_control_type TYPE_RECT, TYPE_COL4, TYPE_COL3, - TYPE_COL4U, - TYPE_LLSD, - TYPE_COUNT + TYPE_COL4U } eControlType; -class LLControlVariable +class LLControlBase : public LLSimpleListenerObservable { - friend class LLControlGroup; - typedef boost::signal<void(const LLSD&)> signal_t; - -private: +friend class LLControlGroup; +protected: LLString mName; LLString mComment; eControlType mType; + BOOL mHasRange; BOOL mPersist; - std::vector<LLSD> mValues; - - signal_t mSignal; - + 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. + public: - LLControlVariable(const LLString& name, eControlType type, - LLSD initial, const LLString& comment, - BOOL persist = TRUE); + 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(); - 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; } - - 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() + 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() { - mSignal(mValues.back()); + //Remove and deregister all listeners.. + while(mListenerIDs.size()) + { + S32 id = mListenerIDs.front(); + mListenerIDs.pop_front(); + releaseListenerID(id); + } } - BOOL llsd_compare(const LLSD& a, const LLSD& b); }; //const U32 STRING_CACHE_SIZE = 10000; class LLControlGroup { -protected: - typedef std::map<LLString, LLControlVariable* > ctrl_name_table_t; +public: + typedef std::map<LLString, LLPointer<LLControlBase> > ctrl_name_table_t; ctrl_name_table_t mNameTable; std::set<LLString> mWarnings; - LLString mTypeString[TYPE_COUNT]; + std::set<LLString> mLoadedSettings; // Filled in with names loaded from settings.xml - 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 - LLControlVariable* getControl(const LLString& name); - - struct ApplyFunctor - { - virtual ~ApplyFunctor() {}; - virtual void apply(const LLString& name, LLControlVariable* control) = 0; - }; - void applyToAll(ApplyFunctor* func); + LLControlBase* getControl(const LLString& name); + LLSD registerListener(const LLString& name, LLSimpleListenerObservable *listener); 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); @@ -167,7 +224,6 @@ 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); @@ -181,7 +237,7 @@ public: S32 getS32(const LLString& name); F32 getF32(const LLString& name); U32 getU32(const LLString& name); - LLSD getLLSD(const LLString& name); + LLSD getValue(const LLString& name); // Note: If an LLColor4U control exists, it will cast it to the correct @@ -202,21 +258,19 @@ 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 saveToFile(const LLString& filename, BOOL nondefault_only); - U32 loadFromFile(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING); + 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); 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 deleted file mode 100644 index 01c590c1f3..0000000000 --- a/indra/newview/app_settings/cmd_line.xml +++ /dev/null @@ -1,323 +0,0 @@ -<?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 deleted file mode 100644 index 012bc9ec10..0000000000 --- a/indra/newview/app_settings/settings.xml +++ /dev/null @@ -1,9604 +0,0 @@ -<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 deleted file mode 100644 index cc7f5ac88b..0000000000 --- a/indra/newview/app_settings/settings_crash_behavior.xml +++ /dev/null @@ -1,15 +0,0 @@ -<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 deleted file mode 100644 index 997bb0c33c..0000000000 --- a/indra/newview/app_settings/settings_files.xml +++ /dev/null @@ -1,22 +0,0 @@ -<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 deleted file mode 100644 index 90c7b11637..0000000000 --- a/indra/newview/app_settings/settings_per_account.xml +++ /dev/null @@ -1,114 +0,0 @@ -<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 2fe23c9a51..420f0811ff 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 4dab653d19..ac92ee8525 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -273,7 +273,8 @@ void LLAgentFriendObserver::changed(U32 mask) // LLAgent() //----------------------------------------------------------------------------- LLAgent::LLAgent() -: mDrawDistance( DEFAULT_FAR_PLANE ), +: mViewerPort(NET_USE_OS_ASSIGNED_PORT), + mDrawDistance( DEFAULT_FAR_PLANE ), mDoubleTapRunTimer(), mDoubleTapRunMode(DOUBLETAP_NONE), @@ -454,6 +455,8 @@ 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"); @@ -7463,6 +7466,19 @@ 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 50830a75f0..469d2e4fe0 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -36,7 +36,6 @@ #include "indra_constants.h" #include "llmath.h" -#include "llcontrol.h" #include "llcoordframe.h" #include "llevent.h" #include "llagentconstants.h" @@ -226,8 +225,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; } // @@ -687,6 +686,7 @@ 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,6 +932,21 @@ 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 ffa2a82646..8c7af9ebf7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -62,13 +62,10 @@ #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 @@ -156,7 +153,10 @@ #include "llinventoryview.h" -#include "llcommandlineparser.h" +// *FIX: Remove these once the command line params thing is figured out. +// Yuck! +static int gTempArgC = 0; +static char** gTempArgV; // *FIX: These extern globals should be cleaned up. // The globals either represent state/config/resource-storage of either @@ -169,6 +169,7 @@ //---------------------------------------------------------------------------- // llviewernetwork.h #include "llviewernetwork.h" +// extern EGridInfo gGridChoice; ////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor @@ -215,8 +216,14 @@ 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() @@ -227,10 +234,21 @@ 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; @@ -261,6 +279,7 @@ F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME; LLUUID gInventoryLibraryOwner; LLUUID gInventoryLibraryRoot; +BOOL gDisableVoice = FALSE; BOOL gDisconnected = FALSE; // Map scale in pixels per region @@ -272,11 +291,17 @@ 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); @@ -286,14 +311,34 @@ 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"; @@ -315,10 +360,52 @@ 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() > gSavedSettings.getF32("AFKTimeout"))) + if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gAFKTimeout)) { gAgent.setAFK(); } @@ -357,7 +444,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 settings_to_globals() +static void saved_settings_to_globals() { LLBUTTON_H_PAD = gSavedSettings.getS32("ButtonHPad"); LLBUTTON_V_PAD = gSavedSettings.getS32("ButtonVPad"); @@ -395,15 +482,15 @@ static void 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"); @@ -445,74 +532,367 @@ static void settings_modify() // propagate push to talk preference to current status gSavedSettings.setBOOL("PTTCurrentlyEnabled", gSavedSettings.getBOOL("EnablePushToTalk")); + + settings_setup_listeners(); + + // gAgent.init() also loads from saved settings. } -void initGridChoice() +int parse_args(int argc, char **argv) { - LLString gridChoice = gSavedSettings.getString("GridChoice"); - if(!gridChoice.empty()) + // 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++) + { // Used to show first chunk of each argument passed in the // window title. - { - // 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()); - - } - } + 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]); -#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) + 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)) { - LLString custom_server = gSavedSettings.getString("CustomServer"); - if (custom_server.empty()) + 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()) { - gGridName = "none"; + 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 { - gGridName = custom_server.c_str(); + // only works if -login is last parameter on command line + llerrs << "Not enough parameters to -login. Did you mean -loginuri?" << llendl; } } - gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mName); - } + 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)) + { + std::string slurl = argv[j]; + if (LLURLDispatcher::isSLURLCommand(slurl)) + { + LLStartUp::sSLURLCommand = slurl; + } + else + { + LLURLSimString::setString(slurl); + } + // *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 + } #endif + else if(!strncmp(argv[j], "-qa", 3)) + { + gQAMode = TRUE; + } + else + { - if (gGridChoice == GRID_INFO_NONE) - { - gGridChoice = GridDefaultChoice; - gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mName); + // 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; + } } + return 0; } bool send_url_to_other_instance(const std::string& url) @@ -558,12 +938,11 @@ LLAppViewer::LLAppViewer() : mReportedCrash(false), mNumSessions(0), mPurgeCache(false), - mPurgeOnExit(false), - mSecondInstance(false), + mPurgeOnExit(false), + mSecondInstance(false), mSavedFinalSnapshot(false), - mQuitRequested(false), - mLogoutRequestSent(false), - mYieldTime(-1) + mQuitRequested(false), + mLogoutRequestSent(false) { if(NULL != sInstance) { @@ -579,6 +958,13 @@ 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. @@ -587,6 +973,7 @@ bool LLAppViewer::init() initThreads(); + initEarlyConfiguration(); // // Start of the application @@ -606,24 +993,61 @@ bool LLAppViewer::init() // // OK to write stuff to logs now, we've now crash reported if necessary // - if (!initConfiguration()) - return false; - writeSystemInfo(); + // 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); - // 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 ); + if (!initConfiguration()) + return false; ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // *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); @@ -663,25 +1087,56 @@ 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.loadFromFileLegacy(viewer_art_filename.c_str(), FALSE); + gViewerArt.loadFromFile(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.loadFromFileLegacy(textures_filename.c_str(), FALSE); + gViewerArt.loadFromFile(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.loadFromFileLegacy(colors_base_filename.c_str(), FALSE, TYPE_COL4U); + gColors.loadFromFile(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.loadFromFileLegacy(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0) + if (gColors.loadFromFile(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0) { - llinfos << "Cannot load user colors from " << user_colors_filename << llendl; + 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); } // Widget construction depends on LLUI being initialized @@ -704,18 +1159,16 @@ 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(); @@ -980,9 +1433,9 @@ bool LLAppViewer::mainLoop() bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads"); // yield some time to the os based on command line option - if(mYieldTime >= 0) + if(gYieldTime) { - ms_sleep(mYieldTime); + ms_sleep(gYieldMS); } // yield cooperatively when not running as foreground window @@ -1254,11 +1707,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(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); + gSavedSettings.saveToFile(gSettingsFileName, TRUE); + if (!gPerAccountSettingsFileName.empty()) + { + gSavedPerAccountSettings.saveToFile(gPerAccountSettingsFileName, TRUE); + } llinfos << "Saved settings" << llendflush; std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); @@ -1353,10 +1806,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()) { @@ -1377,6 +1830,106 @@ 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 @@ -1437,275 +1990,14 @@ 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() { - //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)) - { - 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)) + // Ye olde parse_args()... + if(!doConfigFromCommandLine()) { - 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"; @@ -1776,6 +2068,19 @@ 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 // @@ -1788,7 +2093,7 @@ bool LLAppViewer::initConfiguration() #endif LLString::truncate(gWindowTitle, 255); - if (!gSavedSettings.getBOOL("AllowMultipleViewers")) + if (!gMultipleViewersOK) { // // Check for another instance of the app running @@ -1914,12 +2219,12 @@ bool LLAppViewer::initConfiguration() if (mSecondInstance) { - gSavedSettings.setBOOL("CmdLineDisableVoice", TRUE); + gDisableVoice = 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; } */ @@ -1928,15 +2233,95 @@ bool LLAppViewer::initConfiguration() initMarkerFile(); } - // need to do this here - need to have initialized global settings first - LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); - if ( nextLoginLocation.length() ) + 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 { - LLURLSimString::setString( nextLoginLocation.c_str() ); - }; + // 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; - gLastRunVersion = gSavedSettings.getString("LastRunVersion"); - return true; // Config was successful. + 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) + { + removeMarkerFile(); + return false; + } + + return true; } bool LLAppViewer::initWindow() @@ -1955,11 +2340,10 @@ 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, ignorePixelDepth); + FALSE, gIgnorePixelDepth); if (gSavedSettings.getBOOL("FullScreen")) { @@ -1981,14 +2365,14 @@ bool LLAppViewer::initWindow() // Set this flag in case we crash while initializing GL gSavedSettings.setBOOL("RenderInitError", TRUE); - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); + gSavedSettings.saveToFile( gSettingsFileName, TRUE ); gPipeline.init(); stop_glerror(); gViewerWindow->initGLDefaults(); gSavedSettings.setBOOL("RenderInitError", FALSE); - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); + gSavedSettings.saveToFile( gSettingsFileName, TRUE ); } LLUI::sWindow = gViewerWindow->getWindow(); @@ -1996,6 +2380,11 @@ 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); @@ -2085,7 +2474,7 @@ void LLAppViewer::writeSystemInfo() { gDebugInfo["SLLog"] = LLError::logFileName(); - gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName"); + gDebugInfo["ClientInfo"]["Name"] = gChannelName; gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR; gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR; gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH; @@ -2136,7 +2525,7 @@ void LLAppViewer::handleViewerCrash() } pApp->mReportedCrash = TRUE; - gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile"); + gDebugInfo["SettingsFilename"] = gSettingsFileName; gDebugInfo["CAFilename"] = gDirUtilp->getCAFile(); gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName().c_str(); gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath().c_str(); @@ -2277,11 +2666,7 @@ 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) { @@ -2487,7 +2872,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 (gSavedSettings.getBOOL("AllowMultipleViewers")) + if (gMultipleViewersOK) { // don't mess with renaming the VFS in this case new_salt = old_salt; @@ -2686,6 +3071,17 @@ 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) { @@ -2854,6 +3250,8 @@ void LLAppViewer::idle() // Update frame timers static LLTimer idle_timer; + LLControlBase::updateAllListeners(); + LLFrameTimer::updateFrameTime(); LLEventTimer::updateClass(); LLCriticalDamp::updateInterpolants(); @@ -2874,10 +3272,9 @@ void LLAppViewer::idle() // Smoothly weight toward current frame gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f; - F32 qas = gSavedSettings.getF32("QuitAfterSeconds"); - if (qas > 0.f) + if (gQuitAfterSeconds > 0.f) { - if (gRenderStartTime.getElapsedTimeF32() > qas) + if (gRenderStartTime.getElapsedTimeF32() > gQuitAfterSeconds) { LLAppViewer::instance()->forceQuit(); } @@ -2916,7 +3313,7 @@ void LLAppViewer::idle() // Update simulator agent state // - if (gSavedSettings.getBOOL("RotateRight")) + if (gRotateRight) { gAgent.moveYaw(-1.f); } @@ -3124,6 +3521,7 @@ void LLAppViewer::idle() // // Update weather effects // + if (!gNoRender) { gWorldp->updateClouds(gFrameDTClamped); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 40a69f7868..9518636f87 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -36,21 +36,15 @@ class LLTextureCache; class LLWorkerThread; class LLTextureFetch; -class LLCommandLineParser; - class LLAppViewer : public LLApp { public: LLAppViewer(); virtual ~LLAppViewer(); - /** - * @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; } + // *NOTE:Mani - Don't use this! + // Having + static LLAppViewer* instance() {return sInstance; } // // Main application logic @@ -70,6 +64,10 @@ 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; } @@ -89,6 +87,9 @@ 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. @@ -100,6 +101,8 @@ 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. @@ -122,26 +125,23 @@ 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. - void purgeCache(); // Clear the local cache. + + bool doConfigFromCommandLine(); // calls parse args. 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,8 +186,6 @@ 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 @@ -198,16 +196,31 @@ 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; @@ -252,6 +265,7 @@ extern LLUUID gInventoryLibraryOwner; extern LLUUID gInventoryLibraryRoot; extern BOOL gDisconnected; +extern BOOL gDisableVoice; // Map scale in pixels per region extern F32 gMapScale; @@ -261,6 +275,9 @@ 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 @@ -268,6 +285,9 @@ extern LLVFS *gStaticVFS; extern LLMemoryInfo gSysMemory; +extern bool gPreloadImages; +extern bool gPreloadSounds; + extern LLString gLastVersionChannel; extern LLVector3 gWindVec; @@ -278,7 +298,10 @@ 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 c36dd2955e..1993fd0a76 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -31,11 +31,9 @@ #include "llviewerprecompiledheaders.h" +#include "llmemtype.h" #include "llappviewerlinux.h" -#include "llcommandlineparser.h" - -#include "llmemtype.h" #include "llviewernetwork.h" #include "llmd5.h" @@ -56,12 +54,6 @@ # include <ucontext.h> #endif -namespace -{ - int gArgC = 0; - char **gArgV = NULL; -} - int main( int argc, char **argv ) { LLMemType mt1(LLMemType::MTYPE_STARTUP); @@ -70,14 +62,18 @@ 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->init(); + bool 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) { llwarns << "Application init failed." << llendl; @@ -325,7 +321,7 @@ void LLAppViewerLinux::handleCrashReporting() {(char*)cmd.c_str(), ask_dialog, (char*)"-user", - (char*)gGridName.c_str(), + (char*)gGridName, (char*)"-name", (char*)LLAppViewer::instance()->getSecondLifeTitle().c_str(), NULL}; @@ -407,12 +403,6 @@ 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 ce91b6b8b6..f38a64a8cd 100644 --- a/indra/newview/llappviewerlinux.h +++ b/indra/newview/llappviewerlinux.h @@ -36,8 +36,6 @@ #include "llappviewer.h" #endif -class LLCommandLineParser; - class LLAppViewerLinux : public LLAppViewer { public: @@ -56,7 +54,6 @@ 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 ba3f28911f..2d7091a075 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -36,8 +36,6 @@ #endif #include "llappviewermacosx.h" -#include "llcommandlineparser.h" - #include "llmemtype.h" #include "llviewernetwork.h" @@ -47,13 +45,6 @@ #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 ) { @@ -70,11 +61,14 @@ int main( int argc, char **argv ) viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); - // Store off the command line args for use later. - gArgC = argc; - gArgV = argv; - - bool ok = viewer_app_ptr->init(); + bool 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) { llwarns << "Application init failed." << llendl; @@ -114,27 +108,6 @@ 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 cc4a7f5eb5..2c61e5a01c 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -51,7 +51,6 @@ 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 fb726e7c97..09bcf6f7cc 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -55,13 +55,41 @@ #include "llviewernetwork.h" #include "llmd5.h" -#include "llcommandlineparser.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," ); + } + 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) { - // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. - - // Translate the signals/exceptions into cross-platform stuff + // Translate the signals/exceptions into cross-platform stuff // Windows implementation llinfos << "Entering Windows Exception Handler..." << llendl; @@ -116,7 +144,21 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, // *FIX: global gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); - LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(lpCmdLine); + // 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(); // *FIX:Mani This method is poorly named, since the exception // is now handled by LLApp. @@ -138,6 +180,13 @@ 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) { @@ -259,8 +308,7 @@ void create_console() setvbuf( stderr, NULL, _IONBF, 0 ); } -LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) : - mCmdLine(cmd_line) +LLAppViewerWin32::LLAppViewerWin32() { } @@ -291,11 +339,15 @@ bool LLAppViewerWin32::cleanup() return result; } -void LLAppViewerWin32::initConsole() +bool LLAppViewerWin32::initWindow() { - // pop up debug console - create_console(); - return LLAppViewer::initConsole(); + // pop up debug console if necessary + if (gUseConsole && gSavedSettings.getBOOL("ShowConsoleWindow")) + { + create_console(); + } + + return LLAppViewer::initWindow(); } void write_debug_dx(const char* str) @@ -316,7 +368,7 @@ bool LLAppViewerWin32::initHardwareTest() // Do driver verification and initialization based on DirectX // hardware polling and driver versions // - if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe")) + if (gProbeHardware) { BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); @@ -379,11 +431,6 @@ bool LLAppViewerWin32::initHardwareTest() return true; } -bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp) -{ - return clp.parseCommandLineString(mCmdLine); -} - void LLAppViewerWin32::handleCrashReporting() { // Windows only behaivor. Spawn win crash reporter. @@ -439,4 +486,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 66653c48f5..23e7337618 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -39,7 +39,7 @@ class LLAppViewerWin32 : public LLAppViewer { public: - LLAppViewerWin32(const char* cmd_line); + LLAppViewerWin32(); virtual ~LLAppViewerWin32(); // @@ -49,18 +49,15 @@ public: virtual bool cleanup(); protected: - virtual void initConsole(); // Initialize OS level debugging console. + virtual bool initWindow(); // Initialize the viewer's window. virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware. - virtual bool initParseCommandLine(LLCommandLineParser& clp); - - virtual void handleCrashReporting(); + 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 deleted file mode 100644 index 2f99ca1247..0000000000 --- a/indra/newview/llcommandlineparser.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/** - * @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 deleted file mode 100644 index 6cc40ee8b4..0000000000 --- a/indra/newview/llcommandlineparser.h +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @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 e6fcfb6d40..bf7d48f911 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -483,7 +483,7 @@ void LLFeatureManager::applyFeatures(bool skipFeatures) } // get the control setting - LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first); + LLControlBase* 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 b00450eec6..97ebc02ba1 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -49,8 +49,7 @@ std::set<LLString> LLFirstUse::sConfigVariables; // static void LLFirstUse::addConfigVariable(const LLString& var) { - //Don't add the warning, now that we're storing the default in the settings_default.xml file - //gSavedSettings.addWarning(var); + gSavedSettings.addWarning(var); sConfigVariables.insert(var); } @@ -257,15 +256,13 @@ void LLFirstUse::useSculptedPrim() // static void LLFirstUse::useVoice() { - if (!gSavedSettings.getBOOL("CmdLineDisableVoice")) - { - if (gSavedSettings.getWarning("FirstVoice")) - { - gSavedSettings.setWarning("FirstVoice", FALSE); - - LLFloaterVoiceWizard::showInstance(); - } - } + if (gDisableVoice) return; + if (gSavedSettings.getWarning("FirstVoice")) + { + gSavedSettings.setWarning("FirstVoice", FALSE); + + LLFloaterVoiceWizard::showInstance(); + } } // static diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 3a1fc6146a..4edf6f3652 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__, - gSavedSettings.getString("VersionChannelName").c_str()); + gChannelName.c_str()); support.append(version); support.append("\n\n"); diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 7a0f01e5a6..4573ca75d2 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -173,7 +173,8 @@ bool LLPanelGroups::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) reset(); return true; } - return false; + + return LLView::handleEvent(event, userdata); } // Default constructor diff --git a/indra/newview/llfloatergroups.h b/indra/newview/llfloatergroups.h index 6d99f34085..a1740861d5 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, public LLSimpleListener +class LLPanelGroups : public LLPanel { public: LLPanelGroups(); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 345561f551..584d7479e4 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( gSavedSettings.getString("ClientSettingsFile"), TRUE ); + gSavedSettings.saveToFile( gSettingsFileName, 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 deleted file mode 100644 index 7975bd95ef..0000000000 --- a/indra/newview/llfloatersettingsdebug.cpp +++ /dev/null @@ -1,490 +0,0 @@ -/** - * @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 deleted file mode 100644 index 389a474467..0000000000 --- a/indra/newview/llfloatersettingsdebug.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @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 e24b5251e0..7ceb40499f 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -163,6 +163,8 @@ LLNetMap::LLNetMap( mPopupMenuHandle = menu->getHandle(); sInstance = this; + + gSavedSettings.getControl("MiniMapRotate")->addListener(&mNetMapListener); } LLNetMap::~LLNetMap() @@ -826,3 +828,9 @@ 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 dc696238ea..d375413d1d 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -45,6 +45,12 @@ class LLCoordGL; class LLTextBox; class LLMenuGL; +class LLRotateNetMapListener : public LLSimpleListener +{ +public: + bool handleEvent(LLPointer<LLEvent>, const LLSD& user_data); +}; + class LLNetMap : public LLUICtrl { public: @@ -111,6 +117,8 @@ 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 b6e8c1a7f3..1e933706e1 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) { - gGridName = gGridInfo[gGridChoice].mName; /* Flawfinder: ignore */ + snprintf(gGridName, MAX_STRING, "%s", 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(gSavedSettings.getString("VersionChannelName")); + channel_text->setText(gChannelName); 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 = gSavedSettings.getString("LoginPage"); + std::string login_page = LLAppViewer::instance()->getLoginPage(); if (login_page.empty()) { login_page = getString( "real_url" ); @@ -927,7 +927,7 @@ void LLPanelLogin::loadLoginPage() std::ostringstream oStr; - std::string login_page = gSavedSettings.getString("LoginPage"); + std::string login_page = LLAppViewer::instance()->getLoginPage(); if (login_page.empty()) { login_page = sInstance->getString( "real_url" ); @@ -984,24 +984,24 @@ void LLPanelLogin::loadLoginPage() } LLString firstname, lastname; - - 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()) + + if (gCmdLineFirstName.empty()) { firstname = gSavedSettings.getString("FirstName"); } + else + { + firstname = gCmdLineFirstName; + } - if (lastname.empty()) + if (gCmdLineLastName.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 (!password.empty()) + if (!gCmdLinePassword.empty()) { - oStr << "&password=" << password; + oStr << "&password=" << gCmdLinePassword; } else if (!(password = load_password_from_disk()).empty()) { diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index f2475d84d9..d2bc8f4100 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -447,7 +447,7 @@ BOOL idle_startup() { fclose(found_template); - U32 port = gSavedSettings.getU32("UserConnectionPort"); + U32 port = gAgent.mViewerPort; 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")) + if (gSavedSettings.getBOOL("LogMessages") || gLogMessages) { llinfos << "Message logging activated!" << llendl; msg->startLogging(); @@ -516,23 +516,18 @@ BOOL idle_startup() } gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS); - - F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage"); - msg->mPacketRing.setDropPercentage(dropPercent); - - F32 inBandwidth = gSavedSettings.getF32("InBandwidth"); - F32 outBandwidth = gSavedSettings.getF32("OutBandwidth"); - if (inBandwidth != 0.f) + msg->mPacketRing.setDropPercentage(gPacketDropPercentage); + if (gInBandwidth != 0.f) { - llinfos << "Setting packetring incoming bandwidth to " << inBandwidth << llendl; + llinfos << "Setting packetring incoming bandwidth to " << gInBandwidth << llendl; msg->mPacketRing.setUseInThrottle(TRUE); - msg->mPacketRing.setInBandwidth(inBandwidth); + msg->mPacketRing.setInBandwidth(gInBandwidth); } - if (outBandwidth != 0.f) + if (gOutBandwidth != 0.f) { - llinfos << "Setting packetring outgoing bandwidth to " << outBandwidth << llendl; + llinfos << "Setting packetring outgoing bandwidth to " << gOutBandwidth << llendl; msg->mPacketRing.setUseOutThrottle(TRUE); - msg->mPacketRing.setOutBandwidth(outBandwidth); + msg->mPacketRing.setOutBandwidth(gOutBandwidth); } } @@ -546,7 +541,7 @@ BOOL idle_startup() // or audio cues in connection UI. //------------------------------------------------- - if (FALSE == gSavedSettings.getBOOL("NoAudio")) + if (gUseAudio) { #if LL_FMOD gAudiop = (LLAudioEngine *) new LLAudioEngine_FMOD(); @@ -591,13 +586,14 @@ BOOL idle_startup() show_connect_box = FALSE; } - 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(); + else if( !gCmdLineFirstName.empty() + && !gCmdLineLastName.empty() + && !gCmdLinePassword.empty()) + { + firstname = gCmdLineFirstName; + lastname = gCmdLineLastName; - LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str()); + LLMD5 pass((unsigned char*)gCmdLinePassword.c_str()); char md5pass[33]; /* Flawfinder: ignore */ pass.hex_digest(md5pass); password = md5pass; @@ -608,9 +604,9 @@ BOOL idle_startup() #else show_connect_box = FALSE; #endif - gSavedSettings.setBOOL("AutoLogin", TRUE); - } - else if (gSavedSettings.getBOOL("AutoLogin")) + gAutoLogin = TRUE; + } + else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin")) { firstname = gSavedSettings.getString("FirstName"); lastname = gSavedSettings.getString("LastName"); @@ -785,14 +781,19 @@ 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)); - // Overwrite default user settings with user settings - LLAppViewer::instance()->loadSettingsFromDirectory(LL_PATH_PER_SL_ACCOUNT); + 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); // 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. @@ -827,7 +828,7 @@ BOOL idle_startup() gSavedSettings.setS32("ServerChoice", gGridChoice); if (gGridChoice == GRID_INFO_OTHER) { - gGridName = server_label;/* Flawfinder: ignore */ + snprintf(gGridName, MAX_STRING, "%s", server_label.c_str());/* Flawfinder: ignore */ } if ( user_picked_server ) @@ -931,7 +932,7 @@ BOOL idle_startup() //requested_options.push_back("inventory-meat"); //requested_options.push_back("inventory-skel-targets"); #if (!defined LL_MINIMIAL_REQUESTED_OPTIONS) - if(FALSE == gSavedSettings.getBOOL("NoInventoryLibrary")) + if(gRequestInventoryLibrary) { requested_options.push_back("inventory-lib-root"); requested_options.push_back("inventory-lib-owner"); @@ -951,7 +952,7 @@ BOOL idle_startup() requested_options.push_back("tutorial_setting"); requested_options.push_back("login-flags"); requested_options.push_back("global-textures"); - if(gSavedSettings.getBOOL("ConnectAsGod")) + if(gGodConnect) { gSavedSettings.setBOOL("UseDebugMenus", TRUE); requested_options.push_back("god-connect"); @@ -1239,6 +1240,7 @@ BOOL idle_startup() << (sAuthUriNum + 1) << ". "; auth_desc = s.str(); LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE ); + sAuthUriNum++; return do_normal_idle; } break; @@ -1488,7 +1490,7 @@ BOOL idle_startup() args["[ERROR_MESSAGE]"] = emsg.str(); gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); reset_login(); - gSavedSettings.setBOOL("AutoLogin", FALSE); + gAutoLogin = FALSE; show_connect_box = TRUE; } @@ -1508,7 +1510,7 @@ BOOL idle_startup() args["[ERROR_MESSAGE]"] = emsg.str(); gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); reset_login(); - gSavedSettings.setBOOL("AutoLogin", FALSE); + gAutoLogin = FALSE; show_connect_box = TRUE; // Don't save an incorrect password to disk. save_password_to_disk(NULL); @@ -1532,7 +1534,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(gSavedSettings.getString("ClientSettingsFile"), TRUE); + gSavedSettings.saveToFile(gSettingsFileName, TRUE); // // Initialize classes w/graphics stuff. @@ -2099,7 +2101,7 @@ BOOL idle_startup() gSavedSettings.setString( "NextLoginLocation", "" ); // and make sure it's saved - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE ); + gSavedSettings.saveToFile( gSettingsFileName, TRUE ); }; if (!gNoRender) @@ -2391,7 +2393,7 @@ void login_show() if( GRID_INFO_OTHER == gGridChoice ) { - LLPanelLogin::addServer( gGridName.c_str(), GRID_INFO_OTHER ); + LLPanelLogin::addServer( gGridName, GRID_INFO_OTHER ); } else { @@ -2439,7 +2441,7 @@ void login_callback(S32 option, void *userdata) { // turn off the setting and write out to disk gSavedSettings.setBOOL("RememberPassword", FALSE); - gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE ); + gSavedSettings.saveToFile(gSettingsFileName, TRUE); // stomp the saved password on disk save_password_to_disk(NULL); @@ -2633,7 +2635,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(gSavedSettings.getString("ClientSettingsFile"), TRUE); + gSavedSettings.saveToFile(gSettingsFileName, TRUE); std::ostringstream message; @@ -2733,7 +2735,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"] = gSavedSettings.getString("VersionChannelName"); + query_map["channel"] = gChannelName; // *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 9c8bb97343..ffa921125a 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -80,10 +80,14 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask) { if( gAgent.cameraMouselook() ) { - const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f; + #if 1 //LL_WINDOWS || LL_DARWIN + const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f; + #else + const F32 NOMINAL_MOUSE_SENSITIVITY = 0.025f; + #endif - F32 mouse_sensitivity = gSavedSettings.getF32("MouseSensitivity"); - mouse_sensitivity = clamp_rescale(mouse_sensitivity, 0.f, 15.f, 0.5f, 2.75f) * NOMINAL_MOUSE_SENSITIVITY; + + F32 mouse_sensitivity = clamp_rescale(gMouseSensitivity, 0.f, 15.f, 0.5f, 2.75f) * NOMINAL_MOUSE_SENSITIVITY; // ...move the view with the mouse @@ -94,7 +98,7 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask) if (dx != 0 || dy != 0) { // ...actually moved off center - if (gSavedSettings.getBOOL("InvertMouse")) + if (gInvertMouse) { gAgent.pitch(mouse_sensitivity * -dy); } diff --git a/indra/newview/llvectorperfoptions.cpp b/indra/newview/llvectorperfoptions.cpp index 34c10a4f72..ca8ae2e886 100644 --- a/indra/newview/llvectorperfoptions.cpp +++ b/indra/newview/llvectorperfoptions.cpp @@ -31,4 +31,101 @@ #include "llviewerprecompiledheaders.h" -// Deprecated - moved into llviewerjointmesh +#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() +{ +} + diff --git a/indra/newview/llvectorperfoptions.h b/indra/newview/llvectorperfoptions.h index e2a0a37e33..dac4d1f86c 100644 --- a/indra/newview/llvectorperfoptions.h +++ b/indra/newview/llvectorperfoptions.h @@ -32,6 +32,10 @@ #ifndef LL_VECTORPERFOPTIONS_H #define LL_VECTORPERFOPTIONS_H -// Deprecated - moved into llviewerjointmesh +namespace LLVectorPerformanceOptions +{ + void initClass(); // Run after configuration files are read. + void cleanupClass(); +}; #endif diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index fd85ac1bc1..affce91b79 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 && FALSE == gSavedSettings.getBOOL("NoPreload")) + if (!mute_audio && gPreloadSounds) { 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 7733ef5ae1..9c81f89e99 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -36,47 +36,26 @@ #include "indra_constants.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" +#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" #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 @@ -86,440 +65,461 @@ LLControlGroup gCrashSettings; // saved at end of session LLString gLastRunVersion; LLString gCurrentVersion; -extern BOOL gResizeScreenTexture; +LLString gSettingsFileName; +LLString gPerAccountSettingsFileName; -//////////////////////////////////////////////////////////////////////////// -// Listeners - -static bool handleRenderAvatarMouselookChanged(const LLSD& newvalue) -{ - LLVOAvatar::sVisibleInFirstPerson = newvalue.asBoolean(); - return true; -} - -static bool handleRenderFarClipChanged(const LLSD& newvalue) +LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater("Configuration Editor") { - F32 draw_distance = (F32) newvalue.asReal(); - gAgent.mDrawDistance = draw_distance; - if (gWorldPointer) - { - gWorldPointer->setLandFarClip(draw_distance); - } - return true; } -static bool handleTerrainDetailChanged(const LLSD& newvalue) +LLFloaterSettingsDebug::~LLFloaterSettingsDebug() { - LLDrawPoolTerrain::sDetailMode = newvalue.asInteger(); - return true; + sInstance = NULL; } - -static bool handleSetShaderChanged(const LLSD& newvalue) +BOOL LLFloaterSettingsDebug::postBuild() { - LLShaderMgr::setShaders(); - return true; -} + LLComboBox* settings_combo = LLUICtrlFactory::getComboBoxByName(this, "settings_combo"); -static bool handleReleaseGLBufferChanged(const LLSD& newvalue) -{ - if (gPipeline.isInit()) + LLControlGroup::ctrl_name_table_t::iterator name_it; + for(name_it = gSavedSettings.mNameTable.begin(); name_it != gSavedSettings.mNameTable.end(); ++name_it) { - gPipeline.releaseGLBuffers(); - gPipeline.createGLBuffers(); + settings_combo->add(name_it->first, (void*)name_it->second); } - 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) + for(name_it = gSavedPerAccountSettings.mNameTable.begin(); name_it != gSavedPerAccountSettings.mNameTable.end(); ++name_it) { - gamma = 1.0f; // restore normal gamma + settings_combo->add(name_it->first, (void*)name_it->second); } - if (gViewerWindow && gViewerWindow->getWindow() && gamma != gViewerWindow->getWindow()->getGamma()) + for(name_it = gColors.mNameTable.begin(); name_it != gColors.mNameTable.end(); ++name_it) { - // Only save it if it's changed - if (!gViewerWindow->getWindow()->setGamma(gamma)) - { - llwarns << "setGamma failed!" << llendl; - } + settings_combo->add(name_it->first, (void*)name_it->second); } + 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(); - return true; -} - -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; -} - -const S32 MAX_USER_COMPOSITE_LIMIT = 100; -const S32 MIN_USER_COMPOSITE_LIMIT = 0; + gUICtrlFactory->buildFloater(sInstance, "floater_settings_debug.xml"); + } -static bool handleCompositeLimitChanged(const LLSD& newvalue) -{ - S32 composite_limit = llmax(MIN_USER_COMPOSITE_LIMIT, llmin((S32)newvalue.asInteger(), MAX_USER_COMPOSITE_LIMIT)); - LLVOAvatar::sMaxOtherAvatarsToComposite = composite_limit; - 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; + } } -static bool handleVideoMemoryChanged(const LLSD& newvalue) +// static +void LLFloaterSettingsDebug::onClickDefault(void* user_data) { - gImageList.updateMaxResidentTexMem(newvalue.asInteger()); - return true; -} + LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; + LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo"); + LLControlBase* controlp = (LLControlBase*)settings_combo->getCurrentUserdata(); -static bool handleBandwidthChanged(const LLSD& newvalue) -{ - gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); - return true; -} - -static bool handleChatFontSizeChanged(const LLSD& newvalue) -{ - if(gConsole) + if (controlp) { - gConsole->setFontSize(newvalue.asInteger()); + controlp->resetToDefault(); + floaterp->updateControl(controlp); } - return true; } -static bool handleChatPersistTimeChanged(const LLSD& newvalue) +// we've switched controls, or doing per-frame update, so update spinners, etc. +void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp) { - if(gConsole) - { - gConsole->setLinePersistTime((F32) newvalue.asReal()); - } - return true; -} + 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"); -static bool handleConsoleMaxLinesChanged(const LLSD& newvalue) -{ - if(gConsole) + if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch) { - gConsole->setMaxLines(newvalue.asInteger()); + llwarns << "Could not find all desired controls by name" + << llendl; + return; } - return true; -} -static void handleAudioVolumeChanged(const LLSD& newvalue) -{ - audio_update_volume(true); -} - -static bool handleJoystickChanged(const LLSD& newvalue) -{ - LLViewerJoystick::updateCamera(TRUE); - 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 bool handleAudioStreamMusicChanged(const LLSD& newvalue) -{ - if (gAudiop) + if (controlp) { - if ( newvalue.asBoolean() ) + 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()) { - if (gParcelMgr - && gParcelMgr->getAgentParcel() - && !gParcelMgr->getAgentParcel()->getMusicURL().empty()) - { - // if stream is already playing, don't call this - // otherwise music will briefly stop - if ( ! gAudiop->isInternetStreamPlaying() ) - { - gAudiop->startInternetStream(gParcelMgr->getAgentParcel()->getMusicURL().c_str()); - } - } + spinner1->setIncrement(0.1f); } - else + if (!spinner2->hasFocus()) { - gAudiop->stopInternetStream(); + spinner2->setIncrement(0.1f); + } + if (!spinner3->hasFocus()) + { + spinner3->setIncrement(0.1f); + } + if (!spinner4->hasFocus()) + { + spinner4->setIncrement(0.1f); } - } - return true; -} - -static bool handleUseOcclusionChanged(const LLSD& newvalue) -{ - LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery - && gFeatureManagerp->isFeatureAvailable("UseOcclusion") && !gUseWireframe) ? 2 : 0; - return true; -} - -static bool handleNumpadControlChanged(const LLSD& newvalue) -{ - if (gKeyboard) - { - gKeyboard->setNumpadDistinct(static_cast<LLKeyboard::e_numpad_distinct>(newvalue.asInteger())); - } - return true; -} - -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; -} + LLSD sd = controlp->get(); + switch(type) + { + case TYPE_U32: + spinner1->setVisible(TRUE); + spinner1->setLabel(LLString("value")); // Debug, don't translate + childSetVisible("boolean_combo", FALSE); + 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 + 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()) + { + childSetValue("boolean_combo", LLSD("true")); + } + 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); + } -bool handleRotateNetMapChanged(const LLSD& newvalue) -{ - LLNetMap::setRotateMap(newvalue.asBoolean()); - 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]); + } -bool handleVectorizeChanged(const LLSD& newvalue) -{ - LLViewerJointMesh::updateVectorize(); - return true; -} + spinner4->setMinValue(0); + spinner4->setMaxValue(255); + spinner4->setIncrement(1.f); -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); + break; + } + default: + mComment->setText(LLString("unknown")); + break; + } } - 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 2727e36b53..c2a9dc9096 100644 --- a/indra/newview/llviewercontrol.h +++ b/indra/newview/llviewercontrol.h @@ -32,8 +32,9 @@ #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. @@ -42,12 +43,33 @@ 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); @@ -68,4 +90,7 @@ 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 fe00c25c63..2677b33af8 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -866,53 +866,13 @@ 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); -//static -void LLViewerJointMesh::updateVectorize() -{ - 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() { + extern BOOL gVectorizePerfTest; + extern U32 gVectorizeProcessor; + if (!(mValid && mMesh && mFace @@ -923,7 +883,7 @@ void LLViewerJointMesh::updateGeometry() return; } - if (!sVectorizePerfTest) + if (!gVectorizePerfTest) { // Once we've measured performance, just run the specified // code version. @@ -956,13 +916,13 @@ void LLViewerJointMesh::updateGeometry() { F64 time_since_app_start = ug_timer.getElapsedSeconds(); if(sUpdateGeometryGlobalTime == 0.0 - || sUpdateGeometryLastProcessor != sVectorizeProcessor) + || sUpdateGeometryLastProcessor != gVectorizeProcessor) { sUpdateGeometryGlobalTime = time_since_app_start; sUpdateGeometryElapsedTime = 0; sUpdateGeometryCalls = 0; sUpdateGeometryRunCount = 0; - sUpdateGeometryLastProcessor = sVectorizeProcessor; + sUpdateGeometryLastProcessor = gVectorizeProcessor; sUpdateGeometryCallPointer = false; return; } @@ -1009,7 +969,7 @@ void LLViewerJointMesh::updateGeometry() F64 perf_boost = ( sUpdateGeometryElapsedTimeOff - sUpdateGeometryElapsedTimeOn ) / sUpdateGeometryElapsedTimeOn; llinfos << "run averages (" << (F64)sUpdateGeometryRunCount << "/10) vectorize off " << a - << "% : vectorize type " << sVectorizeProcessor + << "% : vectorize type " << gVectorizeProcessor << " " << b << "% : performance boost " << perf_boost * 100.0 @@ -1023,6 +983,7 @@ 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 4cef1552ca..8e1ee514ff 100644 --- a/indra/newview/llviewerjointmesh.h +++ b/indra/newview/llviewerjointmesh.h @@ -149,9 +149,6 @@ 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 9af072ad6f..f86d822d90 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -44,6 +44,9 @@ #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 @@ -454,7 +457,7 @@ void LLViewerMedia::initClass() // append our magic version number string to the browser user agent id std::ostringstream codec; codec << "[Second Life "; - codec << "(" << gSavedSettings.getString("VersionChannelName") << ")"; + codec << "(" << gChannelName << ")"; 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 a2b9cde5d1..a384d24947 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -120,7 +120,6 @@ #include "llfloaterregioninfo.h" #include "llfloaterreporter.h" #include "llfloaterscriptdebug.h" -#include "llfloatersettingsdebug.h" #include "llfloaterenvsettings.h" #include "llfloaterstats.h" #include "llfloatertest.h" @@ -377,11 +376,6 @@ 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*); @@ -1097,7 +1091,7 @@ void init_client_menu(LLMenuGL* menu) &menu_check_control, (void*)"ShowConsoleWindow")); - if(gSavedSettings.getBOOL("QAMode")) + if(gQAMode) { LLMenuGL* sub = NULL; sub = new LLMenuGL("Debugging"); @@ -1177,6 +1171,7 @@ extern BOOL gDebugClicks; extern BOOL gDebugWindowProc; extern BOOL gDebugTextEditorTips; extern BOOL gDebugSelectMgr; +extern BOOL gVectorizePerfTest; void init_debug_ui_menu(LLMenuGL* menu) { @@ -1388,7 +1383,7 @@ void init_debug_rendering_menu(LLMenuGL* menu) (void*)"ShowDepthBuffer")); sub_menu->append(new LLMenuItemToggleGL("Show Select Buffer", &gDebugSelect)); - sub_menu->append(new LLMenuItemCallGL("Vectorize Perf Test", &run_vectorize_perf_test)); + sub_menu->append(new LLMenuItemToggleGL("Vectorize Perf Test", &gVectorizePerfTest)); sub_menu = new LLMenuGL("Render Tests"); @@ -4853,7 +4848,7 @@ BOOL menu_check_build_tool( void* user_data ) void handle_reload_settings(void*) { gSavedSettings.resetToDefaults(); - gSavedSettings.loadFromFile(gSavedSettings.getString("ClientSettingsFile"), TRUE); + gSavedSettings.loadFromFile(gSettingsFileName, 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 b0ebc64b7a..6fb2957023 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -114,5 +114,10 @@ LLGridData gGridInfo[GRID_INFO_COUNT] = // Use this to figure out which domain name and login URI to use. EGridInfo gGridChoice = GRID_INFO_NONE; -LLString gGridName; /* Flawfinder: ignore */ +char gGridName[MAX_STRING]; /* Flawfinder: ignore */ + +F32 gPacketDropPercentage = 0.f; +F32 gInBandwidth = 0.f; +F32 gOutBandwidth = 0.f; + unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 4e6c874921..4de73aae7a 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 command line option + GRID_INFO_OTHER, // IP address set via -user or other command line option GRID_INFO_COUNT }; @@ -68,9 +68,12 @@ struct LLGridData const char* mHelperURI; }; +extern F32 gPacketDropPercentage; +extern F32 gInBandwidth; +extern F32 gOutBandwidth; extern EGridInfo gGridChoice; extern LLGridData gGridInfo[]; -extern LLString gGridName; /* Flawfinder: ignore */ +extern char gGridName[MAX_STRING]; /* 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 e2ea6e6ecf..69e08db2bf 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -678,6 +678,31 @@ 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();} @@ -834,6 +859,16 @@ 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; @@ -1246,7 +1281,7 @@ void LLVoiceClient::stateMachine() break; case stateStart: - if(gSavedSettings.getBOOL("CmdLineDisableVoice")) + if(gDisableVoice) { // Voice is locked out, we must not launch the vivox daemon. setState(stateJail); @@ -3609,7 +3644,7 @@ void LLVoiceClient::setVoiceEnabled(bool enabled) bool LLVoiceClient::voiceEnabled() { - return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice"); + return gSavedSettings.getBOOL("EnableVoiceChat") && !gDisableVoice; } void LLVoiceClient::setUsePTT(bool usePTT) diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index fc4ede5bab..9dc92efa81 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -238,9 +238,8 @@ 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); - BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); - mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, vefifySSLCert); - mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, vefifySSLCert ? 2 : 0); + mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, gVerifySSLCert); + mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, gVerifySSLCert? 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 e87fe8d8ff..b19e4e2c9c 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() |