diff options
Diffstat (limited to 'indra')
58 files changed, 12805 insertions, 2519 deletions
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index a0fb086029..89b276e3b3 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -339,7 +339,7 @@ const U32 MAP_ITEM_LAND_FOR_SALE = 0x07;  const U32 MAP_ITEM_CLASSIFIED = 0x08;  // Crash reporter behavior -const char* const CRASH_SETTINGS_FILE = "crash_settings.xml"; +const char* const CRASH_SETTINGS_FILE = "settings_crash_behavior.xml";  const char* const CRASH_BEHAVIOR_SETTING = "CrashSubmitBehavior";  const S32 CRASH_BEHAVIOR_ASK = 0;  const S32 CRASH_BEHAVIOR_ALWAYS_SEND = 1; diff --git a/indra/llcommon/llevent.h b/indra/llcommon/llevent.h index 8ba883a0ee..741b40b787 100644 --- a/indra/llcommon/llevent.h +++ b/indra/llcommon/llevent.h @@ -185,13 +185,6 @@ protected:  	LLPointer<LLEventDispatcher> mDispatcher;  }; -// Utility mixer class which fires & handles events -class LLSimpleListenerObservable : public LLObservable, public LLSimpleListener -{ -public: -	virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) = 0; -}; -  class LLValueChangedEvent : public LLEvent  {  public: diff --git a/indra/llcommon/llfile.cpp b/indra/llcommon/llfile.cpp index 2a18e5c64c..c44650009d 100644 --- a/indra/llcommon/llfile.cpp +++ b/indra/llcommon/llfile.cpp @@ -271,9 +271,11 @@ void llofstream::open(const char* _Filename,	/* Flawfinder: ignore */  void llofstream::close()  {	// close the C stream -	llassert(_Filebuffer); -	if (_Filebuffer->close() == 0) -		_Myios::setstate(ios_base::failbit);	/*Flawfinder: ignore*/ +	if(is_open()) +	{ +		if (_Filebuffer->close() == 0) +			_Myios::setstate(ios_base::failbit);	/*Flawfinder: ignore*/ +	}  }  llofstream::llofstream(const char *_Filename, @@ -285,7 +287,8 @@ llofstream::llofstream(const char *_Filename,  }  llofstream::~llofstream() -{	// destroy the object +{	 +	// destroy the object  	close();  	delete _Filebuffer;  } diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 2bcc89b59f..8ae6dd2ea5 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -778,9 +778,8 @@ void LLButton::setToggleState(BOOL b)  {  	if( b != mToggleState )  	{ -		mToggleState = b; -		LLValueChangedEvent *evt = new LLValueChangedEvent(this, mToggleState); -		fireEvent(evt, ""); +		setControlValue(b); // will fire LLControlVariable callbacks (if any) +		mToggleState = b; // may or may not be redundant  	}  } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 00b4c37bb0..8c62a10f2b 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -827,57 +827,33 @@ void LLMenuItemCallGL::setEnabledControl(LLString enabled_control, LLView *conte  	// Register new listener  	if (!enabled_control.empty())  	{ -		LLControlBase *control = context->findControl(enabled_control); -		if (control) -		{ -			LLSD state = control->registerListener(this, "ENABLED"); -			setEnabled(state); -		} -		else +		LLControlVariable *control = context->findControl(enabled_control); +		if (!control)  		{  			context->addBoolControl(enabled_control, getEnabled());  			control = context->findControl(enabled_control); -			control->registerListener(this, "ENABLED"); +			llassert_always(control);  		} +		control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("enabled"))); +		setEnabled(control->getValue());  	}  } -void LLMenuItemCallGL::setVisibleControl(LLString enabled_control, LLView *context) +void LLMenuItemCallGL::setVisibleControl(LLString visible_control, LLView *context)  {  	// Register new listener -	if (!enabled_control.empty()) +	if (!visible_control.empty())  	{ -		LLControlBase *control = context->findControl(enabled_control); -		if (control) +		LLControlVariable *control = context->findControl(visible_control); +		if (!control)  		{ -			LLSD state = control->registerListener(this, "VISIBLE"); -			setVisible(state); +			context->addBoolControl(visible_control, getVisible()); +			control = context->findControl(visible_control); +			llassert_always(control);  		} -		else -		{ -			context->addBoolControl(enabled_control, getEnabled()); -			control = context->findControl(enabled_control); -			control->registerListener(this, "VISIBLE"); -		} -	} -} - -// virtual -bool LLMenuItemCallGL::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) -{ -	if (userdata.asString() == "ENABLED" && event->desc() == "value_changed") -	{ -		LLSD state = event->getValue(); -		setEnabled(state); -		return TRUE; +		control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("visible"))); +		setVisible(control->getValue());  	} -	if (userdata.asString() == "VISIBLE" && event->desc() == "value_changed") -	{ -		LLSD state = event->getValue(); -		setVisible(state); -		return TRUE; -	} -	return LLMenuItemGL::handleEvent(event, userdata);  }  // virtual @@ -1000,44 +976,35 @@ LLMenuItemCheckGL::LLMenuItemCheckGL ( const LLString& name,  	setControlName(control_name, context);  } -void LLMenuItemCheckGL::setCheckedControl(LLString checked_control, LLView *context) +//virtual +void LLMenuItemCheckGL::setValue(const LLSD& value)  { -	// Register new listener -	if (!checked_control.empty()) +	mChecked = value.asBoolean(); +	if(mChecked)  	{ -		LLControlBase *control = context->findControl(checked_control); -		if (control) -		{ -			LLSD state = control->registerListener(this, "CHECKED"); -			mChecked = state; -		} -		else -		{ -			context->addBoolControl(checked_control, mChecked); -			control = context->findControl(checked_control); -			control->registerListener(this, "CHECKED"); -		} +		mDrawBoolLabel = BOOLEAN_TRUE_PREFIX; +	} +	else +	{ +		mDrawBoolLabel.clear();  	}  } -// virtual -bool LLMenuItemCheckGL::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) +void LLMenuItemCheckGL::setCheckedControl(LLString checked_control, LLView *context)  { -	if (userdata.asString() == "CHECKED" && event->desc() == "value_changed") +	// Register new listener +	if (!checked_control.empty())  	{ -		LLSD state = event->getValue(); -		mChecked = state; -		if(mChecked) +		LLControlVariable *control = context->findControl(checked_control); +		if (!control)  		{ -			mDrawBoolLabel = BOOLEAN_TRUE_PREFIX; -		} -		else -		{ -			mDrawBoolLabel.clear(); +			context->addBoolControl(checked_control, mChecked); +			control = context->findControl(checked_control); +			llassert_always(control);  		} -		return TRUE; +		control->getSignal()->connect(boost::bind(&LLView::controlListener, _1, getHandle(), std::string("value"))); +		mChecked = control->getValue();  	} -	return LLMenuItemCallGL::handleEvent(event, userdata);  }  // virtual @@ -1946,7 +1913,7 @@ void LLMenuGL::parseChildXML(LLXMLNodePtr child, LLView *parent, LLUICtrlFactory  							{  								continue;  							} -							LLControlBase *control = parent->findControl(control_name); +							LLControlVariable *control = parent->findControl(control_name);  							if (!control)  							{  								parent->addBoolControl(control_name, FALSE); diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index e9b80e562b..33b226fd99 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -225,7 +225,7 @@ private:  // calls a user defined callback.  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -class LLMenuItemCallGL : public LLMenuItemGL +class LLMenuItemCallGL : public LLMenuItemGL, public LLObservable  {  public:  	// normal constructor @@ -291,7 +291,6 @@ public:  	//virtual void draw(); -	virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);  private:  	menu_callback			mCallback; @@ -341,7 +340,7 @@ public:  	void setCheckedControl(LLString checked_control, LLView *context); -	virtual void setValue(const LLSD& value) { mChecked = value.asBoolean(); } +	virtual void setValue(const LLSD& value);  	virtual EWidgetType getWidgetType() const { return WIDGET_TYPE_MENU_ITEM_CHECK; }  	virtual LLString getWidgetTag() const { return LL_MENU_ITEM_CHECK_GL_TAG; } @@ -350,8 +349,6 @@ public:  	// called to rebuild the draw label  	virtual void buildDrawLabel( void ); -	virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata); -  private:  	check_callback mCheckCallback;  	BOOL mChecked; diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index aed7893df7..1e9442805f 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1555,16 +1555,11 @@ void gl_segmented_rect_3d_tex_top(const LLVector2& border_scale, const LLVector3  	gl_segmented_rect_3d_tex(border_scale, border_width, border_height, width_vec, height_vec, ROUNDED_RECT_TOP);  } -class LLShowXUINamesListener: public LLSimpleListener +bool handleShowXUINamesChanged(const LLSD& newvalue)  { -	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) -	{ -		LLUI::sShowXUINames = (BOOL) event->getValue().asBoolean(); -		return true; -	} -}; -static LLShowXUINamesListener show_xui_names_listener; - +	LLUI::sShowXUINames = newvalue.asBoolean(); +	return true; +}  void LLUI::initClass(LLControlGroup* config,   					 LLControlGroup* colors,  @@ -1584,7 +1579,7 @@ void LLUI::initClass(LLControlGroup* config,  	LLFontGL::sShadowColor = colors->getColor("ColorDropShadow");  	LLUI::sShowXUINames = LLUI::sConfigGroup->getBOOL("ShowXUINames"); -	LLUI::sConfigGroup->getControl("ShowXUINames")->addListener(&show_xui_names_listener); +	LLUI::sConfigGroup->getControl("ShowXUINames")->getSignal()->connect(boost::bind(&handleShowXUINamesChanged, _1));  }  void LLUI::cleanupClass() diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 0a37c03ac5..269796e5de 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -2426,16 +2426,7 @@ LLSimpleListener* LLView::getListenerByName(const LLString& callback_name)  	return callback;  } -void LLView::addListenerToControl(LLEventDispatcher *dispatcher, const LLString& name, LLSD filter, LLSD userdata) -{ -	LLSimpleListener* listener = getListenerByName(name); -	if (listener) -	{ -		dispatcher->addListener(listener, filter, userdata); -	} -} - -LLControlBase *LLView::findControl(LLString name) +LLControlVariable *LLView::findControl(LLString name)  {  	control_map_t::iterator itor = mFloaterControls.find(name);  	if (itor != mFloaterControls.end()) @@ -2791,9 +2782,15 @@ LLFontGL::StyleFlags LLView::selectFontStyle(LLXMLNodePtr node)  	return gl_font_style;  } -void LLView::setControlValue(const LLSD& value) +bool LLView::setControlValue(const LLSD& value)  { -	LLUI::sConfigGroup->setValue(getControlName(), value); +	LLString ctrlname = getControlName(); +	if (!ctrlname.empty()) +	{ +		LLUI::sConfigGroup->setValue(ctrlname, value); +		return true; +	} +	return false;  }  //virtual @@ -2804,43 +2801,57 @@ void LLView::setControlName(const LLString& control_name, LLView *context)  		context = this;  	} -	// Unregister from existing listeners  	if (!mControlName.empty())  	{ -		clearDispatchers(); +		llwarns << "setControlName called twice on same control!" << llendl; +		mControlConnection.disconnect(); // disconnect current signal +		mControlName.clear();  	} - +	  	// Register new listener  	if (!control_name.empty())  	{ -		LLControlBase *control = context->findControl(control_name); +		LLControlVariable *control = context->findControl(control_name);  		if (control)  		{  			mControlName = control_name; -			LLSD state = control->registerListener(this, "DEFAULT"); -			setValue(state); +			mControlConnection = control->getSignal()->connect(boost::bind(&controlListener, _1, getHandle(), std::string("value"))); +			setValue(control->getValue());  		}  	}  } -// virtual -bool LLView::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) +// static +bool LLView::controlListener(const LLSD& newvalue, LLHandle<LLView> handle, std::string type)  { -	if (userdata.asString() == "DEFAULT" && event->desc() == "value_changed") +	LLView* view = handle.get(); +	if (view)  	{ -		LLSD state = event->getValue(); -		setValue(state); -		return TRUE; +		if (type == "value") +		{ +			view->setValue(newvalue); +			return true; +		} +		else if (type == "enabled") +		{ +			view->setEnabled(newvalue.asBoolean()); +			return true; +		} +		else if (type == "visible") +		{ +			view->setVisible(newvalue.asBoolean()); +			return true; +		}  	} -	return FALSE; +	return false;  }  void LLView::addBoolControl(LLString name, bool initial_value)  { -	mFloaterControls[name] = new LLControl(name, TYPE_BOOLEAN, initial_value, "Internal floater control"); +	mFloaterControls[name] = new LLControlVariable(name, TYPE_BOOLEAN, initial_value, "Internal floater control");  } -LLControlBase *LLView::getControl(LLString name) +LLControlVariable *LLView::getControl(LLString name)  {  	control_map_t::iterator itor = mFloaterControls.find(name);  	if (itor != mFloaterControls.end()) diff --git a/indra/llui/llview.h b/indra/llui/llview.h index c8556c7edc..24a5eb4f89 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -65,7 +65,6 @@ const BOOL	NOT_MOUSE_OPAQUE = FALSE;  const U32 GL_NAME_UI_RESERVED = 2; -  /*  // virtual functions defined in LLView: @@ -150,7 +149,7 @@ virtual BOOL	handleUnicodeCharHere(llwchar uni_char, BOOL called_from_parent);  		*  */ -class LLView : public LLMouseHandler, public LLMortician, public LLSimpleListenerObservable +class LLView : public LLMouseHandler, public LLMortician  {  public: @@ -294,7 +293,6 @@ public:  	LLHandle<LLView>	getHandle()				{ mHandle.bind(this); return mHandle; } -  	U32			getFollows() const				{ return mReshapeFlags; }  	BOOL		followsLeft() const				{ return mReshapeFlags & FOLLOWS_LEFT; }  	BOOL		followsRight() const			{ return mReshapeFlags & FOLLOWS_RIGHT; } @@ -393,13 +391,13 @@ public:  	void addListenerToControl(LLEventDispatcher *observer, const LLString& name, LLSD filter, LLSD userdata);  	void addBoolControl(LLString name, bool initial_value); -	LLControlBase *getControl(LLString name); -	LLControlBase *findControl(LLString name); +	LLControlVariable *getControl(LLString name); +	LLControlVariable *findControl(LLString name); -	void			setControlValue(const LLSD& value); +	bool setControlValue(const LLSD& value);  	virtual void	setControlName(const LLString& control, LLView *context);  	virtual LLString getControlName() const { return mControlName; } -	virtual bool	handleEvent(LLPointer<LLEvent> event, const LLSD& userdata); +//	virtual bool	handleEvent(LLPointer<LLEvent> event, const LLSD& userdata);  	virtual void	setValue(const LLSD& value);  	virtual LLSD	getValue() const; @@ -494,11 +492,12 @@ protected:  	LLView* childrenHandleRightMouseDown(S32 x, S32 y, MASK mask);  	LLView* childrenHandleRightMouseUp(S32 x, S32 y, MASK mask); -	typedef std::map<LLString, LLControlBase*> control_map_t; +	static bool controlListener(const LLSD& newvalue, LLHandle<LLView> handle, std::string type); + +	typedef std::map<LLString, LLControlVariable*> control_map_t;  	control_map_t mFloaterControls;  	virtual LLView* getChildByName(const LLString& name, BOOL recurse = FALSE) const; -  private:  	LLView*		mParentView;  	child_list_t mChildList; @@ -537,9 +536,8 @@ private:  	dispatch_list_t mDispatchList;  	LLString		mControlName; - - -// Just debugging stuff? We should try to hide anything that's not. -MG +	boost::signals::connection mControlConnection; +	  public:  	static BOOL	sDebugRects;	// Draw debug rects behind everything.  	static BOOL sDebugKeys; diff --git a/indra/llvfs/llvfile.cpp b/indra/llvfs/llvfile.cpp index b25ec4a86e..bd4dfc2d78 100644 --- a/indra/llvfs/llvfile.cpp +++ b/indra/llvfs/llvfile.cpp @@ -45,7 +45,6 @@ const S32 LLVFile::APPEND		= 0x00000006;  // 0x00000004 & LLVFile::WRITE  //----------------------------------------------------------------------------  LLVFSThread* LLVFile::sVFSThread = NULL;  BOOL LLVFile::sAllocdVFSThread = FALSE; -BOOL LLVFile::ALLOW_ASYNC = TRUE;  //----------------------------------------------------------------------------  //============================================================================ diff --git a/indra/llvfs/llvfile.h b/indra/llvfs/llvfile.h index 3d81483308..cd4fc59174 100644 --- a/indra/llvfs/llvfile.h +++ b/indra/llvfs/llvfile.h @@ -78,8 +78,6 @@ public:  	static const S32 WRITE;  	static const S32 READ_WRITE;  	static const S32 APPEND; - -	static BOOL ALLOW_ASYNC;  protected:  	LLAssetType::EType mFileType; diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 4ad44f455f..9de426fc03 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -57,19 +57,9 @@  #endif  //this defines the current version of the settings file -U32	LLControlBase::sMaxControlNameLength = 0; - -//These lists are used to store the ID's of registered event listeners. -std::list<S32>				LLControlBase::mFreeIDs; -std::list<S32>				LLControlBase::mUsedIDs; - -S32							LLControlBase::mTopID; - -std::set<LLControlBase*>	LLControlBase::mChangedControls; -  const S32 CURRENT_VERSION = 101; -BOOL LLControl::llsd_compare(const LLSD& a, const LLSD & b) +BOOL LLControlVariable::llsd_compare(const LLSD& a, const LLSD & b)  {  	switch (mType)  	{ @@ -101,58 +91,154 @@ BOOL LLControl::llsd_compare(const LLSD& a, const LLSD & b)  	return FALSE;  } -LLControlBase::~LLControlBase() +LLControlVariable::LLControlVariable(const LLString& name, eControlType type, +							 LLSD initial, const LLString& comment, +							 BOOL persist) +	: mName(name), +	  mComment(comment), +	  mType(type), +	  mPersist(persist) +{ +	if (mPersist && mComment.empty()) +	{ +		llerrs << "Must supply a comment for control " << mName << llendl; +	} +	//Push back versus setValue'ing here, since we don't want to call a signal yet +	mValues.push_back(initial); +} + + + +LLControlVariable::~LLControlVariable() +{ +} + +void LLControlVariable::setValue(const LLSD& value, bool saved_value)  { +    bool value_changed = llsd_compare(getValue(), value) == FALSE; +	if(saved_value) +	{ +    	// If we're going to save this value, return to default but don't fire +		resetToDefault(false); +	    if (llsd_compare(mValues.back(), value) == FALSE) +	    { +		    mValues.push_back(value); +	    } +	} +    else +    { +        // This is a unsaved value. Its needs to reside at +        // mValues[2] (or greater). It must not affect  +        // the result of getSaveValue() +	    if (llsd_compare(mValues.back(), value) == FALSE) +	    { +            while(mValues.size() > 2) +            { +                // Remove any unsaved values. +                mValues.pop_back(); +            } + +            if(mValues.size() < 2) +            { +                // Add the default to the 'save' value. +                mValues.push_back(mValues[0]); +            } + +            // Add the 'un-save' value. +            mValues.push_back(value); +	    } +    } + +    if(value_changed) +    { +        mSignal(value);  +    }  } -// virtual -void LLControlBase::resetToDefault() +void LLControlVariable::resetToDefault(bool fire_signal)  { +	//The first setting is always the default +	//Pop to it and fire off the listener +	while(mValues.size() > 1) mValues.pop_back(); +	if(fire_signal) firePropertyChanged(); +} + +bool LLControlVariable::isSaveValueDefault() +{  +    return (mValues.size() ==  1)  +        || ((mValues.size() > 1) && llsd_compare(mValues[1], mValues[0]));  } -LLControlGroup::LLControlGroup():	mNameTable() +LLSD LLControlVariable::getSaveValue() const  { -	//mFreeStringOffset = 0; +	//The first level of the stack is default +	//We assume that the second level is user preferences that should be saved +	if(mValues.size() > 1) return mValues[1]; +	return mValues[0];  } -LLControlGroup::~LLControlGroup() +LLControlVariable*	LLControlGroup::getControl(const LLString& name) +{ +	ctrl_name_table_t::iterator iter = mNameTable.find(name); +	return iter == mNameTable.end() ? NULL : iter->second; +} + + +//////////////////////////////////////////////////////////////////////////// + +LLControlGroup::LLControlGroup()  { +	mTypeString[TYPE_U32] = "U32"; +	mTypeString[TYPE_S32] = "S32"; +	mTypeString[TYPE_F32] = "F32"; +	mTypeString[TYPE_BOOLEAN] = "Boolean"; +	mTypeString[TYPE_STRING] = "String"; +	mTypeString[TYPE_VEC3] = "Vector3"; +    mTypeString[TYPE_VEC3D] = "Vector3D"; +	mTypeString[TYPE_RECT] = "Rect"; +	mTypeString[TYPE_COL4] = "Color4"; +	mTypeString[TYPE_COL3] = "Color3"; +	mTypeString[TYPE_COL4U] = "Color4u"; +	mTypeString[TYPE_LLSD] = "LLSD";  } -LLSD LLControlBase::registerListener(LLSimpleListenerObservable *listener, LLSD userdata) +LLControlGroup::~LLControlGroup()  { -	// Symmetric listener relationship -	addListener(listener, "", userdata); -	listener->addListener(this, "", userdata); -	return getValue(); +	cleanup();  }  void LLControlGroup::cleanup()  { +	for_each(mNameTable.begin(), mNameTable.end(), DeletePairedPointer());  	mNameTable.clear();  } -LLControlBase*	LLControlGroup::getControl(const LLString& name) +eControlType LLControlGroup::typeStringToEnum(const LLString& typestr)  { -	ctrl_name_table_t::iterator iter = mNameTable.find(name); -	return iter == mNameTable.end() ? NULL : (LLControlBase*)iter->second; +	for(int i = 0; i < (int)TYPE_COUNT; ++i) +	{ +		if(mTypeString[i] == typestr) return (eControlType)i; +	} +	return (eControlType)-1; +} + +LLString LLControlGroup::typeEnumToString(eControlType typeenum) +{ +	return mTypeString[typeenum];  }  BOOL LLControlGroup::declareControl(const LLString& name, eControlType type, const LLSD initial_val, const LLString& comment, BOOL persist)  { -	if(!mNameTable[name]) -	{ -		// if not, create the control and add it to the name table -		LLControl* control = new LLControl(name, type, initial_val, comment, persist); -		mNameTable[name] = control; -		return TRUE; -	} -	else +	if(mNameTable.find(name) != mNameTable.end())  	{  		llwarns << "LLControlGroup::declareControl: Control named " << name << " already exists." << llendl; -		mNameTable.erase(name); -		return FALSE; +		mNameTable[name]->setValue(initial_val); +		return TRUE;  	} +	// if not, create the control and add it to the name table +	LLControlVariable* control = new LLControlVariable(name, type, initial_val, comment, persist); +	mNameTable[name] = control;	 +	return TRUE;  }  BOOL LLControlGroup::declareU32(const LLString& name, const U32 initial_val, const LLString& comment, BOOL persist) @@ -210,19 +296,14 @@ BOOL LLControlGroup::declareColor3(const LLString& name, const LLColor3 &initial  	return declareControl(name, TYPE_COL3, initial_val.getValue(), comment, persist);  } -LLSD LLControlGroup::registerListener(const LLString& name, LLSimpleListenerObservable *listener) +BOOL LLControlGroup::declareLLSD(const LLString& name, const LLSD &initial_val, const LLString& comment, BOOL persist )  { -	LLControlBase *control = getControl(name); -	if (control) -	{ -		return control->registerListener(listener); -	} -	return LLSD(); +	return declareControl(name, TYPE_LLSD, initial_val, comment, persist);  }  BOOL LLControlGroup::getBOOL(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_BOOLEAN))  		return control->get().asBoolean(); @@ -235,7 +316,7 @@ BOOL LLControlGroup::getBOOL(const LLString& name)  S32 LLControlGroup::getS32(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_S32))  		return control->get().asInteger(); @@ -248,7 +329,7 @@ S32 LLControlGroup::getS32(const LLString& name)  U32 LLControlGroup::getU32(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_U32))		  		return control->get().asInteger(); @@ -261,7 +342,7 @@ U32 LLControlGroup::getU32(const LLString& name)  F32 LLControlGroup::getF32(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_F32))  		return (F32) control->get().asReal(); @@ -274,7 +355,7 @@ F32 LLControlGroup::getF32(const LLString& name)  LLString LLControlGroup::findString(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_STRING))  		return control->get().asString(); @@ -283,7 +364,7 @@ LLString LLControlGroup::findString(const LLString& name)  LLString LLControlGroup::getString(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_STRING))  		return control->get().asString(); @@ -309,7 +390,7 @@ LLString LLControlGroup::getText(const LLString& name)  LLVector3 LLControlGroup::getVector3(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_VEC3))  		return control->get(); @@ -322,7 +403,7 @@ LLVector3 LLControlGroup::getVector3(const LLString& name)  LLVector3d LLControlGroup::getVector3d(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_VEC3D))  		return control->get(); @@ -335,7 +416,7 @@ LLVector3d LLControlGroup::getVector3d(const LLString& name)  LLRect LLControlGroup::getRect(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_RECT))  		return control->get(); @@ -353,7 +434,7 @@ LLColor4 LLControlGroup::getColor(const LLString& name)  	if (i != mNameTable.end())  	{ -		LLControlBase* control = i->second; +		LLControlVariable* control = i->second;  		switch(control->mType)  		{ @@ -381,7 +462,7 @@ LLColor4 LLControlGroup::getColor(const LLString& name)  LLColor4U LLControlGroup::getColor4U(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_COL4U))  		return control->get(); @@ -394,7 +475,7 @@ LLColor4U LLControlGroup::getColor4U(const LLString& name)  LLColor4 LLControlGroup::getColor4(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_COL4))  		return control->get(); @@ -407,7 +488,7 @@ LLColor4 LLControlGroup::getColor4(const LLString& name)  LLColor3 LLControlGroup::getColor3(const LLString& name)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_COL3))  		return control->get(); @@ -418,6 +499,16 @@ LLColor3 LLControlGroup::getColor3(const LLString& name)  	}  } +LLSD LLControlGroup::getLLSD(const LLString& name) +{ +	LLControlVariable* control = getControl(name); +	 +	if (control && control->isType(TYPE_LLSD)) +		return control->getValue(); +	CONTROL_ERRS << "Invalid LLSD control " << name << llendl; +	return LLSD(); +} +  BOOL LLControlGroup::controlExists(const LLString& name)  {  	ctrl_name_table_t::iterator iter = mNameTable.find(name); @@ -430,7 +521,7 @@ BOOL LLControlGroup::controlExists(const LLString& name)  void LLControlGroup::setBOOL(const LLString& name, BOOL val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_BOOLEAN))  	{ @@ -445,7 +536,7 @@ void LLControlGroup::setBOOL(const LLString& name, BOOL val)  void LLControlGroup::setS32(const LLString& name, S32 val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_S32))  	{ @@ -460,7 +551,7 @@ void LLControlGroup::setS32(const LLString& name, S32 val)  void LLControlGroup::setF32(const LLString& name, F32 val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_F32))  	{ @@ -475,7 +566,7 @@ void LLControlGroup::setF32(const LLString& name, F32 val)  void LLControlGroup::setU32(const LLString& name, U32 val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_U32))  	{ @@ -490,7 +581,7 @@ void LLControlGroup::setU32(const LLString& name, U32 val)  void LLControlGroup::setString(const LLString& name, const LLString &val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_STRING))  	{ @@ -505,7 +596,7 @@ void LLControlGroup::setString(const LLString& name, const LLString &val)  void LLControlGroup::setVector3(const LLString& name, const LLVector3 &val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_VEC3))  	{ @@ -519,7 +610,7 @@ void LLControlGroup::setVector3(const LLString& name, const LLVector3 &val)  void LLControlGroup::setVector3d(const LLString& name, const LLVector3d &val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_VEC3D))  	{ @@ -533,7 +624,7 @@ void LLControlGroup::setVector3d(const LLString& name, const LLVector3d &val)  void LLControlGroup::setRect(const LLString& name, const LLRect &val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_RECT))  	{ @@ -547,7 +638,7 @@ void LLControlGroup::setRect(const LLString& name, const LLRect &val)  void LLControlGroup::setColor4U(const LLString& name, const LLColor4U &val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_COL4U))  	{ @@ -561,7 +652,7 @@ void LLControlGroup::setColor4U(const LLString& name, const LLColor4U &val)  void LLControlGroup::setColor4(const LLString& name, const LLColor4 &val)  { -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control && control->isType(TYPE_COL4))  	{ @@ -573,6 +664,20 @@ void LLControlGroup::setColor4(const LLString& name, const LLColor4 &val)  	}  } +void LLControlGroup::setLLSD(const LLString& name, const LLSD& val) +{ +	LLControlVariable* control = getControl(name); +	 +	if (control && control->isType(TYPE_LLSD)) +	{ +		setValue(name, val); +	} +	else +	{ +		CONTROL_ERRS << "Invalid LLSD control " << name << llendl; +	} +} +  void LLControlGroup::setValue(const LLString& name, const LLSD& val)  {  	if (name.empty()) @@ -580,7 +685,7 @@ void LLControlGroup::setValue(const LLString& name, const LLSD& val)  		return;  	} -	LLControlBase* control = getControl(name); +	LLControlVariable* control = getControl(name);  	if (control)  	{ @@ -596,238 +701,8 @@ void LLControlGroup::setValue(const LLString& name, const LLSD& val)  // Load and save  //--------------------------------------------------------------- -U32 LLControlGroup::loadFromFileLegacy(const LLString& filename, BOOL require_declaration, eControlType declare_as) -{ -	U32		item = 0; -	U32		validitems = 0; -	llifstream file; -	S32 version; -	 -	file.open(filename.c_str());		/*Flawfinder: ignore*/  - -	if (!file) -	{ -		llinfos << "LLControlGroup::loadFromFile unable to open." << llendl; -		return 0; -	} - -	// Check file version -	LLString name; -	file >> name; -	file >> version; -	if (name != "version" || version != CURRENT_VERSION) -	{ -		llinfos << filename << " does not appear to be a version " << CURRENT_VERSION << " controls file" << llendl; -		return 0; -	} - -	while (!file.eof()) -	{ -		file >> name; -		 -		if (name.empty()) -		{ -			continue; -		} - -		if (name.substr(0,2) == "//") -		{ -			// This is a comment. -			char buffer[MAX_STRING];		/*Flawfinder: ignore*/ -			file.getline(buffer, MAX_STRING); -			continue; -		} - -		BOOL declared = mNameTable.find(name) != mNameTable.end(); - -		if (require_declaration && !declared) -		{ -			// Declaration required, but this name not declared. -			// Complain about non-empty names. -			if (!name.empty()) -			{ -				//read in to end of line -				char buffer[MAX_STRING];		/*Flawfinder: ignore*/ -				file.getline(buffer, MAX_STRING); -				llwarns << "LLControlGroup::loadFromFile() : Trying to set \"" << name << "\", setting doesn't exist." << llendl; -			} -			continue; -		} - -		// Got an item.  Load it up. -		item++; - -		// If not declared, assume it's a string -		if (!declared) -		{ -			switch(declare_as) -			{ -			case TYPE_COL4: -				declareColor4(name, LLColor4::white, LLString::null, NO_PERSIST); -				break; -			case TYPE_COL4U: -				declareColor4U(name, LLColor4U::white, LLString::null, NO_PERSIST); -				break; -			case TYPE_STRING: -			default: -				declareString(name, LLString::null, LLString::null, NO_PERSIST); -				break; -			} -		} - -		// Control name has been declared in code. -		LLControlBase *control = getControl(name); - -		llassert(control); - -		mLoadedSettings.insert(name); -		 -		switch(control->mType) -		{ -		case TYPE_F32: -			{ -				F32 initial; - -				file >> initial; - -				control->set(initial); -				validitems++; -			} -			break; -		case TYPE_S32: -			{ -				S32 initial; - -				file >> initial; - -				control->set(initial); -				validitems++; -			} -			break; -		case TYPE_U32: -			{ -				U32 initial; - -				file >> initial; -				control->set((LLSD::Integer) initial); -				validitems++; -			} -			break; -		case TYPE_BOOLEAN: -			{ -				char boolstring[256];		/*Flawfinder: ignore*/ -				BOOL valid = FALSE; -				BOOL initial = FALSE; - -				file >> boolstring; -				if (!strcmp("TRUE", boolstring)) -				{ -					initial = TRUE; -					valid = TRUE; -				} -				else if (!strcmp("FALSE", boolstring)) -				{ -					initial = FALSE; -					valid = TRUE; -				} - -				if (valid) -				{ -					control->set(initial); -				} -				else -				{ -					llinfos << filename << "Item " << item << ": Invalid BOOL control " << name << ", " << boolstring << llendl;  -				} - -				validitems++; -			} -			break; -		case TYPE_STRING: -			{ -				LLString string; -				 -				file >> string; -				 -				control->set(string); -				validitems++; -			} -			break; -		case TYPE_VEC3: -			{ -				F32 x, y, z; - -				file >> x >> y >> z; - -				LLVector3 vector(x, y, z); - -				control->set(vector.getValue()); -				validitems++; -			} -			break; -		case TYPE_VEC3D: -			{ -				F64 x, y, z; - -				file >> x >> y >> z; - -				LLVector3d vector(x, y, z); - -				control->set(vector.getValue()); -				validitems++; -			} -			break; -		case TYPE_RECT: -			{ -				S32 left, bottom, width, height; - -				file >> left >> bottom >> width >> height; - -				LLRect rect; -				rect.setOriginAndSize(left, bottom, width, height); - -				control->set(rect.getValue()); -				validitems++; -			} -			break; -		case TYPE_COL4U: -			{ -				S32 red, green, blue, alpha; -				LLColor4U color; -				file >> red >> green >> blue >> alpha; -				color.setVec(red, green, blue, alpha); -				control->set(color.getValue()); -				validitems++; -			} -			break; -		case TYPE_COL4: -			{ -				LLColor4 color; -				file >> color.mV[VRED] >> color.mV[VGREEN] -					 >> color.mV[VBLUE] >> color.mV[VALPHA]; -				control->set(color.getValue()); -				validitems++; -			} -			break; -		case TYPE_COL3: -			{ -				LLColor3 color; -				file >> color.mV[VRED] >> color.mV[VGREEN] -					 >> color.mV[VBLUE]; -				control->set(color.getValue()); -				validitems++; -			} -			break; -		} -	} - -	file.close(); - -	return validitems; -} -  // Returns number of controls loaded, so 0 if failure -U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declaration, eControlType declare_as) +U32 LLControlGroup::loadFromFileLegacy(const LLString& filename, BOOL require_declaration, eControlType declare_as)  {  	LLString name; @@ -901,11 +776,9 @@ U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declarat  		}  		// Control name has been declared in code. -		LLControlBase *control = getControl(name); +		LLControlVariable *control = getControl(name);  		llassert(control); - -		mLoadedSettings.insert(name);  		switch(control->mType)  		{ @@ -1019,59 +892,43 @@ U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declarat  				LLVector3 color;  				child_nodep->getAttributeVector3("value", color); -                control->set(LLColor3(color.mV).getValue()); +				control->set(LLColor3(color.mV).getValue());  				validitems++;  			}  			break; -		} +		default: +		  break; + +		} +	  		child_nodep = rootp->getNextChild();  	}  	return validitems;  } -struct compare_controls -{ -	bool operator() (const LLControlBase* const a, const LLControlBase* const b) const -	{ -		return a->getName() < b->getName(); -	} -}; -  U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)  { -	const char ENDL = '\n'; - -	llinfos << "Saving settings to file: " << filename << llendl; - -	// place the objects in a temporary container that enforces a sort -	// order to ease manual editing of the file - -	typedef std::set< LLControlBase*, compare_controls > control_list_t; -	control_list_t controls; - +	LLSD settings; +	int num_saved = 0;  	for (ctrl_name_table_t::iterator iter = mNameTable.begin();  		 iter != mNameTable.end(); iter++)  	{ -		LLString name = iter->first; -		if (name.empty()) -		{ -			CONTROL_ERRS << "Control with no name found!!!" << llendl; -			break; -		} - -		LLControlBase* control = (LLControlBase *)iter->second; +		LLControlVariable* control = iter->second;  		if (!control)  		{ -			llwarns << "Tried to save invalid control: " << name << llendl; +			llwarns << "Tried to save invalid control: " << iter->first << llendl;  		} -		if( control && control->mPersist ) +		if( control && control->isPersisted() )  		{ -			if (!(nondefault_only && (control->mIsDefault))) +			if (!(nondefault_only && (control->isSaveValueDefault())))  			{ -				controls.insert( control ); +				settings[iter->first]["Type"] = typeEnumToString(control->type()); +				settings[iter->first]["Comment"] = control->getComment(); +				settings[iter->first]["Value"] = control->getSaveValue(); +				++num_saved;  			}  			else  			{ @@ -1080,156 +937,58 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)  			}  		}  	} -  	llofstream file; -	file.open(filename.c_str());		/*Flawfinder: ignore*/ - -	if (!file.is_open()) +	file.open(filename.c_str()); +	if (file.is_open())  	{ -		// This is a warning because sometime we want to use settings files which can't be written... -		llwarns << "LLControlGroup::saveToFile unable to open file for writing" << llendl; -		return 0; +		LLSDSerialize::toPrettyXML(settings, file); +		file.close(); +		llinfos << "Saved to " << filename << llendl;  	} - -	// Write file version -	file << "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n"; -	file << "<settings version = \"" << CURRENT_VERSION << "\">\n"; -	for (control_list_t::iterator iter = controls.begin(); -		 iter != controls.end(); ++iter) +	else  	{ -		LLControlBase* control = *iter; -		file << "\t<!--" << control->comment() << "-->" << ENDL; -		LLString name = control->getName(); -		switch (control->type()) -		{ -			case TYPE_U32: -			{ -				file << "\t<" << name << " value=\"" << (U32) control->get().asInteger() << "\"/>\n"; -				break; -			} -			case TYPE_S32: -			{ -				file << "\t<" << name << " value=\"" << (S32) control->get().asInteger() << "\"/>\n"; -				break; -			} -			case TYPE_F32: -			{ -				file << "\t<" << name << " value=\"" << (F32) control->get().asReal() << "\"/>\n"; -				break; -			} -			case TYPE_VEC3: -			{ -				LLVector3 vector(control->get()); -				file << "\t<" << name << " value=\"" << vector.mV[VX] << " " << vector.mV[VY] << " " << vector.mV[VZ] << "\"/>\n"; -				break; -			} -			case TYPE_VEC3D: -			{ -				LLVector3d vector(control->get()); -				file << "\t<" << name << " value=\"" << vector.mdV[VX] << " " << vector.mdV[VY] << " " << vector.mdV[VZ] << "\"/>\n"; -				break; -			} -			case TYPE_RECT: -			{ -				LLRect rect(control->get()); -				file << "\t<" << name << " value=\"" << rect.mLeft << " " << rect.mBottom << " " << rect.getWidth() << " " << rect.getHeight() << "\"/>\n"; -				break; -			} -			case TYPE_COL4: -			{ -				LLColor4 color(control->get()); -				file << "\t<" << name << " value=\"" << color.mV[VRED] << ", " << color.mV[VGREEN] << ", " << color.mV[VBLUE] << ", " << color.mV[VALPHA] << "\"/>\n"; -				break; -			} -			case TYPE_COL3: -			{ -				LLColor3 color(control->get()); -				file << "\t<" << name << " value=\"" << color.mV[VRED] << ", " << color.mV[VGREEN] << ", " << color.mV[VBLUE] << "\"/>\n"; -				break; -			} -			case TYPE_BOOLEAN: -			{ -				file << "\t<" << name << " value=\"" << (control->get().asBoolean() ? "TRUE" : "FALSE") << "\"/>\n";			 -				break; -			} -			case TYPE_STRING: -			{ -				file << "\t<" << name << " value=\"" << LLSDXMLFormatter::escapeString(control->get().asString()) << "\"/>\n"; -				break; -			} -			default: -			{ -				CONTROL_ERRS << "LLControlGroup::saveToFile - unknown control type!" << llendl; -				break; -			} -		} - -		// Debug spam -		// llinfos << name << " " << control->getValue().asString() << llendl; -	}// next - -	file << "</settings>\n"; -	file.close(); - -	return controls.size(); +        // This is a warning because sometime we want to use settings files which can't be written... +		llwarns << "Unable to open settings file: " << filename << llendl; +		return 0; +	} +	return num_saved;  } -void LLControlGroup::applyOverrides(const std::map<std::string, std::string>& overrides) +U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declaration, eControlType declare_as)  { -	for (std::map<std::string, std::string>::const_iterator iter = overrides.begin(); -		 iter != overrides.end(); ++iter) +	LLString name; +	LLSD settings; +	LLSD control_map; +	llifstream infile; +	infile.open(filename.c_str()); +	if(!infile.is_open())  	{ -		const std::string& command = iter->first; -		const std::string& value = iter->second; -		LLControlBase* control = (LLControlBase *)mNameTable[command]; -		if (control) -		{ -			switch(control->mType) -			{ -			case TYPE_U32: -				control->set((LLSD::Integer)atof(value.c_str())); -				break; -			case TYPE_S32: -				control->set((S32)atof(value.c_str())); -				break; -			case TYPE_F32: -				control->set((F32)atof(value.c_str())); -				break; -			case TYPE_BOOLEAN: -			  	if (!LLString::compareInsensitive(value.c_str(), "TRUE")) -				{ -					control->set(TRUE); -				}  -				else if (!LLString::compareInsensitive(value.c_str(), "FALSE")) -				{ -					control->set(FALSE); -				} -				else -				{ -					control->set((BOOL)atof(value.c_str())); -				} -				break; -			case TYPE_STRING: -				control->set(value); -				break; -//			// *FIX: implement this given time and need. -//			case TYPE_UUID: -//				break; -			// we don't support command line overrides of vec3 or col4 -			// yet - requires parsing of multiple values -			case TYPE_VEC3: -			case TYPE_VEC3D: -			case TYPE_COL4: -			case TYPE_COL3: -			default: -				break; -			} -		} -		else -		{ -			llinfos << "There is no control variable " << command << llendl; -		} +		llwarns << "Cannot find file " << filename << " to load." << llendl; +		return 0; +	} +	S32 ret = LLSDSerialize::fromXML(settings, infile); +	if (ret <= 0) +	{ +		infile.close(); +		llwarns << "Unable to open LLSD control file " << filename << ". Trying Legacy Method." << llendl;		 +		return loadFromFileLegacy(filename, require_declaration, declare_as); +	} + +	U32		validitems = 0; +	int persist = 1; +	for(LLSD::map_const_iterator itr = settings.beginMap(); itr != settings.endMap(); ++itr) +	{ +		name = (*itr).first; +		control_map = (*itr).second; +		 +		if(control_map.has("Persist")) persist = control_map["Persist"].asInteger(); +		 +		declareControl(name, typeStringToEnum(control_map["Type"].asString()), control_map["Value"], control_map["Comment"].asString(), persist); +		 +		++validitems;  	} + +	return validitems;  }  void LLControlGroup::resetToDefaults() @@ -1239,11 +998,20 @@ void LLControlGroup::resetToDefaults()  		control_iter != mNameTable.end();  		++control_iter)  	{ -		LLControlBase* control = (*control_iter).second; +		LLControlVariable* control = (*control_iter).second;  		control->resetToDefault();  	}  } +void LLControlGroup::applyToAll(ApplyFunctor* func) +{ +	for (ctrl_name_table_t::iterator iter = mNameTable.begin(); +		 iter != mNameTable.end(); iter++) +	{ +		func->apply(iter->first, iter->second); +	} +} +  //============================================================================  // First-use @@ -1264,7 +1032,7 @@ static LLString get_warn_name(const LLString& name)  void LLControlGroup::addWarning(const LLString& name)  {  	LLString warnname = get_warn_name(name); -	if(!mNameTable[warnname]) +	if(mNameTable.find(warnname) == mNameTable.end())  	{  		LLString comment = LLString("Enables ") + name + LLString(" warning dialog");  		declareBOOL(warnname, TRUE, comment); @@ -1293,91 +1061,6 @@ void LLControlGroup::resetWarnings()  	}  } - - -//============================================================================= -// Listener ID generator/management - -void	LLControlBase::releaseListenerID(S32	id) -{	 -	mFreeIDs.push_back(id); -} - -S32	LLControlBase::allocateListenerID() -{	 -	if(mFreeIDs.size() == 0) -	{	//Out of IDs so generate some new ones. -		for(int t=0;t<32;t++) -		{ -			mFreeIDs.push_back(mTopID++); -		} -	} -	S32	rtn = mFreeIDs.front(); -	mFreeIDs.pop_front(); -	mUsedIDs.push_back(rtn); -	return rtn; -} - -bool LLControlBase::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) -{ -	if (event->desc() == "value_changed") -	{ -		setValue(((LLValueChangedEvent*)(LLEvent*)event)->mValue); -		return TRUE; -	} -	return TRUE; -} - -void LLControlBase::firePropertyChanged() -{ -	LLValueChangedEvent *evt = new LLValueChangedEvent(this, getValue()); -	fireEvent(evt, ""); -} - -//============================================================================ -// Used to add a listener callback that will be called on the frame that the controls value changes - -S32 LLControl::addListener(LLControl::tListenerCallback* cbfn) -{ -	S32	id = allocateListenerID(); -	mListeners.push_back(cbfn); -	mListenerIDs.push_back( id ); -	return id; -} - -void LLControl::updateListeners() { -	LLControl::tPropertyChangedListIter iter = mChangeEvents.begin(); -	while(iter!=mChangeEvents.end()){ -		LLControl::tPropertyChangedEvent&	evt = *iter; -		(*evt.mCBFN)(evt.mNewValue,evt.mID,*this); -		iter++; -	} -	mChangeEvents.clear(); -} - -//static -void	LLControlBase::updateAllListeners() -{ -	std::set< LLControlBase* >::iterator iter = mChangedControls.begin(); -	while(iter != mChangedControls.end()){ -		(*iter)->updateListeners(); -		iter++; -	} -	mChangedControls.clear(); -} - -LLControl::LLControl( -	const LLString& name, -	eControlType type, -	LLSD initial, -	const LLString& comment, -	BOOL persist) : -	LLControlBase(name, type, comment, persist), -	mCurrent(initial), -	mDefault(initial) -{ -} -  //============================================================================  #ifdef TEST_HARNESS @@ -1393,17 +1076,17 @@ void main()  	llinfos << "Loaded " << count << " controls" << llendl;  	// test insertion -	foo = new LLControl<F32>("gFoo", 5.f, 1.f, 20.f); +	foo = new LLControlVariable<F32>("gFoo", 5.f, 1.f, 20.f);  	gGlobals.addEntry("gFoo", foo); -	bar = new LLControl<S32>("gBar", 10, 2, 22); +	bar = new LLControlVariable<S32>("gBar", 10, 2, 22);  	gGlobals.addEntry("gBar", bar); -	baz = new LLControl<BOOL>("gBaz", FALSE); +	baz = new LLControlVariable<BOOL>("gBaz", FALSE);  	gGlobals.addEntry("gBaz", baz);  	// test retrieval -	getfoo = (LLControl<F32>*) gGlobals.resolveName("gFoo"); +	getfoo = (LLControlVariable<F32>*) gGlobals.resolveName("gFoo");  	getfoo->dump();  	getbar = (S32_CONTROL) gGlobals.resolveName("gBar"); @@ -1416,10 +1099,10 @@ void main()  	// Failure modes  	// ...min > max -	// badfoo = new LLControl<F32>("gFoo2", 100.f, 20.f, 5.f); +	// badfoo = new LLControlVariable<F32>("gFoo2", 100.f, 20.f, 5.f);  	// ...initial > max -	// badbar = new LLControl<S32>("gBar2", 10, 20, 100000); +	// badbar = new LLControlVariable<S32>("gBar2", 10, 20, 100000);  	// ...misspelled name  	// getfoo = (F32_CONTROL) gGlobals.resolveName("fooMisspelled"); @@ -1441,3 +1124,4 @@ void main()  }  #endif + diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index a1a2a4c851..7a638a7b73 100644 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -38,6 +38,26 @@  #include "llstring.h"  #include "llrect.h" +#include <vector> + +// *NOTE: boost::visit_each<> generates warning 4675 on .net 2003 +// Disable the warning for the boost includes. +#if LL_WINDOWS +# if (_MSC_VER >= 1300 && _MSC_VER < 1400) +#   pragma warning(push) +#   pragma warning( disable : 4675 ) +# endif +#endif + +#include <boost/bind.hpp> +#include <boost/signal.hpp> + +#if LL_WINDOWS +# if (_MSC_VER >= 1300 && _MSC_VER < 1400) +#   pragma warning(pop) +# endif +#endif +  class LLVector3;  class LLVector3d;  class LLColor4; @@ -48,7 +68,7 @@ const BOOL NO_PERSIST = FALSE;  typedef enum e_control_type  { -	TYPE_U32, +	TYPE_U32 = 0,  	TYPE_S32,  	TYPE_F32,  	TYPE_BOOLEAN, @@ -58,159 +78,82 @@ typedef enum e_control_type  	TYPE_RECT,  	TYPE_COL4,  	TYPE_COL3, -	TYPE_COL4U +	TYPE_COL4U, +	TYPE_LLSD, +	TYPE_COUNT  } eControlType; -class LLControlBase : public LLSimpleListenerObservable +class LLControlVariable  { -friend class LLControlGroup; -protected: +	friend class LLControlGroup; +	typedef boost::signal<void(const LLSD&)> signal_t; + +private:  	LLString		mName;  	LLString		mComment;  	eControlType	mType; -	BOOL			mHasRange;  	BOOL			mPersist; -	BOOL            mIsDefault; - -	static	std::set<LLControlBase*>	mChangedControls; -	static	std::list<S32>				mFreeIDs;//These lists are used to store the ID's of registered event listeners. -	static	std::list<S32>				mUsedIDs; -	static	S32							mTopID;//This is the index of the highest ID event listener ID. When the free pool is exhausted, new IDs are allocated from here. - +	std::vector<LLSD> mValues; +	 +	signal_t mSignal; +	  public: -	static	void						releaseListenerID(S32	id); -	static	S32							allocateListenerID(); -	static	void						updateAllListeners(); -	virtual void updateListeners() = 0; - -	LLControlBase(const LLString& name, eControlType type, const LLString& comment, BOOL persist) -		: mName(name), -		mComment(comment), -		mType(type), -		mHasRange(FALSE), -		mPersist(persist), -		mIsDefault(TRUE) -	{  -		if (mPersist && mComment.empty()) -		{ -			llerrs << "Must supply a comment for control " << mName << llendl; -		} -		sMaxControlNameLength = llmax((U32)mName.size(), sMaxControlNameLength); -	} - -	virtual ~LLControlBase(); +	LLControlVariable(const LLString& name, eControlType type, +					  LLSD initial, const LLString& comment, +					  BOOL persist = TRUE); +	virtual ~LLControlVariable(); +	  	const LLString& getName() const { return mName; }  	const LLString& getComment() const { return mComment; }  	eControlType type()		{ return mType; } -	BOOL	isType(eControlType tp) { return tp == mType; } - -	// Defaults to no-op -	virtual void resetToDefault(); - -	LLSD registerListener(LLSimpleListenerObservable *listener, LLSD userdata = ""); - -	virtual LLSD get() const = 0; -	virtual LLSD getValue() const = 0; -	virtual void setValue(LLSD value) = 0; -	virtual void set(LLSD value) = 0; - -	// From LLSimpleListener -	virtual bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata); - -	void firePropertyChanged(); - -	static U32	sMaxControlNameLength; - -protected: -	const char* name()			{ return mName.c_str(); } -	const char* comment()		{ return mComment.c_str(); } -}; - -class LLControl -: public LLControlBase -{ -friend class LLControlGroup; -protected: -	LLSD mCurrent; -	LLSD mDefault; - -public:	 - -	typedef void	tListenerCallback(const LLSD&	newValue,S32	listenerID, LLControl& control); -	typedef struct{ -		S32					mID; -		LLSD			mNewValue; -		tListenerCallback*	mCBFN; -	}tPropertyChangedEvent; - -	typedef std::list<tPropertyChangedEvent>::iterator tPropertyChangedListIter; -	std::list<tPropertyChangedEvent>	mChangeEvents; -	std::list< tListenerCallback* >		mListeners; -	std::list< S32 >					mListenerIDs; - -	virtual void						updateListeners(); -	S32									addListener(tListenerCallback*	cbfn); -	 -	LLControl( -		const LLString& name, -		eControlType type, -		LLSD initial, const -		LLString& comment, -		BOOL persist = TRUE); - -	void set(LLSD val)			{ setValue(val); } -	LLSD get()			const	{ return getValue(); }  -	LLSD getdefault()	const	{ return mDefault; } -	LLSD getValue()		const	{ return mCurrent; } -	BOOL llsd_compare(const LLSD& a, const LLSD& b); - -	void setValue(LLSD value)			 -	{  -		if (llsd_compare(mCurrent, value) == FALSE) -		{ -			mCurrent = value;  -			mIsDefault = llsd_compare(mCurrent, mDefault);  -			firePropertyChanged();  -		} -	} - -	/*virtual*/ void resetToDefault()  -	{  -		setValue(mDefault); -	} - -	virtual	~LLControl() +	BOOL isType(eControlType tp) { return tp == mType; } + +	void resetToDefault(bool fire_signal = TRUE); + +	signal_t* getSignal() { return &mSignal; } + +	bool isDefault() { return (mValues.size() == 1); } +	bool isSaveValueDefault(); +	bool isPersisted() { return mPersist; } +	void set(const LLSD& val)	{ setValue(val); } +	LLSD get()			const	{ return getValue(); } +	LLSD getDefault()	const	{ return mValues.front(); } +	LLSD getValue()		const	{ return mValues.back(); } +	LLSD getSaveValue() const; +	void setValue(const LLSD& value, bool saved_value = TRUE); +	void firePropertyChanged()  	{ -		//Remove and deregister all listeners.. -		while(mListenerIDs.size()) -		{ -			S32	id = mListenerIDs.front(); -			mListenerIDs.pop_front(); -			releaseListenerID(id); -		} +		mSignal(mValues.back());  	} +	BOOL llsd_compare(const LLSD& a, const LLSD& b);  };  //const U32 STRING_CACHE_SIZE = 10000;  class LLControlGroup  { -public: -	typedef std::map<LLString, LLPointer<LLControlBase> > ctrl_name_table_t; +protected: +	typedef std::map<LLString, LLControlVariable* > ctrl_name_table_t;  	ctrl_name_table_t mNameTable;  	std::set<LLString> mWarnings; -	std::set<LLString> mLoadedSettings;	// Filled in with names loaded from settings.xml +	LLString mTypeString[TYPE_COUNT]; +	eControlType typeStringToEnum(const LLString& typestr); +	LLString typeEnumToString(eControlType typeenum);	  public:  	LLControlGroup();  	~LLControlGroup();  	void cleanup(); -	bool hasLoaded(const LLString& name) { return mLoadedSettings.find(name) != mLoadedSettings.end(); } -	void clearLoaded() { mLoadedSettings.clear(); } // Call once we've done any settings tweaks which may need this data -	LLControlBase*	getControl(const LLString& name); -	LLSD registerListener(const LLString& name, LLSimpleListenerObservable *listener); +	LLControlVariable*	getControl(const LLString& name); + +	struct ApplyFunctor +	{ +		virtual ~ApplyFunctor() {}; +		virtual void apply(const LLString& name, LLControlVariable* control) = 0; +	}; +	void applyToAll(ApplyFunctor* func);  	BOOL declareControl(const LLString& name, eControlType type, const LLSD initial_val, const LLString& comment, BOOL persist);  	BOOL declareU32(const LLString& name, U32 initial_val, const LLString& comment, BOOL persist = TRUE); @@ -224,6 +167,7 @@ public:  	BOOL declareColor4U(const LLString& name, const LLColor4U &initial_val, const LLString& comment, BOOL persist = TRUE);  	BOOL declareColor4(const LLString& name, const LLColor4 &initial_val, const LLString& comment, BOOL persist = TRUE);  	BOOL declareColor3(const LLString& name, const LLColor3 &initial_val, const LLString& comment, BOOL persist = TRUE); +	BOOL declareLLSD(const LLString& name, const LLSD &initial_val, const LLString& comment, BOOL persist = TRUE);  	LLString 	findString(const LLString& name); @@ -237,7 +181,7 @@ public:  	S32			getS32(const LLString& name);  	F32			getF32(const LLString& name);  	U32			getU32(const LLString& name); -	LLSD		getValue(const LLString& name); +	LLSD        getLLSD(const LLString& name);  	// Note: If an LLColor4U control exists, it will cast it to the correct @@ -258,19 +202,21 @@ public:  	void	setColor4U(const LLString& name, const LLColor4U &val);  	void	setColor4(const LLString& name, const LLColor4 &val);  	void	setColor3(const LLString& name, const LLColor3 &val); +	void    setLLSD(const LLString& name, const LLSD& val);  	void	setValue(const LLString& name, const LLSD& val); - +	 +	  	BOOL    controlExists(const LLString& name);  	// Returns number of controls loaded, 0 if failed  	// If require_declaration is false, will auto-declare controls it finds  	// as the given type. -	U32		loadFromFileLegacy(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING); -	U32		loadFromFile(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING); -	U32		saveToFile(const LLString& filename, BOOL skip_if_default); -	void	applyOverrides(const std::map<std::string, std::string>& overrides); +	U32	loadFromFileLegacy(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING); + 	U32 saveToFile(const LLString& filename, BOOL nondefault_only); + 	U32	loadFromFile(const LLString& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);  	void	resetToDefaults(); +	  	// Ignorable Warnings  	// Add a config variable to be reset on resetWarnings() diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml new file mode 100644 index 0000000000..01c590c1f3 --- /dev/null +++ b/indra/newview/app_settings/cmd_line.xml @@ -0,0 +1,323 @@ +<?xml version="1.0"?> +<llsd> +  <map> +    <key>help</key> +    <map> +      <key>desc</key> +      <string>display this help message</string> + +      <key>short</key> +      <string>h</string> +    </map> + +    <key>port</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>UserConnectionPort</string> +    </map> + +    <key>drop</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>PacketDropPercentage</string> +    </map> + +    <key>inbw</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>InBandwidth</string> +    </map> + +    <key>outbw</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>OutBandwidth</string> +    </map> + +    <key>grid</key> +    <map> +      <key>desc</key> +      <string>Specify the name of the grid, local, or an IP address to connect to.</string> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>GridChoice</string> +    </map> + +    <key>loginuri</key> +    <map> +      <key>desc</key> +      <string>login server and CGI script to use</string> +      <key>count</key> +      <integer>1</integer> +      <key>compose</key> +      <boolean>true</boolean> +      <key>map-to</key> +      <string>LoginURI</string> +    </map> + +    <key>helperuri</key> +    <map> +      <key>desc</key> +      <string>helper web CGI prefix to use</string> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>HelperURI</string> +    </map> + +    <key>debugviews</key> +    <map> +      <key>map-to</key> +      <string>DebugViews</string> +    </map> + +    <key>skin</key> +    <map> +      <key>desc</key> +      <string>ui/branding skin folder to use</string> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>SkinFolder</string> +    </map> + +    <key>autologin</key> +    <map> +      <key>desc</key> +      <string>log in as last saved user</string> +      <key>map-to</key> +      <string>AutoLogin</string> +    </map> + +    <key>quitafter</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>QuitAfterSeconds</string> +    </map> + +    <key>rotate</key> +    <map> +      <key>map-to</key> +      <string>RotateRight</string> +    </map> + +    <key>noaudio</key> +    <map> +      <key>map-to</key> +      <string>NoAudio</string> +    </map> + +    <key>nosound</key> +    <map> +      <key>map-to</key> +      <string>NoAudio</string> +    </map> + +    <key>noprobe</key> +    <map> +      <key>map-to</key> +      <string>NoHardwareProbe</string> +    </map> + +    <key>noquicktime</key> +    <map> +      <key>map-to</key> +      <string>NoQuickTime</string> +    </map> + +    <key>nopreload</key> +    <map> +      <key>map-to</key> +      <string>NoPreload</string> +    </map> + +    <key>purge</key> +    <map> +      <key>desc</key> +      <string>Delete files in the cache.</string> +      <key>map-to</key> +      <string>PurgeCacheOnNextStartup</string> +    </map> + +    <key>noinvlib</key> +    <map> +      <key>desc</key> +      <string>Do not request the inventory library.</string> +      <key>map-to</key> +      <string>NoInventoryLibrary</string> +    </map> + +    <key>logfile</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>UserLogFile</string> +    </map> + +    <key>setdefault</key> +    <map> +      <key>desc</key> +      <string> +        "specify the value of a particular\n +        configuration variable which can be\n +        overridden by settings.xml\n" +      </string> +      <key>count</key> +      <integer>2</integer> +      <!-- Special case. Mapped to settings procedurally. --> +    </map> + +    <key>set</key> +    <map> +      <key>desc</key> +      <string> +        "specify the value of a particular\n +        configuration variable that\n +        overrides all other settings\n" +      </string> +      <key>count</key> +      <integer>2</integer> +      <!-- Special case. Mapped to settings procedurally. --> +    </map> + +    <key>settings</key> +    <map> +      <key>desc</key> +      <string>Specify the filename of a configuration file.</string> +      <key>count</key> +      <integer>1</integer> +      <!-- Special case. Mapped to settings procedurally. --> +    </map> + +    <key>login</key> +    <map> +      <key>desc</key> +      <string>3 tokens: first, last and password</string> +      <key>count</key> +      <integer>3</integer> +      <key>map-to</key> +      <string>UserLoginInfo</string> +    </map> + +    <key>god</key> +    <map> +      <key>desc</key> +      <string>Log in a god if you have god access.</string> +      <key>map-to</key> +      <string>ConnectAsGod</string> +    </map> + +    <key>console</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>ShowConsoleWindow</string> +    </map> + +    <key>safe</key> +    <map> +      <key>desc</key> +      <string>Reset preferences, run in safe mode.</string> +      <key>map-to</key> +      <string>SafeMode</string> +    </map> + +    <key>multiple</key>		   +    <map> +      <key>desc</key> +      <string>Allow multple viewers.</string> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>AllowMultipleViewers</string> +    </map> + +    <key>novoice</key> +    <map> +      <key>desc</key> +      <string>Disable voice.</string> +      <key>map-to</key> +      <string>CmdLineDisableVoice</string> +    </map> + +    <key>url</key> +    <map> +      <key>desc</key> +      <string>Startup location</string>             +      <key>count</key> +      <integer>1</integer> +      <key>last_option</key> +      <boolean>true</boolean> +      <!-- Special case. Not mapped to a setting. --> +    </map> + +    <key>slurl</key> +    <map> +      <key>desc</key> +      <string>Startup SLurl</string> +      <key>count</key> +      <integer>1</integer> +      <key>positional</key> +      <boolean>true</boolean> +      <key>last_option</key> +      <boolean>true</boolean> +      <!-- Special case. Not mapped to a setting. --> +    </map> + +    <key>ignorepixeldepth</key> +    <map> +      <key>desc</key> +      <string>Ignore pixel depth settings.</string> +      <key>map-to</key> +      <string>IgnorePixelDepth</string> +    </map> + +    <key>cooperative</key> +    <map> +      <key>desc</key> +      <string>Yield some idle time to local host.</string> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>YieldTime</string> +    </map> + +    <key>no-verify-ssl-cert</key> +    <map> +      <key>map-to</key> +      <string>NoVerifySSLCert</string> +    </map> + +    <key>channel</key> +    <map> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>VersionChannelName</string> +    </map> + +    <key>loginpage</key> +    <map> +      <key>desc</key> +      <string>Login authentication page to use.</string> +      <key>count</key> +      <integer>1</integer> +      <key>map-to</key> +      <string>LoginPage</string> +    </map> + +  </map> +</llsd> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml new file mode 100644 index 0000000000..012bc9ec10 --- /dev/null +++ b/indra/newview/app_settings/settings.xml @@ -0,0 +1,9604 @@ +<llsd> +    <map> +    <key>AdvanceSnapshot</key> +        <map> +        <key>Comment</key> +            <string>Display advanced parameter settings in snaphot interface</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AFKTimeout</key> +        <map> +        <key>Comment</key> +            <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>300</real> +        </map> +    <key>AgentChatColor</key> +        <map> +        <key>Comment</key> +            <string>Color of chat messages from other residents</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>AllowIdleAFK</key> +        <map> +        <key>Comment</key> +            <string>Automatically set AFK (away from keyboard) mode when idle</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AllowMultipleViewers</key> +        <map> +        <key>Comment</key> +            <string>Allow multiple viewers.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AnimateTextures</key> +        <map> +        <key>Comment</key> +            <string>Enable texture animation (debug)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AnimationDebug</key> +        <map> +        <key>Comment</key> +            <string>Show active animations in a bubble above avatars head</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AppearanceCameraMovement</key> +        <map> +        <key>Comment</key> +            <string>When entering appearance editing mode, camera zooms in on currently selected portion of avatar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ApplyColorImmediately</key> +        <map> +        <key>Comment</key> +            <string>Preview selections in color picker immediately</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ApplyTextureImmediately</key> +        <map> +        <key>Comment</key> +            <string>Preview selections in texture picker immediately</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ArrowKeysMoveAvatar</key> +        <map> +        <key>Comment</key> +            <string>While cursor is in chat entry box, arrow keys still control your avatar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AskedAboutCrashReports</key> +        <map> +        <key>Comment</key> +            <string>Turns off dialog asking if you want to enable crash reporting</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AsyncKeyboard</key> +        <map> +        <key>Comment</key> +            <string>Improves responsiveness to keyboard input when at low framerates</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AuctionShowFence</key> +        <map> +        <key>Comment</key> +            <string>When auctioning land, include parcel boundary marker in snapshot</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AudioLevelAmbient</key> +        <map> +        <key>Comment</key> +            <string>Audio level of environment sounds</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>AudioLevelDistance</key> +        <map> +        <key>Comment</key> +            <string>Scale factor for audio engine (multiple of world scale, 2.0 = audio falls off twice as fast)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelDoppler</key> +        <map> +        <key>Comment</key> +            <string>Scale of doppler effect on moving audio sources (1.0 = normal, <1.0 = diminished doppler effect, >1.0 = enhanced doppler effect)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelMaster</key> +        <map> +        <key>Comment</key> +            <string>Master audio level, or overall volume</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelMedia</key> +        <map> +        <key>Comment</key> +            <string>Audio level of Quicktime movies</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelMic</key> +        <map> +        <key>Comment</key> +            <string>Audio level of microphone input</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelMusic</key> +        <map> +        <key>Comment</key> +            <string>Audio level of streaming music</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelRolloff</key> +        <map> +        <key>Comment</key> +            <string>Controls the distance-based dropoff of audio volume (fraction or multiple of default audio rolloff)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelSFX</key> +        <map> +        <key>Comment</key> +            <string>Audio level of in-world sound effects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>AudioLevelUI</key> +        <map> +        <key>Comment</key> +            <string>Audio level of UI sound effects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>AudioLevelVoice</key> +        <map> +        <key>Comment</key> +            <string>Audio level of voice chat</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>AudioStreamingMusic</key> +        <map> +        <key>Comment</key> +            <string>Enable streaming audio</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AudioStreamingVideo</key> +        <map> +        <key>Comment</key> +            <string>Enable streaming video</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AutoAcceptNewInventory</key> +        <map> +        <key>Comment</key> +            <string>Automatically accept new notecards/textures/landmarks</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AutoLoadWebProfiles</key> +        <map> +        <key>Comment</key> +            <string>Automatically load ALL profile webpages without asking first.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AutoLogin</key> +        <map> +        <key>Comment</key> +            <string>Login automatically using last username/password combination</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AutoMimeDiscovery</key> +        <map> +          <key>Comment</key> +              <string>Enable viewer mime type discovery of media URLs</string> +          <key>Persist</key> +              <integer>1</integer> +          <key>Type</key> +              <string>Boolean</string> +          <key>Value</key> +              <integer>0</integer> +        </map> +    <key>AutoPilotLocksCamera</key> +        <map> +        <key>Comment</key> +            <string>Keep camera position locked when avatar walks to selected position</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AutoSnapshot</key> +        <map> +        <key>Comment</key> +            <string>Update snapshot when camera stops moving, or any parameter changes</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>AutomaticFly</key> +        <map> +        <key>Comment</key> +            <string>Fly by holding jump key or using "Fly" command (FALSE = fly by using "Fly" command only)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AvatarBacklight</key> +        <map> +        <key>Comment</key> +            <string>Add rim lighting to avatar rendering to approximate shininess of skin</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>AvatarCompositeLimit</key> +        <map> +        <key>Comment</key> +            <string>Maximum number of avatars to display appearance changes on the fly</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>5</integer> +        </map> +    <key>AvatarPickerSortOrder</key> +        <map> +        <key>Comment</key> +            <string>Specifies sort key for textures in avatar picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>AvatarSex</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>BackgroundChatColor</key> +        <map> +        <key>Comment</key> +            <string>Color of chat bubble background</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>BackgroundYieldTime</key> +        <map> +        <key>Comment</key> +            <string>Amount of time to yield every frame to other applications when SL is not the foreground window (milliseconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>40</integer> +        </map> +    <key>BackwardBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>45</integer> +                <integer>29</integer> +                <integer>66</integer> +                <integer>4</integer> +            </array> +        </map> +    <key>BasicHelpRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for help window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>404</integer> +                <integer>467</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>BeaconAlwaysOn</key> +        <map> +        <key>Comment</key> +            <string>Beacons / highlighting always on</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>BrowserHomePage</key> +        <map> +        <key>Comment</key> +            <string>[NOT USED]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>http://www.secondlife.com</string> +        </map> +    <key>BrowserProxyAddress</key> +        <map> +        <key>Comment</key> +            <string>Address for the Web Proxy]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>BrowserProxyEnabled</key> +        <map> +        <key>Comment</key> +            <string>Use Web Proxy</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>BrowserProxyExclusions</key> +        <map> +        <key>Comment</key> +            <string>[NOT USED]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>BrowserProxyPort</key> +        <map> +        <key>Comment</key> +            <string>Port for Web Proxy</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>3128</integer> +        </map> +    <key>BrowserProxySocks45</key> +        <map> +        <key>Comment</key> +            <string>[NOT USED]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>5</integer> +        </map> +    <key>BuildBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ButtonFlashCount</key> +        <map> +        <key>Comment</key> +            <string>Number of flashes after which flashing buttons stay lit up</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>3</integer> +        </map> +    <key>ButtonFlashRate</key> +        <map> +        <key>Comment</key> +            <string>Frequency at which buttons flash (hz)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>2</real> +        </map> +    <key>ButtonHPad</key> +        <map> +        <key>Comment</key> +            <string>Default horizontal spacing between buttons (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>10</integer> +        </map> +    <key>ButtonHeight</key> +        <map> +        <key>Comment</key> +            <string>Default height for normal buttons (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>20</integer> +        </map> +    <key>ButtonHeightSmall</key> +        <map> +        <key>Comment</key> +            <string>Default height for small buttons (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>16</integer> +        </map> +    <key>ButtonVPad</key> +        <map> +        <key>Comment</key> +            <string>Default vertical spacing between buttons (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>CacheLocation</key> +        <map> +        <key>Comment</key> +            <string>Controls the location of the local disk cache</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>CacheSize</key> +        <map> +        <key>Comment</key> +            <string>Controls amount of hard drive space reserved for local file caching in MB</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>500</integer> +        </map> +    <key>CacheValidateCounter</key> +        <map> +        <key>Comment</key> +            <string>Used to distribute cache validation</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CameraOffset</key> +        <map> +        <key>Comment</key> +            <string>Render with camera offset from view frustum (rendering debug)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CameraOffsetBuild</key> +        <map> +        <key>Comment</key> +            <string>Default camera position relative to focus point when entering build mode</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3</string> +        <key>Value</key> +            <array> +                <real>-6</real> +                <real>0</real> +                <real>6</real> +            </array> +        </map> +    <key>CameraOffsetDefault</key> +        <map> +        <key>Comment</key> +            <string>Default camera offset from avatar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3</string> +        <key>Value</key> +            <array> +                <real>-3</real> +                <real>0</real> +                <real>0.75</real> +            </array> +        </map> +    <key>CameraPositionSmoothing</key> +        <map> +        <key>Comment</key> +            <string>Smooths camera position over time</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1.0</real> +        </map> +    <key>CameraPosOnLogout</key> +        <map> +        <key>Comment</key> +            <string>Camera position when last logged out (global coordinates)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3D</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0</real> +                <real>0</real> +            </array> +        </map> +    <key>CameraMouseWheelZoom</key> +        <map> +        <key>Comment</key> +            <string>Camera zooms in and out with mousewheel</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ChatBarStealsFocus</key> +        <map> +        <key>Comment</key> +            <string>Whenever keyboard focus is removed from the UI, and the chat bar is visible, the chat bar takes focus</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ChatBubbleOpacity</key> +        <map> +        <key>Comment</key> +            <string>Opacity of chat bubble background (0.0 = completely transparent, 1.0 = completely opaque)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>ChatFontSize</key> +        <map> +        <key>Comment</key> +            <string>Size of chat text in chat console (0 = small, 1 = big)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ChatFullWidth</key> +        <map> +        <key>Comment</key> +            <string>Chat console takes up full width of SL window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ChatHistoryTornOff</key> +        <map> +        <key>Comment</key> +            <string>Show chat history window separately from Communicate window.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ChatOnlineNotification</key> +        <map> +        <key>Comment</key> +            <string>Provide notifications for when friend log on and off of SL</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ChatPersistTime</key> +        <map> +        <key>Comment</key> +            <string>Time for which chat stays visible in console (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>15</real> +        </map> +    <key>ChatShowTimestamps</key> +        <map> +        <key>Comment</key> +            <string>Show timestamps in chat</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ChatVisible</key> +        <map> +        <key>Comment</key> +            <string>Chat bar is visible</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ChatterboxRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for chatterbox window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>350</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>CheesyBeacon</key> +        <map> +        <key>Comment</key> +            <string>Enable cheesy beacon effects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ClientSettingsFile</key> +        <map> +        <key>Comment</key> +            <string>Persisted client settings file name (per install).</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>CloseChatOnReturn</key> +        <map> +        <key>Comment</key> +            <string>Close chat after hitting return</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CloseSnapshotOnKeep</key> +        <map> +        <key>Comment</key> +            <string>Close snapshot window after saving snapshot</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ClothingBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CmdLineDisableVoice</key> +        <map> +        <key>Comment</key> +            <string>Disable Voice.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ColorPaletteEntry01</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry02</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0.5</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry03</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry04</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0.5</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry05</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0.5</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry06</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0.5</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry07</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry08</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry09</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0.5</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry10</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0.25</real> +                <real>0.25</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry11</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0.5</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry12</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0.25</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry13</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry14</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0.25</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry15</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry16</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry17</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry18</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.75</real> +                <real>0.75</real> +                <real>0.75</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry19</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>0</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry20</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry21</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>1</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry22</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry23</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry24</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>0</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry25</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry26</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>1</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry27</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry28</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.5</real> +                <real>0.5</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry29</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>0</real> +                <real>0.5</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry30</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>0.5</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry31</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColorPaletteEntry32</key> +        <map> +        <key>Comment</key> +            <string>Color picker palette entry</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>ColumnHeaderDropDownDelay</key> +        <map> +        <key>Comment</key> +            <string>Time in seconds of mouse click before column header shows sort options list</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.300000011920928955078125</real> +        </map> +    <key>CompileOutputRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for script Recompile Everything output window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>CompressSnapshotsToDisk</key> +        <map> +        <key>Comment</key> +            <string>Compress snapshots saved to disk (Using JPEG 2000)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ConnectAsGod</key> +        <map> +        <key>Comment</key> +            <string>Log in a god if you have god access.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ConnectionPort</key> +        <map> +        <key>Comment</key> +            <string>Custom connection port number</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>13000</integer> +        </map> +    <key>ConnectionPortEnabled</key> +        <map> +        <key>Comment</key> +            <string>Use the custom connection port?</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ConsoleBackgroundOpacity</key> +        <map> +        <key>Comment</key> +            <string>Opacity of chat console (0.0 = completely transparent, 1.0 = completely opaque)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.4000000059604644775390625</real> +        </map> +    <key>ConsoleBufferSize</key> +        <map> +        <key>Comment</key> +            <string>Size of chat console history (lines of chat)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>40</integer> +        </map> +    <key>ConsoleMaxLines</key> +        <map> +        <key>Comment</key> +            <string>Max number of lines of chat text visible in console.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>40</integer> +        </map> +    <key>ContactsTornOff</key> +        <map> +        <key>Comment</key> +            <string>Show contacts window separately from Communicate window.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CookiesEnabled</key> +        <map> +        <key>Comment</key> +            <string>Accept cookies from Web sites?</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>CrashLogBehavior</key> +        <map> +        <key>Comment</key> +            <string>Controls behavior when viewer (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>CreateToolCopyCenters</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>CreateToolCopyRotates</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CreateToolCopySelection</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CreateToolKeepSelected</key> +        <map> +        <key>Comment</key> +            <string>After using create tool, keep the create tool active</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>CustomServer</key> +        <map> +        <key>Comment</key> +            <string>Specifies IP address or hostname of grid to which you connect</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>DebugBeaconLineWidth</key> +        <map> +        <key>Comment</key> +            <string>Size of lines for Debug Beacons</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DebugInventoryFilters</key> +        <map> +        <key>Comment</key> +            <string>Turn on debugging display for inventory filtering</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DebugPermissions</key> +        <map> +        <key>Comment</key> +            <string>Log permissions for selected inventory items</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DebugShowColor</key> +        <map> +        <key>Comment</key> +            <string>Show color under cursor</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DebugShowRenderInfo</key> +        <map> +        <key>Comment</key> +            <string>Show depth buffer contents</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DebugShowTime</key> +        <map> +        <key>Comment</key> +            <string>Show depth buffer contents</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DebugViews</key> +        <map> +        <key>Comment</key> +            <string>Display debugging info for views.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DebugWindowProc</key> +        <map> +        <key>Comment</key> +            <string>Log windows messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DefaultObjectTexture</key> +        <map> +        <key>Comment</key> +            <string>Texture used as 'Default' in texture picker. (UUID texture reference)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>89556747-24cb-43ed-920b-47caed15465f</string> +        </map> +    <key>DisableCameraConstraints</key> +        <map> +        <key>Comment</key> +            <string>Disable the normal bounds put on the camera by avatar position</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DisableRendering</key> +        <map> +        <key>Comment</key> +            <string>Disable GL rendering and GUI (load testing)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DisableVerticalSync</key> +        <map> +        <key>Comment</key> +            <string>Update frames as fast as possible (FALSE = update frames between display scans)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DisplayAvatarAgentTarget</key> +        <map> +        <key>Comment</key> +            <string>Show avatar positioning locators (animation debug)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DisplayChat</key> +        <map> +        <key>Comment</key> +            <string>Display Latest Chat message on LCD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DisplayDebug</key> +        <map> +        <key>Comment</key> +            <string>Display Network Information on LCD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DisplayDebugConsole</key> +        <map> +        <key>Comment</key> +            <string>Display Console Debug Information on LCD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DisplayIM</key> +        <map> +        <key>Comment</key> +            <string>Display Latest IM message on LCD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DisplayLinden</key> +        <map> +        <key>Comment</key> +            <string>Display Account Information on LCD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DisplayRegion</key> +        <map> +        <key>Comment</key> +            <string>Display Location information on LCD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DisplayTimecode</key> +        <map> +        <key>Comment</key> +            <string>Display timecode on screen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>Disregard128DefaultDrawDistance</key> +        <map> +        <key>Comment</key> +            <string>Whether to use the auto default to 128 draw distance</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>Disregard96DefaultDrawDistance</key> +        <map> +        <key>Comment</key> +            <string>Whether to use the auto default to 96 draw distance</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>DoubleClickAutoPilot</key> +        <map> +        <key>Comment</key> +            <string>Enable double-click auto pilot</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>DragAndDropToolTipDelay</key> +        <map> +        <key>Comment</key> +            <string>Seconds before displaying tooltip when performing drag and drop operation</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>DropShadowButton</key> +        <map> +        <key>Comment</key> +            <string>Drop shadow width for buttons (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>DropShadowFloater</key> +        <map> +        <key>Comment</key> +            <string>Drop shadow width for floaters (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>5</integer> +        </map> +    <key>DropShadowSlider</key> +        <map> +        <key>Comment</key> +            <string>Drop shadow width for sliders (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>3</integer> +        </map> +    <key>DropShadowTooltip</key> +        <map> +        <key>Comment</key> +            <string>Drop shadow width for tooltips (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>4</integer> +        </map> +    <key>DynamicCameraStrength</key> +        <map> +        <key>Comment</key> +            <string>Amount camera lags behind avatar motion (0 = none, 30 = avatar velocity)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>2</real> +        </map> +    <key>EditCameraMovement</key> +        <map> +        <key>Comment</key> +            <string>When entering build mode, camera moves up above avatar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>EditLinkedParts</key> +        <map> +        <key>Comment</key> +            <string>Select individual parts of linked objects</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>EffectColor</key> +        <map> +        <key>Comment</key> +            <string>Particle effects color</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>EnablePushToTalk</key> +        <map> +        <key>Comment</key> +            <string>Must hold down a key or moouse button when talking into your microphone</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>EnableVoiceChat</key> +        <map> +        <key>Comment</key> +            <string>Enable talking to other residents with a microphone</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>EnergyFromTop</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>20</integer> +        </map> +    <key>EnergyHeight</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>40</integer> +        </map> +    <key>EnergyWidth</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>175</integer> +        </map> +    <key>FilterItemsPerFrame</key> +        <map> +        <key>Comment</key> +            <string>Maximum number of inventory items to match against search filter every frame (lower to increase framerate while searching, higher to improve search speed)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>500</integer> +        </map> +    <key>FindLandArea</key> +        <map> +        <key>Comment</key> +            <string>Enables filtering of land search results by area</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FindLandPrice</key> +        <map> +        <key>Comment</key> +            <string>Enables filtering of land search results by price</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FindLandType</key> +        <map> +        <key>Comment</key> +            <string>Controls which type of land you are searching for in Find Land interface ("All", "Auction", "For Sale")</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>All</string> +        </map> +    <key>FindPeopleOnline</key> +        <map> +        <key>Comment</key> +            <string>Limits people search to only users who are logged on</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FindPlacesPictures</key> +        <map> +        <key>Comment</key> +            <string>Display only results of find places that have pictures</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FirstLoginThisInstall</key> +        <map> +        <key>Comment</key> +            <string>Specifies that you have not successfully logged in since you installed the latest update</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FirstName</key> +        <map> +        <key>Comment</key> +            <string>Login first name</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>FirstPersonAvatarVisible</key> +        <map> +        <key>Comment</key> +            <string>Display avatar and attachments below neck while in mouselook</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FirstPersonBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FirstRunThisInstall</key> +        <map> +        <key>Comment</key> +            <string>Specifies that you have not run the viewer since you installed the latest update</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FixedWeather</key> +        <map> +        <key>Comment</key> +            <string>Weather effects do not change over time</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FloaterAboutRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for About window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>440</integer> +                <integer>470</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterActiveSpeakersRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for active speakers window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>300</integer> +                <integer>250</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterAudioVolumeRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Audio Volume window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>440</integer> +                <integer>470</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterBuildOptionsRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for build options window.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>0</integer> +                <integer>0</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterBumpRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Bumps/Hits window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>180</integer> +                <integer>400</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterBuyContentsRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Buy Contents window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>250</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterBuyRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for buy window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>250</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterCameraRect2</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for camera control window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>166</integer> +                <integer>128</integer> +                <integer>342</integer> +                <integer>64</integer> +            </array> +        </map> +    <key>FloaterChatRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for chat history</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>172</integer> +                <integer>500</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterClothingRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for clothing window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>480</integer> +                <integer>320</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterContactsRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for chat history</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>390</integer> +                <integer>395</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterCustomizeAppearanceRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for avatar customization window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>540</integer> +                <integer>494</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterFindRect2</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Find window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>570</integer> +                <integer>780</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterFriendsRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for friends window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>250</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterGestureRect2</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for gestures window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>465</integer> +                <integer>350</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterHtmlRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for HTML window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>100</integer> +                <integer>460</integer> +                <integer>370</integer> +                <integer>100</integer> +            </array> +        </map> +    <key>FloaterHUDRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for HUD Floater window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>282</integer> +                <integer>342</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterIMRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for IM window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>160</integer> +                <integer>500</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterInspectRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Object Inspect window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>400</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterInventoryRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for inventory window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterJoystickRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for joystick controls window.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>0</integer> +                <integer>0</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterLagMeter</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for lag meter</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>142</integer> +                <integer>350</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterLandRect5</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for About Land window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>370</integer> +                <integer>460</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterLandmarkRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for landmark picker</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>290</integer> +                <integer>310</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterMediaRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for media browser window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>400</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterMiniMapRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>225</integer> +                <integer>200</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterMoveRect2</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for avatar control window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>58</integer> +                <integer>135</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterMuteRect3</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for mute window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>300</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterOpenObjectRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Open Object window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>350</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterPayRectB</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for pay window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>150</integer> +                <integer>400</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterRegionInfo</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for region info window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>512</integer> +                <integer>480</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterScriptDebugRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Script Error/Debug window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>130</integer> +                <integer>450</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FloaterSnapshotRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for snapshot window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>200</integer> +                <integer>200</integer> +                <integer>400</integer> +            </array> +        </map> +    <key>FloaterViewBottom</key> +        <map> +        <key>Comment</key> +            <string>[DO NOT MODIFY] Controls layout of floating windows within SL window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>-1</integer> +        </map> +    <key>FloaterWorldMapRect2</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for world map window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>0</integer> +                <integer>0</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>FlyBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FlycamAbsolute</key> +        <map> +        <key>Comment</key> +            <string>Treat Flycam values as absolute positions (not deltas).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FlycamAutoLeveling</key> +        <map> +        <key>Comment</key> +            <string>Keep Flycam level.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FlycamAxis0</key> +        <map> +        <key>Comment</key> +            <string>Flycam hardware axis mapping for internal axis 0 ([0, 5]).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FlycamAxis1</key> +        <map> +        <key>Comment</key> +            <string>Flycam hardware axis mapping for internal axis 1 ([0, 5]).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FlycamAxis2</key> +        <map> +        <key>Comment</key> +            <string>Flycam hardware axis mapping for internal axis 2 ([0, 5]).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>FlycamAxis3</key> +        <map> +        <key>Comment</key> +            <string>Flycam hardware axis mapping for internal axis 3 ([0, 5]).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>3</integer> +        </map> +    <key>FlycamAxis4</key> +        <map> +        <key>Comment</key> +            <string>Flycam hardware axis mapping for internal axis 4 ([0, 5]).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>4</integer> +        </map> +    <key>FlycamAxis5</key> +        <map> +        <key>Comment</key> +            <string>Flycam hardware axis mapping for internal axis 5 ([0, 5]).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>5</integer> +        </map> +    <key>FlycamAxis6</key> +        <map> +        <key>Comment</key> +            <string>Flycam hardware axis mapping for internal axis 6 ([0, 5]).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>-1</integer> +        </map> +    <key>FlycamAxisDeadZone0</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 0 dead zone.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>FlycamAxisDeadZone1</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 1 dead zone.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>FlycamAxisDeadZone2</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 2 dead zone.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>FlycamAxisDeadZone3</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 3 dead zone.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>FlycamAxisDeadZone4</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 4 dead zone.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>FlycamAxisDeadZone5</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 5 dead zone.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>FlycamAxisDeadZone6</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 6 dead zone.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>FlycamAxisScale0</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 0 scaler.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FlycamAxisScale1</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 1 scaler.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FlycamAxisScale2</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 2 scaler.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FlycamAxisScale3</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 3 scaler.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FlycamAxisScale4</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 4 scaler.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FlycamAxisScale5</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 5 scaler.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FlycamAxisScale6</key> +        <map> +        <key>Comment</key> +            <string>Flycam axis 6 scaler.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FlycamFeathering</key> +        <map> +        <key>Comment</key> +            <string>Flycam feathering (less is softer)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>16</real> +        </map> +    <key>FlycamZoomDirect</key> +        <map> +        <key>Comment</key> +            <string>Map flycam zoom axis directly to camera zoom.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FlyingAtExit</key> +        <map> +        <key>Comment</key> +            <string>Was flying when last logged out, so fly when logging in</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FocusOffsetDefault</key> +        <map> +        <key>Comment</key> +            <string>Default focus point offset relative to avatar (x-axis is forward)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>FocusPosOnLogout</key> +        <map> +        <key>Comment</key> +            <string>Camera focus point when last logged out (global coordinates)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3D</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>0</real> +                <real>0</real> +            </array> +        </map> +    <key>FolderAutoOpenDelay</key> +        <map> +        <key>Comment</key> +            <string>Seconds before automatically expanding the folder under the mouse when performing inventory drag and drop</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.75</real> +        </map> +    <key>FolderLoadingMessageWaitTime</key> +        <map> +        <key>Comment</key> +            <string>Seconds to wait before showing the LOADING... text in folder views</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>FontMonospace</key> +        <map> +        <key>Comment</key> +            <string>Name of monospace font (Truetype file name)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>profontwindows.ttf</string> +        </map> +    <key>FontSansSerif</key> +        <map> +        <key>Comment</key> +            <string>Name of san-serif font (Truetype file name)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>MtBkLfRg.ttf</string> +        </map> +    <key>FontSansSerifBold</key> +        <map> +        <key>Comment</key> +            <string>Name of bold font (Truetype file name)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>MtBdLfRg.ttf</string> +        </map> +    <key>FontSansSerifFallback</key> +        <map> +        <key>Comment</key> +            <string>Name of san-serif font (Truetype file name)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>???????? Pro W3.otf;???????? ProN W3.otf;AppleGothic.dfont;AppleGothic.ttf;????.ttf</string> +        </map> +    <key>FontSansSerifFallbackScale</key> +        <map> +        <key>Comment</key> +            <string>Scale of fallback font relative to huge font (fraction of huge font size)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>FontScreenDPI</key> +        <map> +        <key>Comment</key> +            <string>Font resolution, higher is bigger (pixels per inch)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>96</real> +        </map> +    <key>FontSizeHuge</key> +        <map> +        <key>Comment</key> +            <string>Size of huge font (points, or 1/72 of an inch)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>16</real> +        </map> +    <key>FontSizeLarge</key> +        <map> +        <key>Comment</key> +            <string>Size of large font (points, or 1/72 of an inch)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>12</real> +        </map> +    <key>FontSizeMedium</key> +        <map> +        <key>Comment</key> +            <string>Size of medium font (points, or 1/72 of an inch)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>10</real> +        </map> +    <key>FontSizeMonospace</key> +        <map> +        <key>Comment</key> +            <string>Size of monospaced font (points, or 1/72 of an inch)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>9</real> +        </map> +    <key>FontSizeSmall</key> +        <map> +        <key>Comment</key> +            <string>Size of small font (points, or 1/72 of an inch)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>9</real> +        </map> +    <key>ForceShowGrid</key> +        <map> +        <key>Comment</key> +            <string>Always show grid dropdown on login screen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ForwardBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>45</integer> +                <integer>54</integer> +                <integer>66</integer> +                <integer>29</integer> +            </array> +        </map> +    <key>FreezeTime</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FullScreen</key> +        <map> +        <key>Comment</key> +            <string>Run SL in fullscreen mode</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>FullScreenAspectRatio</key> +        <map> +        <key>Comment</key> +            <string>Aspect ratio of fullscreen display (width / height)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1.33329999446868896484375</real> +        </map> +    <key>FullScreenAutoDetectAspectRatio</key> +        <map> +        <key>Comment</key> +            <string>Automatically detect proper aspect ratio for fullscreen display</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>FullScreenHeight</key> +        <map> +        <key>Comment</key> +            <string>Fullscreen resolution in height</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>768</integer> +        </map> +    <key>FullScreenWidth</key> +        <map> +        <key>Comment</key> +            <string>Fullscreen resolution in width</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1024</integer> +        </map> +    <key>GridChoice</key> +        <map> +        <key>Comment</key> +            <string>The user's grid choice or ip address.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>GridCrossSections</key> +        <map> +        <key>Comment</key> +            <string>Highlight cross sections of prims with grid manipulation plane.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>GridDrawSize</key> +        <map> +        <key>Comment</key> +            <string>Visible extent of 2D snap grid (meters)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>12</real> +        </map> +    <key>GridMode</key> +        <map> +        <key>Comment</key> +            <string>Snap grid reference frame (0 = world, 1 = local, 2 = reference object)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>GridOpacity</key> +        <map> +        <key>Comment</key> +            <string>Grid line opacity (0.0 = completely transparent, 1.0 = completely opaque)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.699999988079071044921875</real> +        </map> +    <key>GridResolution</key> +        <map> +        <key>Comment</key> +            <string>Size of single grid step (meters)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>GridSubUnit</key> +        <map> +        <key>Comment</key> +            <string>Display fractional grid steps, relative to grid size</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>GridSubdivision</key> +        <map> +        <key>Comment</key> +            <string>Maximum number of times to divide single snap grid unit when GridSubUnit is true</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>32</integer> +        </map> +    <key>GroupNotifyBoxHeight</key> +        <map> +        <key>Comment</key> +            <string>Height of group notice messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>260</integer> +        </map> +    <key>GroupNotifyBoxWidth</key> +        <map> +        <key>Comment</key> +            <string>Width of group notice messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>400</integer> +        </map> +    <key>HTMLLinkColor</key> +        <map> +        <key>Comment</key> +            <string>Color of hyperlinks</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.60000002384185791015625</real> +                <real>0.60000002384185791015625</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>HelpHomeURL</key> +        <map> +        <key>Comment</key> +            <string>URL of initial help page</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>help/index.html</string> +        </map> +    <key>HelpLastVisitedURL</key> +        <map> +        <key>Comment</key> +            <string>URL of last help page, will be shown next time help is accessed</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>help/index.html</string> +        </map> +    <key>HelperURI</key> +        <map> +        <key>Comment</key> +            <string>helper web CGI prefix to use</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>HighResSnapshot</key> +        <map> +        <key>Comment</key> +            <string>Double resolution of snapshot from current window resolution</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>HtmlFindRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for HTML find window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>16</integer> +                <integer>650</integer> +                <integer>600</integer> +                <integer>128</integer> +            </array> +        </map> +    <key>HtmlHelpLastPage</key> +        <map> +        <key>Comment</key> +            <string>Last URL visited via help system</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>HtmlHelpRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for HTML help window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>16</integer> +                <integer>650</integer> +                <integer>600</integer> +                <integer>128</integer> +            </array> +        </map> +    <key>HtmlReleaseMessage</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for HTML Release Message Floater window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>46</integer> +                <integer>520</integer> +                <integer>400</integer> +                <integer>128</integer> +            </array> +        </map> +    <key>IMInChatHistory</key> +        <map> +        <key>Comment</key> +            <string>Copy IM into chat history</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>IMShowTimestamps</key> +        <map> +        <key>Comment</key> +            <string>Show timestamps in IM</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>IgnorePixelDepth</key> +        <map> +        <key>Comment</key> +            <string>Ignore pixel depth settings.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ImagePipelineUseHTTP</key> +        <map> +        <key>Comment</key> +            <string>If TRUE use HTTP GET to fetch textures from the server</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>InBandwidth</key> +        <map> +        <key>Comment</key> +            <string>Incoming bandwidth throttle (bps)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0</real> +        </map> +    <key>InventoryAutoOpenDelay</key> +        <map> +        <key>Comment</key> +            <string>Seconds before automatically opening inventory when mouse is over inventory button when performing inventory drag and drop</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>InventorySortOrder</key> +        <map> +        <key>Comment</key> +            <string>Specifies sort key for inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>7</integer> +        </map> +    <key>InvertMouse</key> +        <map> +        <key>Comment</key> +            <string>When in mouselook, moving mouse up looks down and vice verse (FALSE = moving up looks up)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>KeepAspectForSnapshot</key> +        <map> +        <key>Comment</key> +            <string>Use full window when taking snapshot, regardless of requested image size</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>LCDDestination</key> +        <map> +        <key>Comment</key> +            <string>Which LCD to use</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LSLHelpRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for LSL help window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>400</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>LSLHelpURL</key> +        <map> +        <key>Comment</key> +            <string>URL that points to LSL help files, with [LSL_STRING] corresponding to the referenced LSL function or keyword</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>https://wiki.secondlife.com/wiki/[LSL_STRING]</string> +        </map> +    <key>LagMeterShrunk</key> +        <map> +        <key>Comment</key> +            <string>Last large/small state for lag meter</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>Language</key> +        <map> +        <key>Comment</key> +            <string>Language specifier (for XUI)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>default</string> +        </map> +    <key>LastFeatureVersion</key> +        <map> +        <key>Comment</key> +            <string>[DO NOT MODIFY] Version number for tracking hardware changes</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LastFindPanel</key> +        <map> +        <key>Comment</key> +            <string>Controls which find operation appears by default when clicking "Find" button </string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>find_all_panel</string> +        </map> +    <key>LastName</key> +        <map> +        <key>Comment</key> +            <string>Login last name</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>LastPrefTab</key> +        <map> +        <key>Comment</key> +            <string>Last selected tab in preferences window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LastRunVersion</key> +        <map> +        <key>Comment</key> +            <string>Version number of last instance of the viewer that you ran</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>0.0.0</string> +        </map> +    <key>LastSnapshotHeight</key> +        <map> +        <key>Comment</key> +            <string>The height of the last snapshot, in px</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>768</integer> +        </map> +    <key>LastSnapshotType</key> +        <map> +        <key>Comment</key> +            <string>Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LastSnapshotWidth</key> +        <map> +        <key>Comment</key> +            <string>The width of the last snapshot, in px</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1024</integer> +        </map> +    <key>LeftClickShowMenu</key> +        <map> +        <key>Comment</key> +            <string>Left click opens pie menu (FALSE = left click touches or grabs object)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LimitDragDistance</key> +        <map> +        <key>Comment</key> +            <string>Limit translation of object via translate tool</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>LimitSelectDistance</key> +        <map> +        <key>Comment</key> +            <string>Disallow selection of objects beyond max select distance</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>LocalCacheVersion</key> +        <map> +        <key>Comment</key> +            <string>Version number of cache</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LogMessages</key> +        <map> +        <key>Comment</key> +            <string>Log network traffic</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LoginAsGod</key> +        <map> +        <key>Comment</key> +            <string>Attempt to login with god powers (Linden accounts only)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LoginLastLocation</key> +        <map> +        <key>Comment</key> +            <string>Login at same location you last logged out</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>LoginPage</key> +        <map> +        <key>Comment</key> +            <string>Login authentication page.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>LoginURI</key> +        <map> +        <key>Comment</key> +            <string>login server and CGI prefix to use</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>LosslessJ2CUpload</key> +        <map> +        <key>Comment</key> +            <string>Use lossless compression for small image uploads</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MapOverlayIndex</key> +        <map> +        <key>Comment</key> +            <string>Currently selected world map type</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MapScale</key> +        <map> +        <key>Comment</key> +            <string>World map zoom level (pixels per region)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>128</real> +        </map> +    <key>MapShowClassifieds</key> +        <map> +        <key>Comment</key> +            <string>Show locations associated with classified ads on world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>MapShowEvents</key> +        <map> +        <key>Comment</key> +            <string>Show events on world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>MapShowInfohubs</key> +        <map> +        <key>Comment</key> +            <string>Show infohubs on the world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>MapShowLandForSale</key> +        <map> +        <key>Comment</key> +            <string>Show land for sale on world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MapShowPeople</key> +        <map> +        <key>Comment</key> +            <string>Show other users on world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>MapShowPopular</key> +        <map> +        <key>Comment</key> +            <string>Show popular places on world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>MapShowTelehubs</key> +        <map> +        <key>Comment</key> +            <string>Show telehubs on world map</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>Marker</key> +        <map> +        <key>Comment</key> +            <string>[NOT USED]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>MaxDragDistance</key> +        <map> +        <key>Comment</key> +            <string>Maximum allowed translation distance in a single operation of translate tool (meters from start point)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>48</real> +        </map> +    <key>MaxSelectDistance</key> +        <map> +        <key>Comment</key> +            <string>Maximum allowed selection distance (meters from avatar)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>64</real> +        </map> +    <key>MeanCollisionBump</key> +        <map> +        <key>Comment</key> +            <string>You have experienced an abuse of being bumped by an object or avatar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MeanCollisionPhysical</key> +        <map> +        <key>Comment</key> +            <string>You have experienced an abuse from a physical object</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MeanCollisionPushObject</key> +        <map> +        <key>Comment</key> +            <string>You have experienced an abuse of being pushed by a scripted object</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MeanCollisionScripted</key> +        <map> +        <key>Comment</key> +            <string>You have experienced an abuse from a scripted object</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MeanCollisionSelected</key> +        <map> +        <key>Comment</key> +            <string>You have experienced an abuse of being pushed via a selected object</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MenuAccessKeyTime</key> +        <map> +        <key>Comment</key> +            <string>Time (seconds) in which the menu key must be tapped to move focus to the menu bar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.25</real> +        </map> +    <key>MenuBarHeight</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>18</integer> +        </map> +    <key>MenuBarWidth</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>410</integer> +        </map> +    <key>MiniMapRotate</key> +        <map> +        <key>Comment</key> +            <string>Rotate miniature world map to avatar direction</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>MiniMapScale</key> +        <map> +        <key>Comment</key> +            <string>Miniature world map zoom levle (pixels per region)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>128</real> +        </map> +    <key>MouseSensitivity</key> +        <map> +        <key>Comment</key> +            <string>Controls responsiveness of mouse when in mouselook mode (fraction or multiple of default mouse sensitivity)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>3</real> +        </map> +    <key>MouseSmooth</key> +        <map> +        <key>Comment</key> +            <string>Smooths out motion of mouse when in mouselook mode.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MouseSun</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MouselookBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MoveDownBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>91</integer> +                <integer>29</integer> +                <integer>116</integer> +                <integer>4</integer> +            </array> +        </map> +    <key>MoveUpBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>91</integer> +                <integer>54</integer> +                <integer>116</integer> +                <integer>29</integer> +            </array> +        </map> +    <key>MuteAmbient</key> +        <map> +        <key>Comment</key> +            <string>Ambient sound effects, such as wind noise, play at 0 volume</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MuteAudio</key> +        <map> +        <key>Comment</key> +            <string>All audio plays at 0 volume (streaming audio still takes up bandwidth, for example)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MuteMedia</key> +        <map> +        <key>Comment</key> +            <string>Media plays at 0 volume (streaming audio still takes up bandwidth)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MuteMusic</key> +        <map> +        <key>Comment</key> +            <string>Music plays at 0 volume (streaming audio still takes up bandwidth)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MuteSounds</key> +        <map> +        <key>Comment</key> +            <string>Sound effects play at 0 volume</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MuteUI</key> +        <map> +        <key>Comment</key> +            <string>UI sound effects play at 0 volume</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MuteVoice</key> +        <map> +        <key>Comment</key> +            <string>Voice plays at 0 volume (streaming audio still takes up bandwidth)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>MuteWhenMinimized</key> +        <map> +        <key>Comment</key> +            <string>Mute audio when SL window is minimized</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>NewCacheLocation</key> +        <map> +        <key>Comment</key> +            <string>Change the location of the local disk cache to this</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>NextLoginLocation</key> +        <map> +        <key>Comment</key> +            <string>Location to log into by default.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>NoAudio</key> +        <map> +        <key>Comment</key> +            <string>Disable audio playback.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>NoHardwareProbe</key> +        <map> +        <key>Comment</key> +            <string>Disable hardware probe.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>NoInventoryLibrary</key> +        <map> +        <key>Comment</key> +            <string>Do not request inventory library.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>NoPreload</key> +        <map> +        <key>Comment</key> +            <string>Disable sound and image preload.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>NoQuickTime</key> +        <map> +        <key>Comment</key> +            <string>Disable quicktime playback.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>NoVerifySSLCert</key> +        <map> +        <key>Comment</key> +            <string>Do not verify SSL peers.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>NotecardEditorRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for notecard editor</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>400</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>NotifyBoxHeight</key> +        <map> +        <key>Comment</key> +            <string>Height of notification messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>200</integer> +        </map> +    <key>NotifyBoxWidth</key> +        <map> +        <key>Comment</key> +            <string>Width of notification messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>350</integer> +        </map> +    <key>NotifyMoneyChange</key> +        <map> +        <key>Comment</key> +            <string>Pop up notifications for all L$ transactions</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>NotifyTipDuration</key> +        <map> +        <key>Comment</key> +            <string>Length of time that notification tips stay on screen (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>4</real> +        </map> +    <key>NumSessions</key> +        <map> +        <key>Comment</key> +            <string>Number of successful logins to Second Life</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>NumpadControl</key> +        <map> +        <key>Comment</key> +            <string>How numpad keys control your avatar. 0 = Like the normal arrow keys, 1 = Numpad moves avatar when numlock is off, 2 = Numpad moves avatar regardless of numlock (use this if you have no numlock)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ObjectChatColor</key> +        <map> +        <key>Comment</key> +            <string>Color of chat messages from objects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.699999988079071044921875</real> +                <real>0.89999997615814208984375</real> +                <real>0.699999988079071044921875</real> +                <real>1</real> +            </array> +        </map> +    <key>OpenDebugStatAdvanced</key> +        <map> +        <key>Comment</key> +            <string>Expand advanced performance stats display</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>OpenDebugStatBasic</key> +        <map> +        <key>Comment</key> +            <string>Expand basic performance stats display</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>OpenDebugStatNet</key> +        <map> +        <key>Comment</key> +            <string>Expand network stats display</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>OpenDebugStatRender</key> +        <map> +        <key>Comment</key> +            <string>Expand render stats display</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>OpenDebugStatSim</key> +        <map> +        <key>Comment</key> +            <string>Expand simulator performance stats display</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>OutBandwidth</key> +        <map> +        <key>Comment</key> +            <string>Outgoing bandwidth throttle (bps)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0</real> +        </map> +    <key>OverdrivenColor</key> +        <map> +        <key>Comment</key> +            <string>Color of various indicators when resident is speaking too loud.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>0</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>OverlayTitle</key> +        <map> +        <key>Comment</key> +            <string>Controls watermark text message displayed on screen when "ShowOverlayTitle" is enabled (one word, underscores become spaces)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>Set_via_OverlayTitle_in_settings.xml</string> +        </map> +    <key>PTTCurrentlyEnabled</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>PacketDropPercentage</key> +        <map> +        <key>Comment</key> +            <string>Percentage of packets dropped by the client.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0</real> +        </map> +    <key>PermissionsCautionEnabled</key> +        <map> +        <key>Comment</key> +            <string>When enabled, changes the handling of script permission requests to help avoid accidental granting of certain permissions, such as the debit permission</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>PermissionsCautionNotifyBoxHeight</key> +        <map> +        <key>Comment</key> +            <string>Height of caution-style notification messages</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>344</integer> +        </map> +    <key>PermissionsManagerRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for permissions manager window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>85</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PickerContextOpacity</key> +        <map> +        <key>Comment</key> +            <string>Controls overall opacity of context frustrum connecting color and texture pickers with their swatches</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.3499999940395355224609375</real> +        </map> +    <key>PieMenuLineWidth</key> +        <map> +        <key>Comment</key> +            <string>Width of lines in pie menu display (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>2.5</real> +        </map> +    <key>PinTalkViewOpen</key> +        <map> +        <key>Comment</key> +            <string>Stay in IM after hitting return</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>PingInterpolate</key> +        <map> +        <key>Comment</key> +            <string>Extrapolate object position along velocity vector based on ping delay</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>PitchFromMousePosition</key> +        <map> +        <key>Comment</key> +            <string>Vertical range over which avatar head tracks mouse position (degrees of head rotation from top of window to bottom)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>90</real> +        </map> +    <key>PlayTypingAnim</key> +        <map> +        <key>Comment</key> +            <string>Your avatar plays the typing animation whenever you type in the chat bar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>PrecachingDelay</key> +        <map> +        <key>Comment</key> +            <string>Delay when logging in to load world before showing it (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>6</real> +        </map> +    <key>PreviewAnimRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for animation preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>85</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewClassifiedRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for URL preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>530</integer> +                <integer>420</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewEventRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for Event preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>530</integer> +                <integer>420</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewLandmarkRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for landmark preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>90</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewObjectRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for object preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>85</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewScriptRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for script preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>550</integer> +                <integer>500</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewSoundRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for sound preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>85</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewTextureRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for texture preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>400</integer> +                <integer>400</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewURLRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for URL preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>90</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PreviewWearableRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for wearable preview window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>85</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>ProbeHardwareOnStartup</key> +        <map> +        <key>Comment</key> +            <string>Query current hardware configuration on application startup</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>PropertiesRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for inventory item properties window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>320</integer> +                <integer>350</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>PurgeCacheOnNextStartup</key> +        <map> +        <key>Comment</key> +            <string>Clear local file cache next time viewer is run</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>PurgeCacheOnStartup</key> +        <map> +        <key>Comment</key> +            <string>Clear local file cache every time viewer is run</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>PushToTalkButton</key> +        <map> +        <key>Comment</key> +            <string>Which button or keyboard key is used for push-to-talk</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>MiddleMouse</string> +        </map> +    <key>PushToTalkToggle</key> +        <map> +        <key>Comment</key> +            <string>Should the push-to-talk button behave as a toggle</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>QAMode</key> +        <map> +        <key>Comment</key> +            <string>Enable Testing Features.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>QuietSnapshotsToDisk</key> +        <map> +        <key>Comment</key> +            <string>Take snapshots to disk without playing animation or sound</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>QuitAfterSeconds</key> +        <map> +        <key>Comment</key> +            <string>The duration allowed before quitting.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0</real> +        </map> +    <key>RadioLandBrushAction</key> +        <map> +        <key>Comment</key> +            <string>Last selected land modification operation (0 = flatten, 1 = raise, 2 = lower, 3 = smooth, 4 = roughen, 5 = revert)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RadioLandBrushSize</key> +        <map> +        <key>Comment</key> +            <string>Size of land modification brush (0 = small, 1 = medium, 2 = large)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RecentItemsSortOrder</key> +        <map> +        <key>Comment</key> +            <string>Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RectangleSelectInclusive</key> +        <map> +        <key>Comment</key> +            <string>Select objects that have at least one vertex inside selection rectangle</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RegionTextureSize</key> +        <map> +        <key>Comment</key> +            <string>Terrain texture dimensions (power of 2)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>256</integer> +        </map> +    <key>RememberPassword</key> +        <map> +        <key>Comment</key> +            <string>Keep password (in encrypted form) for next login</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderAnisotropic</key> +        <map> +        <key>Comment</key> +            <string>Render textures using anisotropic filtering</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderAppleUseMultGL</key> +        <map> +        <key>Comment</key> +            <string>Whether we want to use multi-threaded OpenGL on Apple hardware (requires restart of SL).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderAvatarCloth</key> +        <map> +        <key>Comment</key> +            <string>Controls if avatars use wavy cloth</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderAvatarLODFactor</key> +        <map> +        <key>Comment</key> +            <string>Controls level of detail of avatars (multiplier for current screen area when calculated level of detail)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>RenderAvatarMaxVisible</key> +        <map> +        <key>Comment</key> +            <string>Maximum number of avatars to display at any one time</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>35</integer> +        </map> +    <key>RenderAvatarVP</key> +        <map> +        <key>Comment</key> +            <string>Use vertex programs to perform hardware skinning of avatar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderBumpmapMinDistanceSquared</key> +        <map> +        <key>Comment</key> +            <string>Maximum distance at which to render bumpmapped primitives (distance in meters, squared)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>100</real> +        </map> +    <key>RenderCubeMap</key> +        <map> +        <key>Comment</key> +            <string>Whether we can render the cube map or not</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderCustomSettings</key> +        <map> +        <key>Comment</key> +            <string>Do you want to set the graphics settings yourself</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderDebugTextureBind</key> +        <map> +        <key>Comment</key> +            <string>Enable texture bind performance test.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderDynamicLOD</key> +        <map> +        <key>Comment</key> +            <string>Dynamically adjust level of detail.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderDynamicReflections</key> +        <map> +        <key>Comment</key> +            <string>Generate a dynamic cube map for reflections (objects reflect their environment, experimental).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderFarClip</key> +        <map> +        <key>Comment</key> +            <string>Distance of far clip plane from camera (meters)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>256</real> +        </map> +    <key>RenderFastUI</key> +        <map> +        <key>Comment</key> +            <string>[NOT USED]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderFlexTimeFactor</key> +        <map> +        <key>Comment</key> +            <string>Controls level of detail of flexible objects (multiplier for amount of time spent processing flex objects)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>RenderFogRatio</key> +        <map> +        <key>Comment</key> +            <string>Distance from camera where fog reaches maximum density (fraction or multiple of far clip distance)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>4.0</real> +        </map> +    <key>RenderGamma</key> +        <map> +        <key>Comment</key> +            <string>Sets gamma exponent for renderer</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0</real> +        </map> +    <key>RenderGammaFull</key> +        <map> +        <key>Comment</key> +            <string>Use fully controllable gamma correction, instead of faster, hard-coded gamma correction of 2.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>RenderGlow</key> +        <map> +        <key>Comment</key> +            <string>Render bloom post effect.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderGlowIterations</key> +        <map> +        <key>Comment</key> +            <string>Number of times to iterate the glow (higher = wider and smoother but slower)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>RenderGlowLumWeights</key> +        <map> +        <key>Comment</key> +            <string>Weights for each color channel to be used in calculating luminance (should add up to 1.0)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3</string> +        <key>Value</key> +            <array> +                <real>0.299</real> +                <real>0.587</real> +                <real>0.114</real> +            </array> +        </map> +    <key>RenderGlowMaxExtractAlpha</key> +        <map> +        <key>Comment</key> +            <string>Max glow alpha value for brightness extraction to auto-glow.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.065</real> +        </map> +    <key>RenderGlowMinLuminance</key> +        <map> +        <key>Comment</key> +            <string>Min luminance intensity necessary to consider an object bright enough to automatically glow. (Gets clamped to 0 - 1.0 range)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1.0</real> +        </map> +    <key>RenderGlowResolutionPow</key> +        <map> +        <key>Comment</key> +            <string>Glow map resolution power of two.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>9</integer> +        </map> +    <key>RenderGlowStrength</key> +        <map> +        <key>Comment</key> +            <string>Additive strength of glow.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.35</real> +        </map> +    <key>RenderGlowWarmthAmount</key> +        <map> +        <key>Comment</key> +            <string>Amount of warmth extraction to use (versus luminance extraction). 0 = lum, 1.0 = warmth</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0</real> +        </map> +    <key>RenderGlowWarmthWeights</key> +        <map> +        <key>Comment</key> +            <string>Weight of each color channel used before finding the max warmth</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3</string> +        <key>Value</key> +            <array> +                <real>1.0</real> +                <real>0.5</real> +                <real>0.7</real> +            </array> +        </map> +    <key>RenderGlowWidth</key> +        <map> +        <key>Comment</key> +            <string>Glow sample size (higher = wider and softer but eventually more pixelated)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1.3</real> +        </map> +    <key>RenderHUDInSnapshot</key> +        <map> +        <key>Comment</key> +            <string>Display HUD attachments in snapshot</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderHiddenSelections</key> +        <map> +        <key>Comment</key> +            <string>Show selection lines on objects that are behind other objects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderHideGroupTitle</key> +        <map> +        <key>Comment</key> +            <string>Don't show my group title in my name label</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderHideGroupTitleAll</key> +        <map> +        <key>Comment</key> +            <string>Show group titles in name labels</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderInitError</key> +        <map> +        <key>Comment</key> +            <string>Error occured while initializing GL</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderLightRadius</key> +        <map> +        <key>Comment</key> +            <string>Render the radius of selected lights</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderLightingDetail</key> +        <map> +        <key>Comment</key> +            <string>Amount of detail for lighting objects/avatars/terrain (0=sun/moon only, 1=enable local lights)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderMaxPartCount</key> +        <map> +        <key>Comment</key> +            <string>Maximum number of particles to display on screen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>4096</integer> +        </map> +    <key>RenderMaxVBOSize</key> +        <map> +        <key>Comment</key> +            <string>Maximum size of a vertex buffer (in KB).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>32</integer> +        </map> +    <key>RenderName</key> +        <map> +        <key>Comment</key> +            <string>Controls display of names above avatars (0 = never, 1 = fade, 2 = always)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>RenderNameFadeDuration</key> +        <map> +        <key>Comment</key> +            <string>Time interval over which to fade avatar names (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>RenderNameHideSelf</key> +        <map> +        <key>Comment</key> +            <string>Don't display own name above avatar</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderNameShowTime</key> +        <map> +        <key>Comment</key> +            <string>Fade avatar names after specified time (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>10</real> +        </map> +    <key>RenderObjectBump</key> +        <map> +        <key>Comment</key> +            <string>Show bumpmapping on primitives</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderQualityPerformance</key> +        <map> +        <key>Comment</key> +            <string>Which graphics settings you've chosen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderReflectionDetail</key> +        <map> +        <key>Comment</key> +            <string>Detail of reflection render pass.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>RenderReflectionRes</key> +        <map> +        <key>Comment</key> +            <string>Reflection map resolution.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>64</integer> +        </map> +    <key>RenderResolutionDivisor</key> +        <map> +        <key>Comment</key> +            <string>Divisor for rendering 3D scene at reduced resolution.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderShaderLODThreshold</key> +        <map> +        <key>Comment</key> +            <string>Fraction of draw distance defining the switch to a different shader LOD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <integer>1.0</integer> +        </map> +    <key>RenderSunDynamicRange</key> +        <map> +        <key>Comment</key> +            <string>Defines what percent brighter the sun is than local point lights (1.0 = 100% brighter. Value should not be less than 0. ).</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <integer>1.0</integer> +        </map> +    <key>RenderTerrainDetail</key> +        <map> +        <key>Comment</key> +            <string>Detail applied to terrain texturing (0 = none, 1 or 2 = full)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>RenderTerrainLODFactor</key> +        <map> +        <key>Comment</key> +            <string>Controls level of detail of terrain (multiplier for current screen area when calculated level of detail)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1.0</real> +        </map> +    <key>RenderTerrainScale</key> +        <map> +        <key>Comment</key> +            <string>Terrain detail texture scale</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>12</real> +        </map> +    <key>RenderTreeLODFactor</key> +        <map> +        <key>Comment</key> +            <string>Controls level of detail of vegetation (multiplier for current screen area when calculated level of detail)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>RenderUIInSnapshot</key> +        <map> +        <key>Comment</key> +            <string>Display user interface in snapshot</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderUseCleverUI</key> +        <map> +        <key>Comment</key> +            <string>Turns on the \"clever\" UI rendering optimization.  It's a known performace gain (and enabled by default) on apple.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderUseFarClip</key> +        <map> +        <key>Comment</key> +            <string>If false, frustum culling will ignore far clip plane.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderUseFBO</key> +        <map> +        <key>Comment</key> +            <string>Whether we want to use GL_EXT_framebuffer_objects.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderUseImpostors</key> +        <map> +        <key>Comment</key> +            <string>Whether we want to use impostors for far away avatars.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderUseShaderLOD</key> +        <map> +        <key>Comment</key> +            <string>Whether we want to have different shaders for LOD</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderUseShaderNearParticles</key> +        <map> +        <key>Comment</key> +            <string>Whether we want to use shaders on near particles</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderShaderParticleThreshold</key> +        <map> +        <key>Comment</key> +            <string>Fraction of draw distance to not use shader on particles</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.25</real> +        </map> +    <key>RenderVBOEnable</key> +        <map> +        <key>Comment</key> +            <string>Use GL Vertex Buffer Objects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderVolumeLODFactor</key> +        <map> +        <key>Comment</key> +            <string>Controls level of detail of primitives (multiplier for current screen area when calculated level of detail)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>RenderWater</key> +        <map> +        <key>Comment</key> +            <string>Display water</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderWaterMipNormal</key> +        <map> +        <key>Comment</key> +            <string>Use mip maps for water normal map.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>RenderWaterReflections</key> +        <map> +        <key>Comment</key> +            <string>Reflect the environment in the water.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RenderWaterRefResolution</key> +        <map> +        <key>Comment</key> +            <string>Water planar reflection resolution.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>512</integer> +        </map> +    <key>RotateRight</key> +        <map> +        <key>Comment</key> +            <string>Make the agent rotate to its right.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RotationStep</key> +        <map> +        <key>Comment</key> +            <string>All rotations via rotation tool are constrained to multiples of this unit (degrees)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>RunBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>RunMultipleThreads</key> +        <map> +        <key>Comment</key> +            <string>If TRUE keep background threads active during render</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SafeMode</key> +        <map> +        <key>Comment</key> +            <string>Reset preferences, run in safe mode.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ScaleShowAxes</key> +        <map> +        <key>Comment</key> +            <string>Show indicator of selected scale axis when scaling</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ScaleStretchTextures</key> +        <map> +        <key>Comment</key> +            <string>Stretch textures along with object when scaling</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ScaleUniform</key> +        <map> +        <key>Comment</key> +            <string>Scale selected objects evenly about center of selection</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ScriptErrorColor</key> +        <map> +        <key>Comment</key> +            <string>Color of script error messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.819999992847442626953125</real> +                <real>0.819999992847442626953125</real> +                <real>0.9900000095367431640625</real> +                <real>1</real> +            </array> +        </map> +    <key>ScriptErrorsAsChat</key> +        <map> +        <key>Comment</key> +            <string>Display script errors and warning in chat history</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ScriptHelpFollowsCursor</key> +        <map> +        <key>Comment</key> +            <string>Scripting help window updates contents based on script editor contents under text cursor</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SearchURLDefault</key> +        <map> +        <key>Comment</key> +            <string>URL to load for empty searches</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>http://secondlife.com/app/search/index.php?</string> +        </map> +    <key>SearchURLQuery</key> +        <map> +        <key>Comment</key> +            <string>URL to use for searches</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&s=[COLLECTION]&</string> +        </map> +    <key>SearchURLSuffix2</key> +        <map> +        <key>Comment</key> +            <string>Parameters added to end of search queries</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>lang=[LANG]&m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]</string> +        </map> +    <key>SelectMovableOnly</key> +        <map> +        <key>Comment</key> +            <string>Select only objects you can move</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SelectOwnedOnly</key> +        <map> +        <key>Comment</key> +            <string>Select only objects you own</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SelectionHighlightAlpha</key> +        <map> +        <key>Comment</key> +            <string>Opacity of selection highlight (0.0 = completely transparent, 1.0 = completely opaque)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.4000000059604644775390625</real> +        </map> +    <key>SelectionHighlightAlphaTest</key> +        <map> +        <key>Comment</key> +            <string>Alpha value below which pixels are displayed on selection highlight line (0.0 = show all pixels, 1.0 = show now pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>SelectionHighlightThickness</key> +        <map> +        <key>Comment</key> +            <string>Thickness of selection highlight line (fraction of view distance)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.009999999776482582092285156</real> +        </map> +    <key>SelectionHighlightUAnim</key> +        <map> +        <key>Comment</key> +            <string>Rate at which texture animates along U direction in selection highlight line (fraction of texture per second)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0</real> +        </map> +    <key>SelectionHighlightUScale</key> +        <map> +        <key>Comment</key> +            <string>Scale of texture display on selection highlight line (fraction of texture size)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.1000000014901161193847656</real> +        </map> +    <key>SelectionHighlightVAnim</key> +        <map> +        <key>Comment</key> +            <string>Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.5</real> +        </map> +    <key>SelectionHighlightVScale</key> +        <map> +        <key>Comment</key> +            <string>Scale of texture display on selection highlight line (fraction of texture size)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>ServerChoice</key> +        <map> +        <key>Comment</key> +            <string>[DO NOT MODIFY] Controls which grid you connect to</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowAllObjectHoverTip</key> +        <map> +        <key>Comment</key> +            <string>Show descriptive tooltip when mouse hovers over non-interactive and interactive objects.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowAxes</key> +        <map> +        <key>Comment</key> +            <string>Render coordinate frame at your position</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowCameraControls</key> +        <map> +        <key>Comment</key> +            <string>Display camera controls on login</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowChatHistory</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowCommunicate</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowConsoleWindow</key> +        <map> +        <key>Comment</key> +            <string>Show log in separate OS window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowCrosshairs</key> +        <map> +        <key>Comment</key> +            <string>Display crosshairs when in mouselook mode</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowDebugConsole</key> +        <map> +        <key>Comment</key> +            <string>Show log in SL window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowDebugStats</key> +        <map> +        <key>Comment</key> +            <string>Show performance stats display</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowDepthBuffer</key> +        <map> +        <key>Comment</key> +            <string>Show depth buffer contents</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowDirectory</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowEmptyFoldersWhenSearching</key> +        <map> +        <key>Comment</key> +            <string>Shows folders that do not have any visible contents when applying a filter to inventory</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowHoverTips</key> +        <map> +        <key>Comment</key> +            <string>Show descriptive tooltip when mouse hovers over items in world</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowInventory</key> +        <map> +        <key>Comment</key> +            <string>Open inventory window on login</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowLandHoverTip</key> +        <map> +        <key>Comment</key> +            <string>Show descriptive tooltip when mouse hovers over land</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowLeaders</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowMatureClassifieds</key> +        <map> +        <key>Comment</key> +            <string>Display results of find classifieds that are flagged as mature</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowMatureEvents</key> +        <map> +        <key>Comment</key> +            <string>Display results of find events that are flagged as mature</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowMatureFindAll</key> +        <map> +        <key>Comment</key> +            <string>Display results of find all that are in mature sims</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowMatureGroups</key> +        <map> +        <key>Comment</key> +            <string>Display results of find groups that are in flagged as mature</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowMatureSims</key> +        <map> +        <key>Comment</key> +            <string>Display results of find places or find popular that are in mature sims</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowMiniMap</key> +        <map> +        <key>Comment</key> +            <string>Display mini map on login</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowMovementControls</key> +        <map> +        <key>Comment</key> +            <string>Display movement controls on login</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowNearClip</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowNewInventory</key> +        <map> +        <key>Comment</key> +            <string>Automatically views new notecards/textures/landmarks</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowObjectUpdates</key> +        <map> +        <key>Comment</key> +            <string>Show when update messages are received for individual objects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowOverlayTitle</key> +        <map> +        <key>Comment</key> +            <string>Prints watermark text message on screen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowParcelOwners</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowPermissions</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowPropertyLines</key> +        <map> +        <key>Comment</key> +            <string>Show line overlay demarking property boundaries</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowSearchBar</key> +        <map> +        <key>Comment</key> +            <string>Show the Search Bar in the Status Overlay</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowSelectionBeam</key> +        <map> +        <key>Comment</key> +            <string>Show selection particle beam when selecting or interacting with objects.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowStartLocation</key> +        <map> +        <key>Comment</key> +            <string>Display starting location menu on login screen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowTangentBasis</key> +        <map> +        <key>Comment</key> +            <string>Render normal and binormal (debugging bump mapping)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowToolBar</key> +        <map> +        <key>Comment</key> +            <string>Show toolbar at bottom of screen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ShowTools</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowVoiceChannelPopup</key> +        <map> +        <key>Comment</key> +            <string>Controls visibility of the current voice channel popup above the voice tab</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowVolumeSettingsPopup</key> +        <map> +        <key>Comment</key> +            <string>Show individual volume slider for voice, sound effects, etc</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowWorldMap</key> +        <map> +        <key>Comment</key> +            <string>Display world map on login</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ShowXUINames</key> +        <map> +        <key>Comment</key> +            <string>Display XUI Names as Tooltips</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SitBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SkinFolder</key> +        <map> +        <key>Comment</key> +            <string>The skin folder to use.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>SkyAmbientScale</key> +        <map> +        <key>Comment</key> +            <string>Controls strength of ambient, or non-directional light from the sun and moon (fraction or multiple of default ambient level)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.300000011920928955078125</real> +        </map> +    <key>SkyNightColorShift</key> +        <map> +        <key>Comment</key> +            <string>Controls moonlight color (base color applied to moon as light source)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color3</string> +        <key>Value</key> +            <array> +                <real>0.699999988079071044921875</real> +                <real>0.699999988079071044921875</real> +                <real>1</real> +            </array> +        </map> +    <key>SkyOverrideSimSunPosition</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SkySunDefaultPosition</key> +        <map> +        <key>Comment</key> +            <string>Default position of sun in sky (direction in world coordinates)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Vector3</string> +        <key>Value</key> +            <array> +                <real>1</real> +                <real>0</real> +                <real>0.1000000014901161193847656</real> +            </array> +        </map> +	<key>SkyUseClassicClouds</key> +		<map> +		<key>Comment</key> +			<string>Whether to use the old Second Life particle clouds or not</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>Boolean</string> +		<key>Value</key> +			<integer>1</integer> +		</map> +    <key>SlideLeftBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>20</integer> +                <integer>54</integer> +                <integer>45</integer> +                <integer>29</integer> +            </array> +        </map> +    <key>SlideRightBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>66</integer> +                <integer>54</integer> +                <integer>91</integer> +                <integer>29</integer> +            </array> +        </map> +    <key>SmallAvatarNames</key> +        <map> +        <key>Comment</key> +            <string>Display avatar name text in smaller font</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>SnapEnabled</key> +        <map> +        <key>Comment</key> +            <string>Enable snapping to grid</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>SnapMargin</key> +        <map> +        <key>Comment</key> +            <string>Controls maximum distance between windows before they auto-snap together (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>10</integer> +        </map> +    <key>SnapToMouseCursor</key> +        <map> +        <key>Comment</key> +            <string>When snapping to grid, center object on nearest grid point to mouse cursor</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SnapshotLocalLastResolution</key> +        <map> +        <key>Comment</key> +            <string>Take next local snapshot at this resolution</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SnapshotPostcardLastResolution</key> +        <map> +        <key>Comment</key> +            <string>Take next postcard snapshot at this resolution</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SnapshotQuality</key> +        <map> +        <key>Comment</key> +            <string>Quality setting of postcard JPEGs (0 = worst, 100 = best)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>75</integer> +        </map> +    <key>SnapshotTextureLastResolution</key> +        <map> +        <key>Comment</key> +            <string>Take next texture snapshot at this resolution</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>SpeakingColor</key> +        <map> +        <key>Comment</key> +            <string>Color of various indicators when resident is speaking on a voice channel.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0</real> +                <real>1</real> +                <real>0</real> +                <real>1</real> +            </array> +        </map> +    <key>SpeedTest</key> +        <map> +        <key>Comment</key> +            <string>Performance testing mode, no network</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>StatsAutoRun</key> +        <map> +        <key>Comment</key> +            <string>Play back autopilot</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>StatsFile</key> +        <map> +        <key>Comment</key> +            <string>Filename for stats logging output</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>fs.txt</string> +        </map> +    <key>StatsNumRuns</key> +        <map> +        <key>Comment</key> +            <string>Loop autopilot playback this number of times</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>-1</integer> +        </map> +    <key>StatsPilotFile</key> +        <map> +        <key>Comment</key> +            <string>Filename for stats logging autopilot path</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>pilot.txt</string> +        </map> +    <key>StatsQuitAfterRuns</key> +        <map> +        <key>Comment</key> +            <string>Quit application after this number of autopilot playback runs</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>StatsSessionTrackFrameStats</key> +        <map> +        <key>Comment</key> +            <string>Track rendering and network statistics</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>StatsSummaryFile</key> +        <map> +        <key>Comment</key> +            <string>Filename for stats logging summary</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>fss.txt</string> +        </map> +    <key>StatusBarHeight</key> +        <map> +        <key>Comment</key> +            <string>Height of menu/status bar at top of screen (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>26</integer> +        </map> +    <key>StatusBarPad</key> +        <map> +        <key>Comment</key> +            <string>Spacing between popup buttons at bottom of screen (Stand up, Release Controls)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>10</integer> +        </map> +    <key>SystemChatColor</key> +        <map> +        <key>Comment</key> +            <string>Color of chat messages from SL System</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.800000011920928955078125</real> +                <real>1</real> +                <real>1</real> +                <real>1</real> +            </array> +        </map> +    <key>SystemLanguage</key> +        <map> +        <key>Comment</key> +            <string>Language indicated by system settings (for XUI)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>en-us</string> +        </map> +    <key>TabToTextFieldsOnly</key> +        <map> +        <key>Comment</key> +            <string>TAB key takes you to next text entry field, instead of next widget</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>TerrainColorHeightRange</key> +        <map> +        <key>Comment</key> +            <string>Altitude range over which a given terrain texture has effect (meters)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>60</real> +        </map> +    <key>TerrainColorStartHeight</key> +        <map> +        <key>Comment</key> +            <string>Starting altitude for terrain texturing (meters)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>20</real> +        </map> +    <key>TextureMemory</key> +        <map> +        <key>Comment</key> +            <string>Amount of memory to use for textures in MB (0 = autodetect)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>TexturePickerRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for texture picker</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>290</integer> +                <integer>350</integer> +                <integer>0</integer> +            </array> +        </map> +    <key>TexturePickerShowFolders</key> +        <map> +        <key>Comment</key> +            <string>Show folders with no texures in texture picker</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>TexturePickerSortOrder</key> +        <map> +        <key>Comment</key> +            <string>Specifies sort key for textures in texture picker (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>2</integer> +        </map> +    <key>ThirdPersonBtnState</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>ThrottleBandwidthKBPS</key> +        <map> +        <key>Comment</key> +            <string>Maximum allowable downstream bandwidth (kilo bits per second)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>500</real> +        </map> +    <key>ToolHelpRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>8</integer> +                <integer>178</integer> +                <integer>75</integer> +                <integer>162</integer> +            </array> +        </map> +    <key>ToolTipDelay</key> +        <map> +        <key>Comment</key> +            <string>Seconds before displaying tooltip when mouse stops over UI element</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.699999988079071044921875</real> +        </map> +    <key>ToolboxAutoMove</key> +        <map> +        <key>Comment</key> +            <string>[NOT USED]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>ToolboxRect</key> +        <map> +        <key>Comment</key> +            <string>Rectangle for tools window</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>0</integer> +                <integer>100</integer> +                <integer>100</integer> +                <integer>100</integer> +            </array> +        </map> +    <key>ToolboxShowMore</key> +        <map> +        <key>Comment</key> +            <string>Whether to show additional build tool controls</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>TrackFocusObject</key> +        <map> +        <key>Comment</key> +            <string>Camera tracks last object zoomed on</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>TurnLeftBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>20</integer> +                <integer>29</integer> +                <integer>45</integer> +                <integer>4</integer> +            </array> +        </map> +    <key>TurnRightBtnRect</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Rect</string> +        <key>Value</key> +            <array> +                <integer>66</integer> +                <integer>29</integer> +                <integer>91</integer> +                <integer>4</integer> +            </array> +        </map> +    <key>TypeAheadTimeout</key> +        <map> +        <key>Comment</key> +            <string>Time delay before clearing type-ahead buffer in lists (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1.5</real> +        </map> +    <key>UIAutoScale</key> +        <map> +        <key>Comment</key> +            <string>Keep UI scale consistent across different resolutions</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>UIFloaterTestBool</key> +        <map> +        <key>Comment</key> +            <string>Example saved setting for the test floater</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UIImgBtnCloseActiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +        </map> +    <key>UIImgBtnCloseInactiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>779e4fa3-9b13-f74a-fba9-3886fe9c86ba</string> +        </map> +    <key>UIImgBtnClosePressedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +        </map> +    <key>UIImgBtnForwardInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>54197a61-f5d1-4c29-95d2-c071d08849cb</string> +        </map> +    <key>UIImgBtnForwardOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>a0eb4021-1b20-4a53-892d-8faa9265a6f5</string> +        </map> +    <key>UIImgBtnJumpLeftInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>9cad3e6d-2d6d-107d-f8ab-5ba272b5bfe1</string> +        </map> +    <key>UIImgBtnJumpLeftOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>3c18c87e-5f50-14e2-e744-f44734aa365f</string> +        </map> +    <key>UIImgBtnJumpRightInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7dabc040-ec13-2309-ddf7-4f161f6de2f4</string> +        </map> +    <key>UIImgBtnJumpRightOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>ff9a71eb-7414-4cf8-866e-a701deb7c3cf</string> +        </map> +    <key>UIImgBtnLeftInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>95463c78-aaa6-464d-892d-3a805b6bb7bf</string> +        </map> +    <key>UIImgBtnLeftOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>13a93910-6b44-45eb-ad3a-4d1324c59bac</string> +        </map> +    <key>UIImgBtnMinimizeActiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>34c9398d-bb78-4643-9633-46a2fa3e9637</string> +        </map> +    <key>UIImgBtnMinimizeInactiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>6e72abba-1378-437f-bf7a-f0c15f3e99a3</string> +        </map> +    <key>UIImgBtnMinimizePressedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>39801651-26cb-4926-af57-7af9352c273c</string> +        </map> +    <key>UIImgBtnMoveDownInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>b92a70b9-c841-4c94-b4b3-cee9eb460d48</string> +        </map> +    <key>UIImgBtnMoveDownOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>b5abc9fa-9e62-4e03-bc33-82c4c1b6b689</string> +        </map> +    <key>UIImgBtnMoveUpInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>49b4b357-e430-4b56-b9e0-05b8759c3c82</string> +        </map> +    <key>UIImgBtnMoveUpOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>f887146d-829f-4e39-9211-cf872b78f97c</string> +        </map> +    <key>UIImgBtnPanDownInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +        </map> +    <key>UIImgBtnPanDownOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +        </map> +    <key>UIImgBtnPanLeftInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +        </map> +    <key>UIImgBtnPanLeftOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +        </map> +    <key>UIImgBtnPanRightInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +        </map> +    <key>UIImgBtnPanRightOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +        </map> +    <key>UIImgBtnPanUpInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>e5821134-23c0-4bd0-af06-7fa95b9fb01a</string> +        </map> +    <key>UIImgBtnPanUpOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>47a8c844-cd2a-4b1a-be01-df8b1612fe5d</string> +        </map> +    <key>UIImgBtnRestoreActiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>111b39de-8928-4690-b7b2-e17d5c960277</string> +        </map> +    <key>UIImgBtnRestoreInactiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>0eafa471-70af-4882-b8c1-40a310929744</string> +        </map> +    <key>UIImgBtnRestorePressedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>90a0ed5c-2e7b-4845-9958-a64a1b30f312</string> +        </map> +    <key>UIImgBtnRightInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5e616d0d-4335-476f-9977-560bccd009da</string> +        </map> +    <key>UIImgBtnRightOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5a44fd04-f52b-4c30-8b00-4a31e27614bd</string> +        </map> +    <key>UIImgBtnScrollDownInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>d2421bab-2eaf-4863-b8f6-5e4c52519247</string> +        </map> +    <key>UIImgBtnScrollDownOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>b4ecdecf-5c8d-44e7-b882-17a77e88ed55</string> +        </map> +    <key>UIImgBtnScrollLeftInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>ea137a32-6718-4d05-9c22-7d570d27b2cd</string> +        </map> +    <key>UIImgBtnScrollLeftOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>43773e8d-49aa-48e0-80f3-a04715f4677a</string> +        </map> +    <key>UIImgBtnScrollRightInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>b749de64-e903-4c3c-ac0b-25fb6fa39cb5</string> +        </map> +    <key>UIImgBtnScrollRightOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>3d700d19-e708-465d-87f2-46c8c0ee7938</string> +        </map> +    <key>UIImgBtnScrollUpInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>a93abdf3-27b5-4e22-a8fa-c48216cd2e3a</string> +        </map> +    <key>UIImgBtnScrollUpOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>dad084d7-9a46-452a-b0ff-4b9f1cefdde9</string> +        </map> +    <key>UIImgBtnSlideLeftInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>724996f5-b956-46f6-9844-4fcfce1d5e83</string> +        </map> +    <key>UIImgBtnSlideLeftOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>82476321-0374-4c26-9567-521535ab4cd7</string> +        </map> +    <key>UIImgBtnSlideRightInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7eeb57d2-3f37-454d-a729-8b217b8be443</string> +        </map> +    <key>UIImgBtnSlideRightOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>1fbe4e60-0607-44d1-a50a-032eff56ae75</string> +        </map> +    <key>UIImgBtnSpinDownInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>a985ac71-052f-48e6-9c33-d931c813ac92</string> +        </map> +    <key>UIImgBtnSpinDownOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>b6d240dd-5602-426f-b606-bbb49a30726d</string> +        </map> +    <key>UIImgBtnSpinUpInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c8450082-96a0-4319-8090-d3ff900b4954</string> +        </map> +    <key>UIImgBtnSpinUpOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>56576e6e-6710-4e66-89f9-471b59122794</string> +        </map> +    <key>UIImgBtnTabBottomInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c001d8fd-a869-4b6f-86a1-fdcb106df9c7</string> +        </map> +    <key>UIImgBtnTabBottomOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>bf0a8779-689b-48c3-bb9a-6af546366ef4</string> +        </map> +    <key>UIImgBtnTabBottomPartialInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>eb0b0904-8c91-4f24-b500-1180b91140de</string> +        </map> +    <key>UIImgBtnTabBottomPartialOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>8dca716c-b29c-403a-9886-91c028357d6e</string> +        </map> +    <key>UIImgBtnTabTopInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>16d032e8-817b-4368-8a4e-b7b947ae3889</string> +        </map> +    <key>UIImgBtnTabTopOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>1ed83f57-41cf-4052-a3b4-2e8bb78d8191</string> +        </map> +    <key>UIImgBtnTabTopPartialInUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7c6c6c26-0e25-4438-89bd-30d8b8e9d704</string> +        </map> +    <key>UIImgBtnTabTopPartialOutUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>932ad585-0e45-4a57-aa23-4cf81beeb7b0</string> +        </map> +    <key>UIImgBtnTearOffActiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string> +        </map> +    <key>UIImgBtnTearOffInactiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>74e1a96f-4833-a24d-a1bb-1bce1468b0e7</string> +        </map> +    <key>UIImgBtnTearOffPressedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>d2524c13-4ba6-af7c-e305-8ac6cc18d86a</string> +        </map> +    <key>UIImgCheckboxActiveSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>cf4a2ed7-1533-4686-9dde-df9a37ddca55</string> +        </map> +    <key>UIImgCheckboxActiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>05bb64ee-96fd-4243-b74e-f40a41bc53ba</string> +        </map> +    <key>UIImgCheckboxInactiveSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c817c642-9abd-4236-9287-ae0513fe7d2b</string> +        </map> +    <key>UIImgCheckboxInactiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7d94cb59-32a2-49bf-a516-9e5a2045f9d9</string> +        </map> +    <key>UIImgCreateSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>0098b015-3daf-4cfe-a72f-915369ea97c2</string> +        </map> +    <key>UIImgCreateUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7a0b1bdb-b5d9-4df5-bac2-ba230da93b5b</string> +        </map> +    <key>UIImgCrosshairsUUID</key> +        <map> +        <key>Comment</key> +            <string>Image to use for crosshair display (UUID texture reference)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>6e1a3980-bf2d-4274-8970-91e60d85fb52</string> +        </map> +    <key>UIImgDefaultEyesUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>6522e74d-1660-4e7f-b601-6f48c1659a77</string> +        </map> +    <key>UIImgDefaultGlovesUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDefaultHairUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7ca39b4c-bd19-4699-aff7-f93fd03d3e7b</string> +        </map> +    <key>UIImgDefaultJacketUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDefaultPantsUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDefaultShirtUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDefaultShoesUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDefaultSkirtUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDefaultSocksUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDefaultUnderwearUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIImgDirectionArrowUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>586383e8-4d9b-4fba-9196-2b5938e79c2c</string> +        </map> +    <key>UIImgFaceSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>b4870163-6208-42a9-9801-93133bf9a6cd</string> +        </map> +    <key>UIImgFaceUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>ce15fd63-b0b6-463c-a37d-ea6393208b3e</string> +        </map> +    <key>UIImgFocusSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>ab6a730e-ddfd-4982-9a32-c6de3de6d31d</string> +        </map> +    <key>UIImgFocusUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>57bc39d1-288c-4519-aea6-6d1786a5c274</string> +        </map> +    <key>UIImgGrabSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c1e21504-f136-451d-b8e9-929037812f1d</string> +        </map> +    <key>UIImgGrabUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c63f124c-6340-4fbf-b59e-0869a44adb64</string> +        </map> +    <key>UIImgMoveSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>46f17c7b-8381-48c3-b628-6a406e060dd6</string> +        </map> +    <key>UIImgMoveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>2fa5dc06-bcdd-4e09-a426-f9f262d4fa65</string> +        </map> +    <key>UIImgRadioActiveSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>52f09e07-5816-4052-953c-94c6c10479b7</string> +        </map> +    <key>UIImgRadioActiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7a1ba9b8-1047-4d1e-9cfc-bc478c80b63f</string> +        </map> +    <key>UIImgRadioInactiveSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>1975db39-aa29-4251-aea0-409ac09d414d</string> +        </map> +    <key>UIImgRadioInactiveUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>90688481-67ff-4af0-be69-4aa084bcad1e</string> +        </map> +    <key>UIImgResizeBottomRightUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>e3690e25-9690-4f6c-a745-e7dcd885285a</string> +        </map> +    <key>UIImgRotateSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>cdfb7fde-0d13-418a-9d89-2bd91019fc95</string> +        </map> +    <key>UIImgRotateUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c34b1eaa-aae3-4351-b082-e26c0b636779</string> +        </map> +    <key>UIImgScaleSelectedUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>55aa57ef-508a-47f7-8867-85d21c5a810d</string> +        </map> +    <key>UIImgScaleUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>88a90fef-b448-4883-9344-ecf378a60433</string> +        </map> +    <key>UIImgWhiteUUID</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5748decc-f629-461c-9a36-a35a221fe21f</string> +        </map> +    <key>UIScaleFactor</key> +        <map> +        <key>Comment</key> +            <string>Size of UI relative to default layout on 1024x768 screen</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>1</real> +        </map> +    <key>UISndAlert</key> +        <map> +        <key>Comment</key> +            <string>Sound file for alerts (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>ed124764-705d-d497-167a-182cd9fa2e6c</string> +        </map> +    <key>UISndBadKeystroke</key> +        <map> +        <key>Comment</key> +            <string>Sound file for invalid keystroke (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>2ca849ba-2885-4bc3-90ef-d4987a5b983a</string> +        </map> +    <key>UISndClick</key> +        <map> +        <key>Comment</key> +            <string>Sound file for mouse click (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string> +        </map> +    <key>UISndClickRelease</key> +        <map> +        <key>Comment</key> +            <string>Sound file for mouse button release (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>4c8c3c77-de8d-bde2-b9b8-32635e0fd4a6</string> +        </map> +    <key>UISndDebugSpamToggle</key> +        <map> +        <key>Comment</key> +            <string>Log UI sound effects as they are played</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UISndHealthReductionF</key> +        <map> +        <key>Comment</key> +            <string>Sound file for female pain (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>219c5d93-6c09-31c5-fb3f-c5fe7495c115</string> +        </map> +    <key>UISndHealthReductionM</key> +        <map> +        <key>Comment</key> +            <string>Sound file for male pain (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>e057c244-5768-1056-c37e-1537454eeb62</string> +        </map> +    <key>UISndHealthReductionThreshold</key> +        <map> +        <key>Comment</key> +            <string>Amount of health reduction required to trigger "pain" sound</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>10</real> +        </map> +    <key>UISndInvalidOp</key> +        <map> +        <key>Comment</key> +            <string>Sound file for invalid operations (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>4174f859-0d3d-c517-c424-72923dc21f65</string> +        </map> +    <key>UISndMoneyChangeDown</key> +        <map> +        <key>Comment</key> +            <string>Sound file for L$ balance increase (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>104974e3-dfda-428b-99ee-b0d4e748d3a3</string> +        </map> +    <key>UISndMoneyChangeThreshold</key> +        <map> +        <key>Comment</key> +            <string>Amount of change in L$ balance required to trigger "money" sound</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>50</real> +        </map> +    <key>UISndMoneyChangeUp</key> +        <map> +        <key>Comment</key> +            <string>Sound file for L$ balance decrease(uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>77a018af-098e-c037-51a6-178f05877c6f</string> +        </map> +    <key>UISndNewIncomingIMSession</key> +        <map> +        <key>Comment</key> +            <string>Sound file for new instant message session(uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>67cc2844-00f3-2b3c-b991-6418d01e1bb7</string> +        </map> +    <key>UISndObjectCreate</key> +        <map> +        <key>Comment</key> +            <string>Sound file for object creation (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>f4a0660f-5446-dea2-80b7-6482a082803c</string> +        </map> +    <key>UISndObjectDelete</key> +        <map> +        <key>Comment</key> +            <string>Sound file for object deletion (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>0cb7b00a-4c10-6948-84de-a93c09af2ba9</string> +        </map> +    <key>UISndObjectRezIn</key> +        <map> +        <key>Comment</key> +            <string>Sound file for rezzing objects (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>3c8fc726-1fd6-862d-fa01-16c5b2568db6</string> +        </map> +    <key>UISndObjectRezOut</key> +        <map> +        <key>Comment</key> +            <string>Sound file for derezzing objects (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>00000000-0000-0000-0000-000000000000</string> +        </map> +    <key>UISndPieMenuAppear</key> +        <map> +        <key>Comment</key> +            <string>Sound file for opening pie menu (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>8eaed61f-92ff-6485-de83-4dcc938a478e</string> +        </map> +    <key>UISndPieMenuHide</key> +        <map> +        <key>Comment</key> +            <string>Sound file for closing pie menu (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>00000000-0000-0000-0000-000000000000</string> +        </map> +    <key>UISndPieMenuSliceHighlight0</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 0 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>d9f73cf8-17b4-6f7a-1565-7951226c305d</string> +        </map> +    <key>UISndPieMenuSliceHighlight1</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 1 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>f6ba9816-dcaf-f755-7b67-51b31b6233e5</string> +        </map> +    <key>UISndPieMenuSliceHighlight2</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 2 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>7aff2265-d05b-8b72-63c7-dbf96dc2f21f</string> +        </map> +    <key>UISndPieMenuSliceHighlight3</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 3 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>09b2184e-8601-44e2-afbb-ce37434b8ba1</string> +        </map> +    <key>UISndPieMenuSliceHighlight4</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 4 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>bbe4c7fc-7044-b05e-7b89-36924a67593c</string> +        </map> +    <key>UISndPieMenuSliceHighlight5</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 5 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>d166039b-b4f5-c2ec-4911-c85c727b016c</string> +        </map> +    <key>UISndPieMenuSliceHighlight6</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 6 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>242af82b-43c2-9a3b-e108-3b0c7e384981</string> +        </map> +    <key>UISndPieMenuSliceHighlight7</key> +        <map> +        <key>Comment</key> +            <string>Sound file for selecting pie menu item 7 (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c1f334fb-a5be-8fe7-22b3-29631c21cf0b</string> +        </map> +    <key>UISndSnapshot</key> +        <map> +        <key>Comment</key> +            <string>Sound file for taking a snapshot (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>3d09f582-3851-c0e0-f5ba-277ac5c73fb4</string> +        </map> +    <key>UISndStartIM</key> +        <map> +        <key>Comment</key> +            <string>Sound file for starting a new IM session (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c825dfbc-9827-7e02-6507-3713d18916c1</string> +        </map> +    <key>UISndTeleportOut</key> +        <map> +        <key>Comment</key> +            <string>Sound file for teleporting (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>d7a9a565-a013-2a69-797d-5332baa1a947</string> +        </map> +    <key>UISndTyping</key> +        <map> +        <key>Comment</key> +            <string>Sound file for starting to type a chat message (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>5e191c7b-8996-9ced-a177-b2ac32bfea06</string> +        </map> +    <key>UISndWindowClose</key> +        <map> +        <key>Comment</key> +            <string>Sound file for closing a window (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>2c346eda-b60c-ab33-1119-b8941916a499</string> +        </map> +    <key>UISndWindowOpen</key> +        <map> +        <key>Comment</key> +            <string>Sound file for opening a window (uuid for sound asset)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>c80260ba-41fd-8a46-768a-6bf236360e3a</string> +        </map> +    <key>UseAltKeyForMenus</key> +        <map> +        <key>Comment</key> +            <string>Access menus via keyboard by tapping Alt</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UseChatBubbles</key> +        <map> +        <key>Comment</key> +            <string>Show chat above avatars head in chat bubbles</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UseDebugLogin</key> +        <map> +        <key>Comment</key> +            <string>Provides extra control over which grid to connect to</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UseDebugMenus</key> +        <map> +        <key>Comment</key> +            <string>Turns on "Debug" menu</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UseDefaultColorPicker</key> +        <map> +        <key>Comment</key> +            <string>Use color picker supplied by operating system</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UseEnergy</key> +        <map> +        <key>Comment</key> +            <string /> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>UseExternalBrowser</key> +        <map> +        <key>Comment</key> +            <string>Use default browser when opening web pages instead of in-world browser.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UseFreezeFrame</key> +        <map> +        <key>Comment</key> +            <string>Freeze time when taking snapshots.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UseOcclusion</key> +        <map> +        <key>Comment</key> +            <string>Enable object culling based on occlusion (coverage) by other objects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>UseWebPagesOnPrims</key> +        <map> +        <key>Comment</key> +            <string>[NOT USED]</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UserConnectionPort</key> +        <map> +        <key>Comment</key> +            <string>Port that this client transmits on.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>UserLogFile</key> +        <map> +        <key>Comment</key> +            <string>User specified log file name.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>UserLoginInfo</key> +        <map> +        <key>Comment</key> +            <string>Users loging data.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>LLSD</string> +        <key>Value</key> +            <map /> +        </map> +    <key>UserSettingsFile</key> +        <map> +        <key>Comment</key> +            <string>Persisted client settings file name (per user).</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>VFSOldSize</key> +        <map> +        <key>Comment</key> +            <string>[DO NOT MODIFY] Controls resizing of local file cache</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>VFSSalt</key> +        <map> +        <key>Comment</key> +            <string>[DO NOT MODIFY] Controls local file caching behavior</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>VectorizeEnable</key> +        <map> +        <key>Comment</key> +            <string>Enable general vector operations and data alignment.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>VectorizePerfTest</key> +        <map> +        <key>Comment</key> +            <string>Test SSE/vectorization performance and choose fastest version.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>VectorizeProcessor</key> +        <map> +        <key>Comment</key> +            <string>0=Compiler Default, 1=SSE, 2=SSE2, autodetected</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>VectorizeSkin</key> +        <map> +        <key>Comment</key> +            <string>Enable vector operations for avatar skinning.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>VelocityInterpolate</key> +        <map> +        <key>Comment</key> +            <string>Extrapolate object motion from last packet based on received velocity</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>VerboseLogs</key> +        <map> +        <key>Comment</key> +            <string>Display source file and line number for each log item for debugging purposes</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>VersionChannelName</key> +        <map> +        <key>Comment</key> +            <string>Versioning Channel Name.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>Second Life Release</string> +        </map> +    <key>VertexShaderEnable</key> +        <map> +        <key>Comment</key> +            <string>Enable/disable all GLSL shaders (debug)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>VivoxDebugLevel</key> +        <map> +        <key>Comment</key> +            <string>Logging level to use when launching the vivox daemon</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>-1</string> +        </map> +    <key>VivoxDebugServerName</key> +        <map> +        <key>Comment</key> +            <string>Hostname of the vivox account server to use for voice when not connected to Agni.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>bhd.vivox.com</string> +        </map> +    <key>VoiceCallsFriendsOnly</key> +        <map> +        <key>Comment</key> +            <string>Only accept voice calls from residents on your friends list</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>VoiceEarLocation</key> +        <map> +        <key>Comment</key> +            <string>Location of the virtual ear for voice</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>VoiceHost</key> +        <map> +        <key>Comment</key> +            <string>Client SLVoice host to connect to</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>127.0.0.1</string> +        </map> +    <key>VoiceImageLevel0</key> +        <map> +        <key>Comment</key> +            <string>Texture UUID for voice image level 0</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>041ee5a0-cb6a-9ac5-6e49-41e9320507d5</string> +        </map> +    <key>VoiceImageLevel1</key> +        <map> +        <key>Comment</key> +            <string>Texture UUID for voice image level 1</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +        </map> +    <key>VoiceImageLevel2</key> +        <map> +        <key>Comment</key> +            <string>Texture UUID for voice image level 2</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +        </map> +    <key>VoiceImageLevel3</key> +        <map> +        <key>Comment</key> +            <string>Texture UUID for voice image level 3</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +        </map> +    <key>VoiceImageLevel4</key> +        <map> +        <key>Comment</key> +            <string>Texture UUID for voice image level 4</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +        </map> +    <key>VoiceImageLevel5</key> +        <map> +        <key>Comment</key> +            <string>Texture UUID for voice image level 5</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +        </map> +    <key>VoiceImageLevel6</key> +        <map> +        <key>Comment</key> +            <string>Texture UUID for voice image level 6</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>29de489d-0491-fb00-7dab-f9e686d31e83</string> +        </map> +    <key>VoiceInputAudioDevice</key> +        <map> +        <key>Comment</key> +            <string>Audio input device to use for voice</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>Default</string> +        </map> +    <key>VoiceOutputAudioDevice</key> +        <map> +        <key>Comment</key> +            <string>Audio output device to use for voice</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>Default</string> +        </map> +    <key>VoicePort</key> +        <map> +        <key>Comment</key> +            <string>Client SLVoice port to connect to</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>44124</integer> +        </map> +    <key>WarnAboutBadPCI</key> +        <map> +        <key>Comment</key> +            <string>Enables AboutBadPCI warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnAboutDirectX9</key> +        <map> +        <key>Comment</key> +            <string>Enables AboutDirectX9 warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnAboutOldGraphicsDriver</key> +        <map> +        <key>Comment</key> +            <string>Enables AboutOldGraphicsDriver warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnAboutPCIGraphics</key> +        <map> +        <key>Comment</key> +            <string>Enables AboutPCIGraphics warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnBrowserLaunch</key> +        <map> +        <key>Comment</key> +            <string>Enables BrowserLaunch warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnDeedObject</key> +        <map> +        <key>Comment</key> +            <string>Enables DeedObject warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstAppearance</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstAppearance warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstAttach</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstAttach warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstBalanceDecrease</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstBalanceDecrease warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstBalanceIncrease</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstBalanceIncrease warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstBuild</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstBuild warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstDebugMenus</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstDebugMenus warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstFlexible</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstFlexible warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstGoTo</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstGoTo warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstInventory</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstInventory warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstLeftClickNoHit</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstLeftClickNoHit warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstMap</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstMap warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstOverrideKeys</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstOverrideKeys warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstSandbox</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstSandbox warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstSculptedPrim</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstSculptedPrim warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstSit</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstSit warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstStreamingMusic</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstStreamingMusic warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstStreamingVideo</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstStreamingVideo warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstTeleport</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstTeleport warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnFirstVoice</key> +        <map> +        <key>Comment</key> +            <string>Enables FirstVoice warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnNewClassified</key> +        <map> +        <key>Comment</key> +            <string>Enables NewClassified warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnQuickTimeInstalled</key> +        <map> +        <key>Comment</key> +            <string>Enables QuickTimeInstalled warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WarnReturnToOwner</key> +        <map> +        <key>Comment</key> +            <string>Enables ReturnToOwner warning dialog</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +	<key>WindLightUseAtmosShaders</key> +		<map> +		<key>Comment</key> +			<string>Whether to enable or disable WindLight atmospheric shaders.</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>Boolean</string> +		<key>Value</key> +			<integer>1</integer> +		</map> +    <key>WindowHeight</key> +        <map> +        <key>Comment</key> +            <string>SL viewer window height</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>700</integer> +        </map> +    <key>WindowMaximized</key> +        <map> +        <key>Comment</key> +            <string>SL viewer window maximized on login</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>WindowWidth</key> +        <map> +        <key>Comment</key> +            <string>SL viewer window width</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>1000</integer> +        </map> +    <key>WindowX</key> +        <map> +        <key>Comment</key> +            <string>X coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>10</integer> +        </map> +    <key>WindowY</key> +        <map> +        <key>Comment</key> +            <string>Y coordinate of lower left corner of SL viewer window, relative to primary display (pixels)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>10</integer> +        </map> +    <key>WLSkyDetail</key> +		<map> +		<key>Comment</key> +			<string>Controls vertex detail on the WindLight sky.  Lower numbers will give better performance and uglier skies.</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>U32</string> +		<key>Value</key> +			<integer>64</integer> +		</map> +    <key>XferThrottle</key> +        <map> +        <key>Comment</key> +            <string>Maximum allowable downstream bandwidth for asset transfers (bits per second)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>150000</real> +        </map> +    <key>YawFromMousePosition</key> +        <map> +        <key>Comment</key> +            <string>Horizontal range over which avatar head tracks mouse position (degrees of head rotation from left of window to right)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>90</real> +        </map> +    <key>YieldTime</key> +        <map> +        <key>Comment</key> +            <string>Yield some time to the local host.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>-1</integer> +        </map> +    <key>ZoomTime</key> +        <map> +        <key>Comment</key> +            <string>Time of transition between different camera modes (seconds)</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>F32</string> +        <key>Value</key> +            <real>0.4000000059604644775390625</real> +        </map> +    <key>llOwnerSayChatColor</key> +        <map> +        <key>Comment</key> +            <string>Color of chat messages from objects only visible to the owner</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Color4</string> +        <key>Value</key> +            <array> +                <real>0.9900000095367431640625</real> +                <real>0.9900000095367431640625</real> +                <real>0.689999997615814208984375</real> +                <real>1</real> +            </array> +        </map> +    <key>ParcelMediaAutoPlayEnable</key> +        <map> +        <key>Comment</key> +            <string>Auto play parcel media when available</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>particlesbeacon</key> +        <map> +        <key>Comment</key> +            <string>Beacon / Highlight particle generators</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>physicalbeacon</key> +        <map> +        <key>Comment</key> +            <string>Beacon / Highlight physical objects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>renderbeacons</key> +        <map> +        <key>Comment</key> +            <string>Beacon / Highlight particle generators</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>renderhighlights</key> +        <map> +        <key>Comment</key> +            <string>Beacon / Highlight scripted objects with touch function</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>scriptsbeacon</key> +        <map> +        <key>Comment</key> +            <string>Beacon / Highlight scripted objects</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>scripttouchbeacon</key> +        <map> +        <key>Comment</key> +            <string>Beacon / Highlight scripted objects with touch function</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>soundsbeacon</key> +        <map> +        <key>Comment</key> +            <string>Beacon / Highlight sound generators</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +	<key>SkyEditPresets</key> +		<map> +		<key>Comment</key> +			<string>Whether to be able to edit the sky defaults or not</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>Boolean</string> +		<key>Value</key> +			<integer>0</integer> +		</map> +	<key>WaterGLFogDepthFloor</key> +		<map> +		<key>Comment</key> +			<string>Controls how dark water gl fog can get</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>F32</string> +		<key>Value</key> +			<real>0.25</real> +		</map> +	<key>WaterGLFogDepthScale</key> +		<map> +		<key>Comment</key> +			<string>Controls how quickly gl fog gets dark under water</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>F32</string> +		<key>Value</key> +			<real>50.0</real> +		</map> +	<key>WaterGLFogDensityScale</key> +		<map> +		<key>Comment</key> +			<string>Maps shader water fog density to gl fog density</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>F32</string> +		<key>Value</key> +			<real>0.02</real> +		</map> +	<key>EnableRippleWater</key> +		<map> +		<key>Comment</key> +			<string>Whether to use ripple water shader or not</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>Boolean</string> +		<key>Value</key> +			<integer>1</integer> +		</map> +	<key>WaterEditPresets</key> +	    <map> +	    <key>Comment</key> +		    <string>Whether to be able to edit the water defaults or not</string> +	    <key>Persist</key> +		    <integer>1</integer> +	    <key>Type</key> +		    <string>Boolean</string> +	    <key>Value</key> +		    <integer>0</integer> +	    </map> +    <key>FloaterEnvRect</key> +	    <map> +	    <key>Comment</key> +		    <string>Rectangle for Environment Editor</string> +	    <key>Persist</key> +		    <integer>1</integer> +	    <key>Type</key> +		    <string>Rect</string> +	    <key>Value</key> +            <array> +                <integer>50</integer> +                <integer>150</integer> +                <integer>650</integer> +                <integer>0</integer> +            </array> +	    </map> +    <key>FloaterAdvancedSkyRect</key> +	    <map> +	    <key>Comment</key> +		    <string>Rectangle for Advanced Sky Editor</string> +	    <key>Persist</key> +		    <integer>1</integer> +	    <key>Type</key> +		    <string>Rect</string> +	    <key>Value</key> +            <array> +                <integer>50</integer> +                <integer>220</integer> +                <integer>450</integer> +                <integer>0</integer> +            </array> +	    </map> +    <key>FloaterDayCycleRect</key> +	    <map> +	    <key>Comment</key> +		    <string>Rectangle for Day Cycle Editor</string> +	    <key>Persist</key> +		    <integer>1</integer> +	    <key>Type</key> +		    <string>Rect</string> +	    <key>Value</key> +            <array> +                <integer>50</integer> +                <integer>450</integer> +                <integer>300</integer> +                <integer>0</integer> +            </array> +	    </map> +    <key>FloaterAdvancedWaterRect</key> +	    <map> +	    <key>Comment</key> +		    <string>Rectangle for Advanced Water Editor</string> +	    <key>Persist</key> +		    <integer>1</integer> +	    <key>Type</key> +		    <string>Rect</string> +	    <key>Value</key> +            <array> +                <integer>50</integer> +                <integer>220</integer> +                <integer>450</integer> +                <integer>0</integer> +            </array> +	    </map> +    <key>AlertedUnsupportedHardware</key> +		<map> +		<key>Comment</key> +			<string>Toggle that lets us tell the user he's on old hardware only once</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>Boolean</string> +		<key>Value</key> +			<integer>0</integer> +		</map> +    <key>RenderFastAlpha</key> +		<map> +		<key>Comment</key> +			<string>Use lossy alpha rendering optimization (opaque/nonexistent small alpha faces).</string> +		<key>Persist</key> +			<integer>1</integer> +		<key>Type</key> +			<string>Boolean</string> +		<key>Value</key> +			<integer>1</integer> +		</map> +    </map> +</llsd> diff --git a/indra/newview/app_settings/settings_crash_behavior.xml b/indra/newview/app_settings/settings_crash_behavior.xml new file mode 100644 index 0000000000..cc7f5ac88b --- /dev/null +++ b/indra/newview/app_settings/settings_crash_behavior.xml @@ -0,0 +1,15 @@ +<llsd> +    <map> +    <key>CrashSubmitBehavior</key> +        <map> +        <key>Comment</key> +            <string>Controls behavior when viewer crashes (0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)</string> +		<key>Persist</key> +		    <integer>1</integer> +        <key>Type</key> +            <string>S32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    </map> +</llsd> diff --git a/indra/newview/app_settings/settings_files.xml b/indra/newview/app_settings/settings_files.xml new file mode 100644 index 0000000000..997bb0c33c --- /dev/null +++ b/indra/newview/app_settings/settings_files.xml @@ -0,0 +1,22 @@ +<llsd> +  <map> +    <key>Files</key> +        <map> +        <key>Comment</key> +            <string>List of settings files to load. Key is the identifier, value is the filename</string> +        <key>Persist</key> +            <integer>0</integer> +        <key>Type</key> +            <string>LLSD</string> +        <key>Value</key> +		<map> +		  <key>Global</key> +		  <string>settings.xml</string> +		  <key>PerAccount</key> +		  <string>settings_per_account.xml</string> +		  <key>CrashSettings</key> +		  <string>settings_crash_behavior.xml</string> +		</map> +		</map> +  </map> +</llsd> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml new file mode 100644 index 0000000000..90c7b11637 --- /dev/null +++ b/indra/newview/app_settings/settings_per_account.xml @@ -0,0 +1,114 @@ +<llsd> +    <map> +    <key>BusyModeResponse</key> +        <map> +        <key>Comment</key> +            <string>Auto response to instant messages while in busy mode.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string>The Resident you messaged is in 'busy mode' which means they have requested not to be disturbed.  Your message will still be shown in their IM panel for later viewing.</string> +        </map> +    <key>IMLogTimestamp</key> +        <map> +        <key>Comment</key> +            <string>Log Timestamp of Instant Messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>InstantMessageLogPath</key> +        <map> +        <key>Comment</key> +            <string>Path to your log files.</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>String</string> +        <key>Value</key> +            <string /> +        </map> +    <key>LastLogoff</key> +        <map> +        <key>Comment</key> +            <string>Last logoff</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>U32</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LogChat</key> +        <map> +        <key>Comment</key> +            <string>Log Chat</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LogChatIM</key> +        <map> +        <key>Comment</key> +            <string>Log Incoming Instant Messages with Chat</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LogChatTimestamp</key> +        <map> +        <key>Comment</key> +            <string>Log Timestamp of Chat</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>0</integer> +        </map> +    <key>LogInstantMessages</key> +        <map> +        <key>Comment</key> +            <string>Log Instant Messages</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>LogShowHistory</key> +        <map> +        <key>Comment</key> +            <string>Log Show History</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    <key>LogTimestampDate</key> +        <map> +        <key>Comment</key> +            <string>Include Date with Timestamp</string> +        <key>Persist</key> +            <integer>1</integer> +        <key>Type</key> +            <string>Boolean</string> +        <key>Value</key> +            <integer>1</integer> +        </map> +    </map> +</llsd> diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 420f0811ff..2fe23c9a51 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -917,19 +917,19 @@ Function .onInit  	; generate language ID that will be used as a command line arg	  	StrCmp $LANGUAGE "1042" 0 +3 -	StrCpy $LANGFLAGS " -set SystemLanguage ko" +	StrCpy $LANGFLAGS " --set SystemLanguage ko"  	Goto EndOfFunc  	StrCmp $LANGUAGE "1041" 0 +3 -	StrCpy $LANGFLAGS " -set SystemLanguage ja" +	StrCpy $LANGFLAGS " --set SystemLanguage ja"  	Goto EndOfFunc  	StrCmp $LANGUAGE "1031" 0 +3 -	StrCpy $LANGFLAGS " -set SystemLanguage de" +	StrCpy $LANGFLAGS " --set SystemLanguage de"  	Goto EndOfFunc  	StrCmp $LANGUAGE "1033" 0 +3 -	StrCpy $LANGFLAGS " -set SystemLanguage en-us" +	StrCpy $LANGFLAGS " --set SystemLanguage en-us"  	Goto EndOfFunc  	EndOfFunc: diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index ac92ee8525..4dab653d19 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -273,8 +273,7 @@ void LLAgentFriendObserver::changed(U32 mask)  // LLAgent()  //-----------------------------------------------------------------------------  LLAgent::LLAgent() -:	mViewerPort(NET_USE_OS_ASSIGNED_PORT), -	mDrawDistance( DEFAULT_FAR_PLANE ), +:	mDrawDistance( DEFAULT_FAR_PLANE ),  	mDoubleTapRunTimer(),  	mDoubleTapRunMode(DOUBLETAP_NONE), @@ -455,8 +454,6 @@ void LLAgent::init()  	mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject");  //	LLDebugVarMessageBox::show("Camera Lag", &CAMERA_FOCUS_HALF_LIFE, 0.5f, 0.01f); -	gSavedSettings.getControl("RenderHideGroupTitle")->addListener(&mHideGroupTitleListener); -	gSavedSettings.getControl("EffectColor")->addListener(&mEffectColorListener);  	mEffectColor = gSavedSettings.getColor4("EffectColor"); @@ -7466,19 +7463,6 @@ void LLAgent::userRemoveAllAttachments( void* userdata )  	gMessageSystem->sendReliable( gAgent.getRegionHost() );  } -bool LLAgent::LLHideGroupTitleListener::handleEvent(LLPointer<LLEvent> event, const LLSD &userdata) -{ -	gAgent.setHideGroupTitle(event->getValue()); -	return true; - -} - -bool LLAgent::LLEffectColorListener::handleEvent(LLPointer<LLEvent> event, const LLSD &userdata) -{ -	gAgent.setEffectColor(LLColor4(event->getValue())); -	return true; -} -  void LLAgent::observeFriends()  {  	if(!mFriendObserver) diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 469d2e4fe0..50830a75f0 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -36,6 +36,7 @@  #include "indra_constants.h"  #include "llmath.h" +#include "llcontrol.h"  #include "llcoordframe.h"  #include "llevent.h"  #include "llagentconstants.h" @@ -225,8 +226,8 @@ public:  	// update internal datastructures and update the server with the  	// new contribution level. Returns true if the group id was found  	// and contribution could be set. -	BOOL setGroupContribution(const LLUUID& group_id, S32 contribution); -	BOOL setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile); +	BOOL 			setGroupContribution(const LLUUID& group_id, S32 contribution); +	BOOL 			setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOOL list_in_profile);  	void			setHideGroupTitle(BOOL hide)	{ mHideGroupTitle = hide; }  	// @@ -686,7 +687,6 @@ protected:  						BOOL notify = TRUE);  public:  	// TODO: Make these private! -	U32				mViewerPort;				// Port this agent transmits on.  	LLUUID			mSecureSessionID;			// secure token for this login session  	F32				mDrawDistance; @@ -932,21 +932,6 @@ private:  		LLPointer<LLRefCount> mCB;  	}; -	//control listeners -	class LLHideGroupTitleListener: public LLSimpleListener -	{ -	public: -		bool handleEvent(LLPointer<LLEvent> event, const LLSD &userdata); -	}; - -	class LLEffectColorListener: public LLSimpleListener -	{ -	public: -		bool handleEvent(LLPointer<LLEvent> event, const LLSD &userdata); -	}; - -	LLHideGroupTitleListener mHideGroupTitleListener; -	LLEffectColorListener mEffectColorListener;  	LLFriendObserver* mFriendObserver;  }; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 8c7af9ebf7..ffa2a82646 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -62,10 +62,13 @@  #include "llmutelist.h"  #include "llurldispatcher.h"  #include "llurlhistory.h" +#include "llfirstuse.h"  #include "llweb.h"  #include "llsecondlifeurls.h" +#include <boost/bind.hpp> +  #if LL_WINDOWS  	#include "llwindebug.h"  #endif @@ -153,10 +156,7 @@  #include "llinventoryview.h" -// *FIX: Remove these once the command line params thing is figured out. -// Yuck! -static int gTempArgC = 0; -static char** gTempArgV; +#include "llcommandlineparser.h"  // *FIX: These extern globals should be cleaned up.  // The globals either represent state/config/resource-storage of either  @@ -169,7 +169,6 @@ static char** gTempArgV;  //----------------------------------------------------------------------------  // llviewernetwork.h  #include "llviewernetwork.h" -// extern EGridInfo gGridChoice;  ////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor @@ -216,14 +215,8 @@ extern BOOL gPeriodicSlowFrame;  ////////////////////////////////////////////////////////////  // All from the last globals push... -bool gVerifySSLCert = true;  BOOL gHandleKeysAsync = FALSE; -BOOL gProbeHardware = TRUE; // Use DirectX 9 to probe for hardware - -S32 gYieldMS = 0; // set in parse_args, used in mainLoop -BOOL gYieldTime = FALSE; -  const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard  F32 gSimLastTime; // Used in LLAppViewer::init and send_stats() @@ -234,21 +227,10 @@ LLString gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle  BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally  BOOL				gAllowIdleAFK = TRUE; -F32					gAFKTimeout = DEFAULT_AFK_TIMEOUT;  BOOL				gShowObjectUpdates = FALSE; -BOOL gLogMessages = FALSE; -std::string gChannelName = LL_CHANNEL; -BOOL gUseAudio = TRUE;  BOOL gUseQuickTime = TRUE; -LLString gCmdLineFirstName; -LLString gCmdLineLastName; -LLString gCmdLinePassword; - -BOOL				gAutoLogin = FALSE;  const char*			DEFAULT_SETTINGS_FILE = "settings.xml"; -BOOL gRequestInventoryLibrary = TRUE; -BOOL gGodConnect = FALSE;  BOOL gAcceptTOS = FALSE;  BOOL gAcceptCriticalMessage = FALSE; @@ -279,7 +261,6 @@ F32					gLogoutMaxTime = LOGOUT_REQUEST_TIME;  LLUUID gInventoryLibraryOwner;  LLUUID gInventoryLibraryRoot; -BOOL				gDisableVoice = FALSE;  BOOL				gDisconnected = FALSE;  // Map scale in pixels per region @@ -291,17 +272,11 @@ LLFrameTimer	gRestoreGLTimer;  BOOL			gRestoreGL = FALSE;  BOOL				gUseWireframe = FALSE; -F32					gMouseSensitivity = 3.f; -BOOL				gInvertMouse = FALSE; -  // VFS globals - see llappviewer.h  LLVFS* gStaticVFS = NULL;  LLMemoryInfo gSysMemory; -bool gPreloadImages = true; -bool gPreloadSounds = true; -  LLString gLastVersionChannel;  LLVector3			gWindVec(3.0, 3.0, 0.0); @@ -311,34 +286,14 @@ U32		gPacketsIn = 0;  BOOL				gPrintMessagesThisFrame = FALSE; -BOOL gUseConsole = TRUE; -  BOOL gRandomizeFramerate = FALSE;  BOOL gPeriodicSlowFrame = FALSE; -BOOL gQAMode = FALSE;  BOOL gLLErrorActivated = FALSE; -  ////////////////////////////////////////////////////////////  // Internal globals... that should be removed. -static F32 gQuitAfterSeconds = 0.f; -static BOOL gRotateRight = FALSE; -static BOOL gIgnorePixelDepth = FALSE; - -// Allow multiple viewers in ReleaseForDownload -#if LL_RELEASE_FOR_DOWNLOAD -static BOOL gMultipleViewersOK = FALSE; -#else -static BOOL gMultipleViewersOK = TRUE; -#endif - -static std::map<std::string, std::string> gCommandLineSettings; -static std::map<std::string, std::string> gCommandLineForcedSettings; -  static LLString gArgs; -static LLString gOldSettingsFileName; -static const char* LEGACY_DEFAULT_SETTINGS_FILE = "settings.ini";  const char* MARKER_FILE_NAME = "SecondLife.exec_marker";  const char* ERROR_MARKER_FILE_NAME = "SecondLife.error_marker";  const char* LLERROR_MARKER_FILE_NAME = "SecondLife.llerror_marker"; @@ -360,52 +315,10 @@ std::string gLoginPage;  std::vector<std::string> gLoginURIs;  static std::string gHelperURI; -static const char USAGE[] = "\n" -"usage:\tviewer [options]\n" -"options:\n" -" -login <first> <last> <password>     log in as a user\n" -" -autologin                           log in as last saved user\n" -" -loginpage <URL>                     login authentication page to use\n" -" -loginuri <URI>                      login server and CGI script to use\n" -" -helperuri <URI>                     helper web CGI prefix to use\n" -" -settings <filename>                 specify the filename of a\n" -"                                        configuration file\n" -"                                        default is settings.xml\n" -" -setdefault <variable> <value>       specify the value of a particular\n" -"                                        configuration variable which can be\n" -"                                        overridden by settings.xml\n" -" -set <variable> <value>              specify the value of a particular\n" -"                                        configuration variable that\n" -"                                        overrides all other settings\n" -#if !LL_RELEASE_FOR_DOWNLOAD -" -sim <simulator_ip>                  specify the simulator ip address\n" -#endif -" -god		                           log in as god if you have god access\n" -" -purge                               delete files in cache\n" -" -safe                                reset preferences, run in safe mode\n" -" -noutc                               logs in local time, not UTC\n" -" -nothread                            run vfs in single thread\n" -" -noinvlib                            Do not request inventory library\n" -" -multiple                            allow multiple viewers\n" -" -nomultiple                          block multiple viewers\n" -" -novoice                             disable voice\n" -" -ignorepixeldepth                    ignore pixel depth settings\n" -" -cooperative [ms]                    yield some idle time to local host\n" -" -skin                                ui/branding skin folder to use\n" -#if LL_WINDOWS -" -noprobe                             disable hardware probe\n" -#endif -" -noquicktime                         disable QuickTime movies, speeds startup\n" -" -nopreload                           don't preload UI images or sounds, speeds startup\n" -// these seem to be unused -//" -noenv                               turn off environmental effects\n" -//" -proxy <proxy_ip>                    specify the proxy ip address\n" -"\n"; -  void idle_afk_check()  {  	// check idle timers -	if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gAFKTimeout)) +	if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getF32("AFKTimeout")))  	{  		gAgent.setAFK();  	} @@ -444,7 +357,7 @@ void request_initial_instant_messages()  // Use these strictly for things that are constructed at startup,  // or for things that are performance critical.  JC -static void saved_settings_to_globals() +static void settings_to_globals()  {  	LLBUTTON_H_PAD		= gSavedSettings.getS32("ButtonHPad");  	LLBUTTON_V_PAD		= gSavedSettings.getS32("ButtonVPad"); @@ -482,15 +395,15 @@ static void saved_settings_to_globals()  	gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");  	gAllowIdleAFK = gSavedSettings.getBOOL("AllowIdleAFK"); -	gAFKTimeout = gSavedSettings.getF32("AFKTimeout"); -	gMouseSensitivity = gSavedSettings.getF32("MouseSensitivity"); -	gInvertMouse = gSavedSettings.getBOOL("InvertMouse");  	gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");  	gMapScale = gSavedSettings.getF32("MapScale");  	gMiniMapScale = gSavedSettings.getF32("MiniMapScale");  	gHandleKeysAsync = gSavedSettings.getBOOL("AsyncKeyboard");  	LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips"); +} +static void settings_modify() +{  	LLRenderTarget::sUseFBO				= gSavedSettings.getBOOL("RenderUseFBO");  	LLVOAvatar::sUseImpostors			= gSavedSettings.getBOOL("RenderUseImpostors");  	LLVOSurfacePatch::sLODFactor		= gSavedSettings.getF32("RenderTerrainLODFactor"); @@ -532,367 +445,74 @@ static void saved_settings_to_globals()  	// propagate push to talk preference to current status  	gSavedSettings.setBOOL("PTTCurrentlyEnabled", gSavedSettings.getBOOL("EnablePushToTalk")); - -	settings_setup_listeners(); - -	// gAgent.init() also loads from saved settings.  } -int parse_args(int argc, char **argv) +void initGridChoice()  { -	// Sometimes IP addresses passed in on the command line have leading -	// or trailing white space.  Use LLString to clean that up. -	LLString ip_string; -	S32 j; - -	for (j = 1; j < argc; j++)  -	{ +    LLString gridChoice = gSavedSettings.getString("GridChoice"); +    if(!gridChoice.empty())  		// Used to show first chunk of each argument passed in the   		// window title. -		gArgs += argv[j]; -		gArgs += " "; - -		LLString argument = argv[j]; -		if ((!strcmp(argv[j], "-port")) && (++j < argc))  -		{ -			sscanf(argv[j], "%u", &(gAgent.mViewerPort)); -		} -		else if ((!strcmp(argv[j], "-drop")) && (++j < argc))  -		{ -			sscanf(argv[j], "%f", &gPacketDropPercentage); -		} -		else if ((!strcmp(argv[j], "-inbw")) && (++j < argc)) -		{ -			sscanf(argv[j], "%f", &gInBandwidth); -		} -		else if ((!strcmp(argv[j], "-outbw")) && (++j < argc)) -		{ -			sscanf(argv[j], "%f", &gOutBandwidth); -		} -		else if (!strcmp(argv[j], "--aditi")) -		{ -			gGridChoice = GRID_INFO_ADITI; -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--agni")) -		{ -			gGridChoice = GRID_INFO_AGNI; -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--aruna")) -		{ -			gGridChoice = GRID_INFO_ARUNA; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--durga")) -		{ -			gGridChoice = GRID_INFO_DURGA; -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--ganga")) -		{ -			gGridChoice = GRID_INFO_GANGA; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--mitra")) -		{ -			gGridChoice = GRID_INFO_MITRA; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--mohini")) -		{ -			gGridChoice = GRID_INFO_MOHINI; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--nandi")) -		{ -			gGridChoice = GRID_INFO_NANDI; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--radha")) -		{ -			gGridChoice = GRID_INFO_RADHA; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--ravi")) -		{ -			gGridChoice = GRID_INFO_RAVI; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--siva")) -		{ -			gGridChoice = GRID_INFO_SIVA; -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--shakti")) -		{ -			gGridChoice = GRID_INFO_SHAKTI; -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--soma")) -		{ -			gGridChoice = GRID_INFO_SOMA; -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--uma")) -		{ -			gGridChoice = GRID_INFO_UMA; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--vaak")) -		{ -			gGridChoice = GRID_INFO_VAAK; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "--yami")) -		{ -			gGridChoice = GRID_INFO_YAMI; -			sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName); -		} -		else if (!strcmp(argv[j], "-loginpage") && (++j < argc)) -		{ -			LLAppViewer::instance()->setLoginPage(utf8str_trim(argv[j])); -		} -		else if (!strcmp(argv[j], "-loginuri") && (++j < argc)) -		{ -            LLAppViewer::instance()->addLoginURI(utf8str_trim(argv[j])); -		} -		else if (!strcmp(argv[j], "-helperuri") && (++j < argc)) -		{ -            LLAppViewer::instance()->setHelperURI(utf8str_trim(argv[j])); -		} -		else if (!strcmp(argv[j], "-debugviews")) -		{ -			LLView::sDebugRects = TRUE; -		} -		else if (!strcmp(argv[j], "-skin") && (++j < argc)) -		{ -			std::string folder(argv[j]); -			gDirUtilp->setSkinFolder(folder); -		} -		else if (!strcmp(argv[j], "-autologin") || !strcmp(argv[j], "--autologin")) // keep --autologin for compatibility -		{ -			gAutoLogin = TRUE; -		} -		else if (!strcmp(argv[j], "-quitafter") && (++j < argc)) -		{ -			gQuitAfterSeconds = (F32)atof(argv[j]); -		} -		else if (!strcmp(argv[j], "-rotate")) -		{ -			gRotateRight = TRUE; -		} -//		else if (!strcmp(argv[j], "-noenv"))  -//		{ -			//turn OFF environmental effects for slow machines/video cards -//			gRequestParaboloidMap = FALSE; -//		} -		else if (!strcmp(argv[j], "-noaudio")) -		{ -			gUseAudio = FALSE; -		} -		else if (!strcmp(argv[j], "-nosound"))  // tends to be popular cmdline on Linux. -		{ -			gUseAudio = FALSE; -		} -		else if (!strcmp(argv[j], "-noprobe")) -		{ -			gProbeHardware = FALSE; -		} -		else if (!strcmp(argv[j], "-noquicktime")) -		{ -			// Developers can log in faster if they don't load all the -			// quicktime dlls. -			gUseQuickTime = false; -		} -		else if (!strcmp(argv[j], "-nopreload")) -		{ -			// Developers can log in faster if they don't decode sounds -			// or images on startup, ~5 seconds faster. -			gPreloadSounds = false; -			gPreloadImages = false; -		} -		else if (!strcmp(argv[j], "-purge")) -		{ -			LLAppViewer::instance()->purgeCache(); -		} -		else if(!strcmp(argv[j], "-noinvlib")) -		{ -			gRequestInventoryLibrary = FALSE; -		} -		else if (!strcmp(argv[j], "-log")) -		{ -			gLogMessages = TRUE; -			continue; -		} -		else if (!strcmp(argv[j], "-logfile") && (++j < argc))  -		{ -			// *NOTE: This buffer size is hard coded into scanf() below. -			char logfile[256];	// Flawfinder: ignore -			sscanf(argv[j], "%255s", logfile);	// Flawfinder: ignore -			llinfos << "Setting log file to " << logfile << llendl; -			LLFile::remove(logfile); -			LLError::logToFile(logfile); -		} -		else if (!strcmp(argv[j], "-settings") && (++j < argc))  -		{ -			gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, argv[j]); -		} -		else if (!strcmp(argv[j], "-setdefault") && (j + 2 < argc))  -		{ -			std::string control_name; -			std::string control_value; -			 -			j++; -			if (argv[j]) control_name = std::string(argv[j]); +    { +        // find the grid choice from the user setting. +        int gridIndex = GRID_INFO_NONE;  +        for(;gridIndex < GRID_INFO_OTHER; ++gridIndex ) +        { +            if(0 == LLString::compareInsensitive(gGridInfo[gridIndex].mLabel, gridChoice.c_str())) +            { +                gGridChoice = (EGridInfo)gridIndex; + +                if(GRID_INFO_LOCAL == gGridChoice) +                { +                    gGridName = LOOPBACK_ADDRESS_STRING; +                    break; +                } +                else +                { +                    gGridName = gGridInfo[gGridChoice].mName; +                    break; +                } +            } +        } + +        if(GRID_INFO_OTHER == gridIndex) +        { +                // *FIX:MEP Can and should we validate that this is an IP address? +                gGridChoice = (EGridInfo)gridIndex; +                gGridName = llformat("%s", gSavedSettings.getString("GridChoice").c_str()); + +        } +    } -			j++; -			if (argv[j]) control_value = std::string(argv[j]); -			 -			// grab control name and value -			if (!control_name.empty()) -			{ -				gCommandLineSettings[control_name] = control_value; -			} -		} -		else if (!strcmp(argv[j], "-set") && (j + 2 < argc))  -		{ -			std::string control_name; -			std::string control_value; -			 -			j++; -			if (argv[j]) control_name = std::string(argv[j]); -			j++; -			if (argv[j]) control_value = std::string(argv[j]); -			 -			// grab control name and value -			if (!control_name.empty()) -			{ -				gCommandLineForcedSettings[control_name] = control_value; -			} -		} -		else if (!strcmp(argv[j], "-login")) -		{ -			if (j + 3 < argc) -			{ -				j++; -				gCmdLineFirstName = argv[j]; -				j++; -				gCmdLineLastName = argv[j]; -				j++; -				gCmdLinePassword = argv[j]; -			} -			else -			{ -				// only works if -login is last parameter on command line -				llerrs << "Not enough parameters to -login. Did you mean -loginuri?" << llendl; -			} -		} -		else if (!strcmp(argv[j], "-god")) -		{ -			gGodConnect = TRUE; -		} -		else if (!strcmp(argv[j], "-noconsole")) -		{ -			gUseConsole = FALSE; -		} -		else if (!strcmp(argv[j], "-safe")) -		{ -			llinfos << "Setting viewer feature table to run in safe mode, resetting prefs" << llendl; -			gFeatureManagerp->setSafe(TRUE); -		} -		else if (!strcmp(argv[j], "-multiple")) -		{ -			gMultipleViewersOK = TRUE; -		} -		else if (!strcmp(argv[j], "-nomultiple")) -		{ -			gMultipleViewersOK = FALSE; -		} -		else if (!strcmp(argv[j], "-novoice")) -		{ -			gDisableVoice = TRUE; -		} -		else if (!strcmp(argv[j], "-nothread")) -		{ -			LLVFile::ALLOW_ASYNC = FALSE; -			llinfos << "Running VFS in nothread mode" << llendl; -		} -		// some programs don't respect the command line options in protocol handlers (I'm looking at you, Opera) -		// so this allows us to parse the URL straight off the command line without a "-url" paramater -		else if (LLURLDispatcher::isSLURL(argv[j]) -				 || !strcmp(argv[j], "-url") && (++j < argc))  +#if !LL_RELEASE_FOR_DOWNLOAD +	if (gGridChoice == GRID_INFO_NONE) +	{ +		// Development version: load last server choice by default (overridden by cmd line args) +		S32 server = gSavedSettings.getS32("ServerChoice"); +		if (server != 0) +			gGridChoice = (EGridInfo)llclamp(server, 0, (S32)GRID_INFO_COUNT - 1); +		if (server == GRID_INFO_OTHER)  		{ -			std::string slurl = argv[j]; -			if (LLURLDispatcher::isSLURLCommand(slurl)) +			LLString custom_server = gSavedSettings.getString("CustomServer"); +			if (custom_server.empty())  			{ -				LLStartUp::sSLURLCommand = slurl; +				gGridName = "none";  			}  			else  			{ -				LLURLSimString::setString(slurl); +				gGridName = custom_server.c_str();  			} -			// *NOTE: After setting the url, bail. What can happen is -			// that someone can use IE (or potentially other browsers) -			// and do the rough equivalent of command injection and -			// steal passwords. Phoenix. SL-55321 -			return 0; -		} -		else if (!strcmp(argv[j], "-ignorepixeldepth")) -		{ -			gIgnorePixelDepth = TRUE; -		} -		else if (!strcmp(argv[j], "-cooperative")) -		{ -			S32 ms_to_yield = 0; -			if(++j < argc) -			{ -				S32 rv = sscanf(argv[j], "%d", &ms_to_yield); -				if(0 == rv) -				{ -					--j; -				} -			} -			else -			{ -				--j; -			} -			gYieldMS = ms_to_yield; -			gYieldTime = TRUE; -		} -		else if (!strcmp(argv[j], "-no-verify-ssl-cert")) -		{ -			gVerifySSLCert = false; -		} -		else if ( (!strcmp(argv[j], "--channel") || !strcmp(argv[j], "-channel"))  && (++j < argc))  -		{ -			gChannelName = argv[j]; -		} -#if LL_DARWIN -		else if (!strncmp(argv[j], "-psn_", 5)) -		{ -			// this is the Finder passing the process session number -			// we ignore this  		} +        gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mName); +	}  #endif -		else if(!strncmp(argv[j], "-qa", 3)) -		{ -			gQAMode = TRUE; -		} -		else -		{ -			// DBC - Mac OS X passes some stuff by default on the command line (e.g. psn). -			// Second Life URLs are passed this way as well? -			llwarns << "Possible unknown keyword " << argv[j] << llendl; - -			// print usage information -			llinfos << USAGE << llendl; -			// return 1; -		} +	if (gGridChoice == GRID_INFO_NONE) +	{ +		gGridChoice = GridDefaultChoice; +        gSavedSettings.setString("GridChoice", gGridInfo[gGridChoice].mName);  	} -	return 0;  }  bool send_url_to_other_instance(const std::string& url) @@ -938,11 +558,12 @@ LLAppViewer::LLAppViewer() :  	mReportedCrash(false),  	mNumSessions(0),  	mPurgeCache(false), -    mPurgeOnExit(false), -    mSecondInstance(false), +	mPurgeOnExit(false), +	mSecondInstance(false),  	mSavedFinalSnapshot(false), -    mQuitRequested(false), -    mLogoutRequestSent(false) +	mQuitRequested(false), +	mLogoutRequestSent(false), +	mYieldTime(-1)  {  	if(NULL != sInstance)  	{ @@ -958,13 +579,6 @@ LLAppViewer::~LLAppViewer()  	removeMarkerFile();  } -bool LLAppViewer::tempStoreCommandOptions(int argc, char** argv) -{ -	gTempArgC = argc; -	gTempArgV = argv; -	return true; -} -  bool LLAppViewer::init()  {      // *NOTE:Mani - LLCurl::initClass is not thread safe.  @@ -973,7 +587,6 @@ bool LLAppViewer::init()      initThreads(); -	initEarlyConfiguration();  	//  	// Start of the application @@ -993,61 +606,24 @@ bool LLAppViewer::init()  	//  	// OK to write stuff to logs now, we've now crash reported if necessary  	// - -	// Set up some defaults... -	gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE); -	gOldSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, LEGACY_DEFAULT_SETTINGS_FILE); -      if (!initConfiguration())  		return false; +    writeSystemInfo(); + +	// Build a string representing the current version number. +    gCurrentVersion = llformat("%s %d.%d.%d.%d",  +        gSavedSettings.getString("VersionChannelName").c_str(),  +        LL_VERSION_MAJOR,  +        LL_VERSION_MINOR,  +        LL_VERSION_PATCH,  +        LL_VERSION_BUILD ); +  	//////////////////////////////////////////////////////////////////////////////  	//////////////////////////////////////////////////////////////////////////////  	//////////////////////////////////////////////////////////////////////////////  	//////////////////////////////////////////////////////////////////////////////  	// *FIX: The following code isn't grouped into functions yet. - -	// -	// Write system information into the debug log (CPU, OS, etc.) -	// -	writeSystemInfo(); - -	// Build a string representing the current version number. -        gCurrentVersion = llformat("%s %d.%d.%d.%d", gChannelName.c_str(), LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD ); -	 -	// -	// Merge with the command line overrides -	gSavedSettings.applyOverrides(gCommandLineSettings); - -	// Need to do this before calling parseAlerts -	gUICtrlFactory = new LLViewerUICtrlFactory(); -	 -	// Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/) -	// Do this *before* loading the settings file -	LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE); -	 -	// Overwrite default settings with user settings -	llinfos << "Loading configuration file " << gSettingsFileName << llendl; -	if (0 == gSavedSettings.loadFromFile(gSettingsFileName)) -	{ -		llinfos << "Failed to load settings from " << gSettingsFileName << llendl; -		llinfos << "Loading legacy settings from " << gOldSettingsFileName << llendl; -		gSavedSettings.loadFromFileLegacy(gOldSettingsFileName); -	} - -	// need to do this here - need to have initialized global settings first -	LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); -	if ( nextLoginLocation.length() ) -	{ -		LLURLSimString::setString( nextLoginLocation.c_str() ); -	}; - -	// Merge with the command line overrides -	gSavedSettings.applyOverrides(gCommandLineForcedSettings); - -	gLastRunVersion = gSavedSettings.getString("LastRunVersion"); - -	fixup_settings();  	// Get the single value from the crash settings file, if it exists  	std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); @@ -1087,56 +663,25 @@ bool LLAppViewer::init()  	{  		LLError::setPrintLocation(true);  	} - -#if !LL_RELEASE_FOR_DOWNLOAD -	if (gGridChoice == GRID_INFO_NONE) -	{ -		// Development version: load last server choice by default (overridden by cmd line args) -		 -		S32 server = gSavedSettings.getS32("ServerChoice"); -		if (server != 0) -			gGridChoice = (EGridInfo)llclamp(server, 0, (S32)GRID_INFO_COUNT - 1); -		if (server == GRID_INFO_OTHER) -		{ -			LLString custom_server = gSavedSettings.getString("CustomServer"); -			if (custom_server.empty()) -			{ -				snprintf(gGridName, MAX_STRING, "none");		/* Flawfinder: ignore */ -			} -			else -			{ -				snprintf(gGridName, MAX_STRING, "%s", custom_server.c_str());		/* Flawfinder: ignore */ -			} -		} -	} -#endif - -	if (gGridChoice == GRID_INFO_NONE) -	{ -		gGridChoice = GridDefaultChoice; -	}  	// Load art UUID information, don't require these strings to be declared in code.  	LLString viewer_art_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"viewerart.xml");  	llinfos << "Loading art table from " << viewer_art_filename << llendl; -	gViewerArt.loadFromFile(viewer_art_filename.c_str(), FALSE); +	gViewerArt.loadFromFileLegacy(viewer_art_filename.c_str(), FALSE);  	LLString textures_filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", "textures.xml");  	llinfos << "Loading art table from " << textures_filename << llendl; -	gViewerArt.loadFromFile(textures_filename.c_str(), FALSE); +	gViewerArt.loadFromFileLegacy(textures_filename.c_str(), FALSE);  	LLString colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml");  	llinfos << "Loading base colors from " << colors_base_filename << llendl; -	gColors.loadFromFile(colors_base_filename.c_str(), FALSE, TYPE_COL4U); +	gColors.loadFromFileLegacy(colors_base_filename.c_str(), FALSE, TYPE_COL4U);  	// Load overrides from user colors file  	LLString user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml");  	llinfos << "Loading user colors from " << user_colors_filename << llendl; -	if (gColors.loadFromFile(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0) +	if (gColors.loadFromFileLegacy(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0)  	{ -		llinfos << "Failed to load user colors from " << user_colors_filename << llendl; -		LLString user_legacy_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.ini"); -		llinfos << "Loading legacy colors from " << user_legacy_colors_filename << llendl; -		gColors.loadFromFileLegacy(user_legacy_colors_filename.c_str(), FALSE, TYPE_COL4U); +		llinfos << "Cannot load user colors from " << user_colors_filename << llendl;  	}  	// Widget construction depends on LLUI being initialized @@ -1159,16 +704,18 @@ bool LLAppViewer::init()  	LLAgent::parseTeleportMessages("teleport_strings.xml"); +	LLViewerJointMesh::updateVectorize(); +  	// load MIME type -> media impl mappings  	LLMIMETypes::parseMIMETypes( "mime_types.xml" );  -	mCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING); - -	LLVectorPerformanceOptions::initClass(); - -	// Move certain saved settings into global variables for speed -	saved_settings_to_globals(); +	// Copy settings to globals. *TODO: Remove or move to appropriage class initializers +    	settings_to_globals(); +	// Setup settings listeners +	settings_setup_listeners(); +	// Modify settings based on system configuration and compile options +	settings_modify();  	// Find partition serial number (Windows) or hardware serial (Mac)  	mSerialNumber = generateSerialNumber(); @@ -1433,9 +980,9 @@ bool LLAppViewer::mainLoop()  				bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads");  				// yield some time to the os based on command line option -				if(gYieldTime) +				if(mYieldTime >= 0)  				{ -					ms_sleep(gYieldMS); +					ms_sleep(mYieldTime);  				}  				// yield cooperatively when not running as foreground window @@ -1707,11 +1254,11 @@ bool LLAppViewer::cleanup()  	// Must do this after all panels have been deleted because panels that have persistent rects  	// save their rects on delete. -	gSavedSettings.saveToFile(gSettingsFileName, TRUE); -	if (!gPerAccountSettingsFileName.empty()) -	{ -		gSavedPerAccountSettings.saveToFile(gPerAccountSettingsFileName, TRUE); -	} +	gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);	 + +	// UserSettingsFile should be empty if no use has been logged on. +	// *FIX:Mani This should get really saved in a "logoff" mode.  +	gSavedPerAccountSettings.saveToFile(gSavedSettings.getString("UserSettingsFile"), TRUE);  	llinfos << "Saved settings" << llendflush;  	std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); @@ -1806,10 +1353,10 @@ bool LLAppViewer::cleanup()  	end_messaging_system(); -    // *NOTE:Mani - The following call is not thread safe.  -    LLCurl::cleanupClass(); +	// *NOTE:Mani - The following call is not thread safe.  +	LLCurl::cleanupClass(); -    // If we're exiting to launch an URL, do that here so the screen +	// If we're exiting to launch an URL, do that here so the screen  	// is at the right resolution before we launch IE.  	if (!gLaunchFileOnQuit.empty())  	{ @@ -1830,106 +1377,6 @@ bool LLAppViewer::cleanup()  	return true;  } -bool LLAppViewer::initEarlyConfiguration() -{ -	// *FIX: globals - This method sets a bunch of globals early in the init process. -	int argc = gTempArgC; -	char** argv = gTempArgV; - -	// HACK! We REALLY want to know what grid they were trying to connect to if they -	// crashed hard. -	// So we walk through the command line args ONLY looking for the -	// userserver arguments first.  And we don't do ANYTHING but set -	// the gGridName (which gets passed to the crash reporter). -	// We're assuming that they're trying to log into the same grid as last -	// time, which seems fairly reasonable. -	snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GridDefaultChoice].mName);		// Flawfinder: ignore -	S32 j; -	for (j = 1; j < argc; j++)  -	{ -		if (!strcmp(argv[j], "--aditi")) -		{ -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_ADITI].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--agni")) -		{ -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_AGNI].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--siva")) -		{ -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SIVA].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--shakti")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_SHAKTI].mName); -		} -		else if (!strcmp(argv[j], "--durga")) -		{ -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_DURGA].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--soma")) -		{ -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SOMA].mName);		// Flawfinder: ignore -		} -		else if (!strcmp(argv[j], "--ganga")) -		{ -			snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_GANGA].mName);		// Flawfinder: ignore  -		} -		else if (!strcmp(argv[j], "--vaak")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_VAAK].mName); -		} -		else if (!strcmp(argv[j], "--uma")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_UMA].mName); -		} -		else if (!strcmp(argv[j], "--mohini")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_MOHINI].mName); -		} -		else if (!strcmp(argv[j], "--yami")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_YAMI].mName); -		} -		else if (!strcmp(argv[j], "--nandi")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_NANDI].mName); -		} -		else if (!strcmp(argv[j], "--mitra")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_MITRA].mName); -		} -		else if (!strcmp(argv[j], "--radha")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_RADHA].mName); -		} -		else if (!strcmp(argv[j], "--ravi")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_RAVI].mName); -		} -		else if (!strcmp(argv[j], "--aruna")) -		{ -			sprintf(gGridName,"%s", gGridInfo[GRID_INFO_ARUNA].mName); -		} -		else if (!strcmp(argv[j], "-multiple")) -		{ -			// Hack to detect -multiple so we can disable the marker file check (which will always fail) -			gMultipleViewersOK = TRUE; -		} -		else if (!strcmp(argv[j], "-novoice")) -		{ -			// May need to know this early also -			gDisableVoice = TRUE; -		} -		else if (!strcmp(argv[j], "-url") && (++j < argc))  -		{ -			LLURLSimString::setString(argv[j]); -		} -	} - -	return true; -} -  bool LLAppViewer::initThreads()  {  #if MEM_TRACK_MEM @@ -1990,14 +1437,275 @@ bool LLAppViewer::initLogging()  	return true;  } +void LLAppViewer::loadSettingsFromDirectory(ELLPath path_index) +{ +	for(LLSD::map_iterator itr = mSettingsFileList.beginMap(); itr != mSettingsFileList.endMap(); ++itr) +	{ +		LLString settings_name = (*itr).first; +		LLString settings_file = mSettingsFileList[settings_name].asString(); +		LLString full_settings_path = gDirUtilp->getExpandedFilename(path_index, settings_file); +		if(gSettings.find(settings_name) == gSettings.end()) +		{ +			llwarns << "Cannot load " << settings_file << " - No matching settings group for name " << settings_name << llendl; +			continue; +		} +		if(!gSettings[settings_name]->loadFromFile(gDirUtilp->getExpandedFilename(path_index, settings_file))) +		{ +			llwarns << "Cannot load " << full_settings_path << " - No settings found." << llendl; +		} +		else +		{ +			llinfos << "Loaded settings file " << full_settings_path << llendl; +		} +	} +} +  bool LLAppViewer::initConfiguration()  { -	// Ye olde parse_args()... -	if(!doConfigFromCommandLine()) +	//Set up internal pointers	 +	gSettings["Global"] = &gSavedSettings; +	gSettings["PerAccount"] = &gSavedPerAccountSettings; +	gSettings["CrashSettings"] = &gCrashSettings; + +	//Load settings files list +	std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml"); +	LLControlGroup settings_control; +	llinfos << "Loading settings file list" << settings_file_list << llendl; +	if (0 == settings_control.loadFromFile(settings_file_list))  	{ -		return false; +        llerrs << "Cannot load default configuration file " << settings_file_list << llendl;  	} + +	mSettingsFileList = settings_control.getLLSD("Files"); +	//Order of loading +	// - App Settings (Defaults) +	// - user_settings (Client Overrides) +	// - user directory (user specific overrides, happens in llstartup) +	loadSettingsFromDirectory(LL_PATH_APP_SETTINGS); + +	//Fix settings that require compiled information +	gSavedSettings.setString("ClientSettingsFile",  +        gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE)); +	gSavedSettings.setString("VersionChannelName", LL_CHANNEL); +    #ifndef	LL_RELEASE_FOR_DOWNLOAD +        gSavedSettings.setBOOL("ShowConsoleWindow", TRUE); +    #endif + +	// These are warnings that appear on the first experience of that condition. +	// They are already set in the settings_default.xml file, but still need to be added to LLFirstUse +	// for disable/reset ability +	LLFirstUse::addConfigVariable("FirstBalanceIncrease"); +	LLFirstUse::addConfigVariable("FirstBalanceDecrease"); +	LLFirstUse::addConfigVariable("FirstSit"); +	LLFirstUse::addConfigVariable("FirstMap"); +	LLFirstUse::addConfigVariable("FirstGoTo"); +	LLFirstUse::addConfigVariable("FirstBuild"); +	LLFirstUse::addConfigVariable("FirstLeftClickNoHit"); +	LLFirstUse::addConfigVariable("FirstTeleport"); +	LLFirstUse::addConfigVariable("FirstOverrideKeys"); +	LLFirstUse::addConfigVariable("FirstAttach"); +	LLFirstUse::addConfigVariable("FirstAppearance"); +	LLFirstUse::addConfigVariable("FirstInventory"); +	LLFirstUse::addConfigVariable("FirstSandbox"); +	LLFirstUse::addConfigVariable("FirstFlexible"); +	LLFirstUse::addConfigVariable("FirstDebugMenus"); +	LLFirstUse::addConfigVariable("FirstStreamingMusic"); +	LLFirstUse::addConfigVariable("FirstStreamingVideo"); +	LLFirstUse::addConfigVariable("FirstSculptedPrim"); +	LLFirstUse::addConfigVariable("FirstVoice"); +	LLFirstUse::addConfigVariable("FirstMedia"); +		 +    ////// +    // *FIX:Mani - Find a way to remove the gUICtrlFactory and +    // LLAlertDialog::parseAlerts dependecies on the being loaded +    // *before* the user settings. Having to do this init here +    // seems odd.  + +   	// Need to do this before calling parseAlerts +	gUICtrlFactory = new LLViewerUICtrlFactory(); +	 +	// Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/) +	// Do this *before* loading the settings file +	LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE); + +	// Overwrite default user settings with	user settings +	loadSettingsFromDirectory(LL_PATH_USER_SETTINGS); + +	// Parse command line settings. +	LLControlGroupCLP clp; +	std::string	cmd_line_config	= gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, +														  "cmd_line.xml"); +	clp.configure(cmd_line_config, &gSavedSettings); + +	if(!initParseCommandLine(clp)) +	{ +		llwarns	 +			<< "Error parsing command line options.	Command	Line options ignored."  +			<< llendl; + +		llinfos	<< "Command	line usage:\n" << clp << llendl; +	} + +	// If the user has specified a alternate settings file name. +	// Load	it now. +	if(clp.hasOption("settings")) +	{ +		std::string	user_settings_filename = clp.getOption("settings")[0]; +		std::string	full_settings_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,  +																		 user_settings_filename); + +		llinfos	<< "Loading	command	line specified settings	file: "	<< full_settings_path << llendl; + +		if(!gSavedSettings.loadFromFile(full_settings_path))		 +		{ +			llwarns	<< "File not found:	" << full_settings_path	<< llendl; +		} + +		gSavedSettings.setString("ClientSettingsFile", full_settings_path); +	} + +	// Apply the command line params to	the	settings system. +	// Anyway the following	call to	notify depends upon	the	settings being init'd. +	clp.notify();  + +	// Start up	the	debugging console before handling other	options. +	if (gSavedSettings.getBOOL("ShowConsoleWindow")) +	{ +		initConsole(); +	} + +	if(clp.hasOption("help")) +	{ +		llinfos	<< "Command	line usage:\n" << clp << llendl; +		return false; +	} + +    ////////////////////////// +    // Apply settings... +    if(clp.hasOption("setdefault")) +    { +        //const LLCommandLineParser::token_vector_t& setdefault = clp.getOption("setdefault"); +        //if(0x1 & setdefault.size()) +        //{ +        //    llwarns << "Invalid '--setdefault' parameter count." << llendl; +        //} +        //else +        //{ +        //    LLCommandLineParser::token_vector_t::const_iterator itr = setdefault.begin(); +        //    for(; itr != setdefault.end(); ++itr) +        //    { +        //        const std::string& name = *itr; +        //        const std::string& value = *(++itr); +        //        LLControlVariable* c = gSettings["global"]->getControl(name); +        //        if(c) +        //        { +        //            c->setDefault(value); +        //        } +        //        else +        //        { +        //            llwarns << "'--setdefault' specified with unknown setting: '" +        //                << name << "'." << llendl; +        //        } +        //    } +        //} +    } + +    if(clp.hasOption("set")) +    { +        const LLCommandLineParser::token_vector_t& set_values = clp.getOption("set"); +        if(0x1 & set_values.size()) +        { +            llwarns << "Invalid '--set' parameter count." << llendl; +        } +        else +        { +            LLCommandLineParser::token_vector_t::const_iterator itr = set_values.begin(); +            for(; itr != set_values.end(); ++itr) +            { +                const std::string& name = *itr; +                const std::string& value = *(++itr); +                LLControlVariable* c = gSettings["Global"]->getControl(name); +                if(c) +                { +                    c->setValue(value, false); +                } +                else +                { +                    llwarns << "'--set' specified with unknown setting: '" +                        << name << "'." << llendl; +                } +            } +        } +    } + +    initGridChoice(); + +    // Handle slurl use. NOTE: Don't let SL-55321 reappear. + +    // *FIX: This init code should be made more robust to prevent  +    // the issue SL-55321 from returning. One thought is to allow  +    // only select options to be set from command line when a slurl  +    // is specified. More work on the settings system is needed to  +    // achieve this. For now... + +    // *NOTE:Mani The command line parser parses tokens and is  +    // setup to bail after parsing the '--url' option or the  +    // first option specified without a '--option' flag (or +    // any other option that uses the 'last_option' setting -  +    // see LLControlGroupCLP::configure()) + +    // What can happen is that someone can use IE (or potentially  +    // other browsers) and do the rough equivalent of command  +    // injection and steal passwords. Phoenix. SL-55321 +    if(clp.hasOption("url")) +    { +        std::string slurl = clp.getOption("url")[0]; +        if (LLURLDispatcher::isSLURLCommand(slurl)) +        { +	        LLStartUp::sSLURLCommand = slurl; +        } +        else +        { +	        LLURLSimString::setString(slurl); +        } +    } +    else if(clp.hasOption("slurl")) +    { +        std::string slurl = clp.getOption("slurl")[0]; +        if(LLURLDispatcher::isSLURL(slurl)) +        { +            if (LLURLDispatcher::isSLURLCommand(slurl)) +            { +	            LLStartUp::sSLURLCommand = slurl; +            } +            else +            { +	            LLURLSimString::setString(slurl); +            } +        } +    } + +    const LLControlVariable* loginuri = gSavedSettings.getControl("LoginURI"); +    if(loginuri && LLString::null != loginuri->getValue().asString()) +    {    +        addLoginURI(loginuri->getValue().asString()); +    } + +    const LLControlVariable* helperuri = gSavedSettings.getControl("HelperURI"); +    if(helperuri && LLString::null != helperuri->getValue().asString()) +    {    +        setHelperURI(helperuri->getValue().asString()); +    } + +    const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinFolder"); +    if(skinfolder && LLString::null != skinfolder->getValue().asString()) +    {    +        gDirUtilp->setSkinFolder(skinfolder->getValue().asString()); +    } + +    mYieldTime = gSavedSettings.getS32("YieldTime"); +               	// XUI:translate  	gSecondLife = "Second Life"; @@ -2068,19 +1776,6 @@ bool LLAppViewer::initConfiguration()  	gStartTime = totalTime(); -	//////////////////////////////////////// -	// -	// Process ini files -	// - -	// declare all possible setting variables -	declare_settings(); - -#if !LL_RELEASE_FOR_DOWNLOAD -//	only write the defaults for non-release builds! -	gSavedSettings.saveToFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings_default.xml").c_str(), FALSE); -#endif -  	//  	// Set the name of the window  	// @@ -2093,7 +1788,7 @@ bool LLAppViewer::initConfiguration()  #endif  	LLString::truncate(gWindowTitle, 255); -	if (!gMultipleViewersOK) +	if (!gSavedSettings.getBOOL("AllowMultipleViewers"))  	{  	    //  	    // Check for another instance of the app running @@ -2219,12 +1914,12 @@ bool LLAppViewer::initConfiguration()  		if (mSecondInstance)  		{ -			gDisableVoice = TRUE; +			gSavedSettings.setBOOL("CmdLineDisableVoice", TRUE);  			/* Don't start another instance if using -multiple  			//RN: if we received a URL, hand it off to the existing instance -		    if (LLURLSimString::parse()) -		    { -			    LLURLSimString::send_to_other_instance(); +			if (LLURLSimString::parse()) +			{ +				LLURLSimString::send_to_other_instance();  				return 1;  			}  			*/ @@ -2233,95 +1928,15 @@ bool LLAppViewer::initConfiguration()  		initMarkerFile();  	} -	return true; // Config was successful. -} - -bool LLAppViewer::doConfigFromCommandLine() -{ -	// *FIX: This is what parse args used to do, minus the arg reading part. -	// Now the arg parsing is handled by LLApp::parseCommandOptions() and this -	// method need only interpret settings. Perhaps some day interested parties  -	// can ask an app about a setting rather than have the app set  -	// a gazzillion globals. -	 -	///////////////////////////////////////// -	// -	// Process command line arguments -	// -	S32 args_result = 0; - -#if LL_DARWIN -	{ -		// On the Mac, read in arguments.txt (if it exists) and process it for additional arguments. -		LLString args; -		if(_read_file_into_string(args, "arguments.txt"))		/* Flawfinder: ignore*/ -		{ -			// The arguments file exists.   -			// It should consist of command line arguments separated by newlines. -			// Split it into individual arguments and build a fake argv[] to pass to parse_args. -			std::vector<std::string> arglist; -			 -			arglist.push_back("newview"); -			 -			llinfos << "Reading additional command line arguments from arguments.txt..." << llendl; -			 -			typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer; -			boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'"); -			tokenizer tokens(args, sep); -			tokenizer::iterator token_iter; - -			for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) -			{ -				llinfos << "argument: '" << (token_iter->c_str()) << "'" << llendl; -				 -				arglist.push_back(*token_iter); -			} - -			char **fakeargv = new char*[arglist.size()]; -			int i; -			for(i=0; i < arglist.size(); i++) -				fakeargv[i] = const_cast<char*>(arglist[i].c_str()); -				 -			args_result = parse_args(arglist.size(), fakeargv); -			delete[] fakeargv; -		} -		 -		// Get the user's preferred language string based on the Mac OS localization mechanism. -		// To add a new localization: -			// go to the "Resources" section of the project -			// get info on "language.txt" -			// in the "General" tab, click the "Add Localization" button -			// create a new localization for the language you're adding -			// set the contents of the new localization of the file to the string corresponding to our localization -			//   (i.e. "en-us", "ja", etc.  Use the existing ones as a guide.) -		CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL); -		char path[MAX_PATH]; -		if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path))) -		{ -			LLString lang; -			if(_read_file_into_string(lang, path))		/* Flawfinder: ignore*/ -			{ -				gCommandLineForcedSettings["SystemLanguage"] = lang; -			} -		} -		CFRelease(url); -	} -#endif - -	int argc = gTempArgC; -	char** argv = gTempArgV; - -	// -	// Parse the command line arguments -	// -	args_result |= parse_args(argc, argv); -	if (args_result) +   	// need to do this here - need to have initialized global settings first +	LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" ); +	if ( nextLoginLocation.length() )  	{ -		removeMarkerFile(); -		return false; -	} +		LLURLSimString::setString( nextLoginLocation.c_str() ); +	}; -	return true; +	gLastRunVersion = gSavedSettings.getString("LastRunVersion"); +	return true; // Config was successful.  }  bool LLAppViewer::initWindow() @@ -2340,10 +1955,11 @@ bool LLAppViewer::initWindow()  	window_title_str[sizeof(window_title_str) - 1] = '\0';  	// always start windowed +	BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");  	gViewerWindow = new LLViewerWindow(window_title_str, "Second Life",  		gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),  		gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"), -		FALSE, gIgnorePixelDepth); +		FALSE, ignorePixelDepth);  	if (gSavedSettings.getBOOL("FullScreen"))  	{ @@ -2365,14 +1981,14 @@ bool LLAppViewer::initWindow()  		// Set this flag in case we crash while initializing GL  		gSavedSettings.setBOOL("RenderInitError", TRUE); -		gSavedSettings.saveToFile( gSettingsFileName, TRUE ); +		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );  		gPipeline.init();  		stop_glerror();  		gViewerWindow->initGLDefaults();  		gSavedSettings.setBOOL("RenderInitError", FALSE); -		gSavedSettings.saveToFile( gSettingsFileName, TRUE ); +		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );  	}  	LLUI::sWindow = gViewerWindow->getWindow(); @@ -2380,11 +1996,6 @@ bool LLAppViewer::initWindow()  	LLAlertDialog::parseAlerts("alerts.xml");  	LLNotifyBox::parseNotify("notify.xml"); -	// *TODO - remove this when merging into release -	// DON'T Clean up the feature manager lookup table - settings are needed -	// for setting the graphics level. -	//gFeatureManagerp->cleanupFeatureTables(); -  	// Show watch cursor  	gViewerWindow->setCursor(UI_CURSOR_WAIT); @@ -2474,7 +2085,7 @@ void LLAppViewer::writeSystemInfo()  {  	gDebugInfo["SLLog"] = LLError::logFileName(); -	gDebugInfo["ClientInfo"]["Name"] = gChannelName; +	gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName");  	gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;  	gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;  	gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH; @@ -2525,7 +2136,7 @@ void LLAppViewer::handleViewerCrash()  	}  	pApp->mReportedCrash = TRUE; -	gDebugInfo["SettingsFilename"] = gSettingsFileName; +	gDebugInfo["SettingsFilename"] = gSavedSettings.getString("ClientSettingsFile");  	gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();  	gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName().c_str();  	gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath().c_str(); @@ -2666,7 +2277,11 @@ void LLAppViewer::initMarkerFile()  	ll_apr_file_remove(error_marker_file);  	//Freeze case checks -	if(anotherInstanceRunning()) return; +	if(anotherInstanceRunning())  +	{ +		return; +	} +	  	fMarker = ll_apr_file_open(mMarkerFileName, LL_APR_RB);		  	if (fMarker != NULL)  	{ @@ -2872,7 +2487,7 @@ bool LLAppViewer::initCache()  	char static_vfs_index_file[LL_MAX_PATH];	// Flawfinder: ignore  	char static_vfs_data_file[LL_MAX_PATH];	// Flawfinder: ignore -	if (gMultipleViewersOK) +	if (gSavedSettings.getBOOL("AllowMultipleViewers"))  	{  		// don't mess with renaming the VFS in this case  		new_salt = old_salt; @@ -3071,17 +2686,6 @@ void LLAppViewer::setHelperURI(const std::string& uri)      gHelperURI = uri;  } -void LLAppViewer::setLoginPage(const std::string& login_page) -{ -	gLoginPage = login_page; -} - -const std::string& LLAppViewer::getLoginPage() -{ -	return gLoginPage; -} - -  // Callback from a dialog indicating user was logged out.    void finish_disconnect(S32 option, void* userdata)  { @@ -3250,8 +2854,6 @@ void LLAppViewer::idle()  	// Update frame timers  	static LLTimer idle_timer; -	LLControlBase::updateAllListeners(); -  	LLFrameTimer::updateFrameTime();  	LLEventTimer::updateClass();  	LLCriticalDamp::updateInterpolants(); @@ -3272,9 +2874,10 @@ void LLAppViewer::idle()  	// Smoothly weight toward current frame  	gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f; -	if (gQuitAfterSeconds > 0.f) +	F32 qas = gSavedSettings.getF32("QuitAfterSeconds"); +	if (qas > 0.f)  	{ -		if (gRenderStartTime.getElapsedTimeF32() > gQuitAfterSeconds) +		if (gRenderStartTime.getElapsedTimeF32() > qas)  		{  			LLAppViewer::instance()->forceQuit();  		} @@ -3313,7 +2916,7 @@ void LLAppViewer::idle()  	    // Update simulator agent state  	    // -		if (gRotateRight) +		if (gSavedSettings.getBOOL("RotateRight"))  		{  			gAgent.moveYaw(-1.f);  		} @@ -3521,7 +3124,6 @@ void LLAppViewer::idle()  	//  	// Update weather effects  	// -  	if (!gNoRender)  	{  		gWorldp->updateClouds(gFrameDTClamped); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 9518636f87..40a69f7868 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -36,15 +36,21 @@ class LLTextureCache;  class LLWorkerThread;  class LLTextureFetch; +class LLCommandLineParser; +  class LLAppViewer : public LLApp  {  public:  	LLAppViewer();  	virtual ~LLAppViewer(); -	// *NOTE:Mani - Don't use this! -	// Having  -	static LLAppViewer* instance() {return sInstance; }  +    /** +     * @brief Access to the LLAppViewer singleton. +     *  +     * The LLAppViewer singleton is created in main()/WinMain(). +     * So don't use it in pre-entry (static initialization) code. +     */ +    static LLAppViewer* instance() {return sInstance; }   	//  	// Main application logic @@ -64,10 +70,6 @@ public:      bool quitRequested() { return mQuitRequested; }      bool logoutRequestSent() { return mLogoutRequestSent; } -	// *FIX: This is meant to stay only until the command line issues are hashed out with repect to LLApp::parseCommandLine -	// This version stores the argc and argv for later usage, make sure the params passed in last as long as this class. -	bool tempStoreCommandOptions(int argc, char** argv); -  	void closeDebug();  	const LLOSInfo& getOSInfo() const { return mSysOSInfo; } @@ -87,9 +89,6 @@ public:  	const std::string& getSerialNumber() { return mSerialNumber; } -	// *FIX:Mani purgeCache was made public for parse_args(). -	// If that beast is gone, make it private. -	void purgeCache(); // Clear the local cache.   	bool getPurgeCache() const { return mPurgeCache; }  	const LLString& getSecondLifeTitle() const; // The Second Life title. @@ -101,8 +100,6 @@ public:      const std::vector<std::string>& getLoginURIs() const;      const std::string& getHelperURI() const;      void resetURIs() const; -    void setLoginPage(const std::string& login_page); -    const std::string& getLoginPage();      void forceDisconnect(const LLString& msg); // Force disconnection, with a message to the user.      void badNetworkHandler(); // Cause a crash state due to bad network packet. @@ -125,23 +122,26 @@ public:      virtual void forceErrorInifiniteLoop();      virtual void forceErrorSoftwareException(); +	void loadSettingsFromDirectory(ELLPath path_index);  protected:  	virtual bool initWindow(); // Initialize the viewer's window.  	virtual bool initLogging(); // Initialize log files, logging system, return false on failure. +	virtual void initConsole() {}; // Initialize OS level debugging console.  	virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit. + +    virtual bool initParseCommandLine(LLCommandLineParser& clp)  +        { return true; } // Allow platforms to specify the command line args.  	virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.  private: -	bool initEarlyConfiguration(); // Initialize setting needed by crash reporting.  	bool initThreads(); // Initialize viewer threads, return false on failure.  	bool initConfiguration(); // Initialize settings from the command line/config file.  	bool initCache(); // Initialize local client cache. - -	bool doConfigFromCommandLine(); // calls parse args. +	void purgeCache(); // Clear the local cache.   	void cleanupSavedSettings(); // Sets some config data to current or default values during cleanup.  	void removeCacheFiles(const char *filemask); // Deletes cached files the match the given wildcard. @@ -186,6 +186,8 @@ private:      bool mQuitRequested;				// User wants to quit, may have modified documents open.      bool mLogoutRequestSent;			// Disconnect message sent to simulator, no longer safe to send messages to the sim. +    S32 mYieldTime; +	LLSD mSettingsFileList;  };  // consts from viewer.h @@ -196,31 +198,16 @@ const S32 AGENT_UPDATES_PER_SECOND  = 10;  //  // "// llstartup" indicates that llstartup is the only client for this global. -extern bool gVerifySSLCert; // parse_args setting used by llxmlrpctransaction.cpp  extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp -extern BOOL gProbeHardware;  extern LLString gDisabledMessage; // llstartup  extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup  extern LLSD gDebugInfo;  extern BOOL	gAllowIdleAFK; -extern F32 gAFKTimeout;  extern BOOL	gShowObjectUpdates; -extern BOOL gLogMessages; // llstartup  -extern std::string gChannelName; -extern BOOL gUseAudio; // llstartup - -extern LLString gCmdLineFirstName; // llstartup -extern LLString gCmdLineLastName; -extern LLString gCmdLinePassword; - -extern BOOL gAutoLogin; // llstartup  extern const char* DEFAULT_SETTINGS_FILE; // llstartup -extern BOOL gRequestInventoryLibrary; // llstartup -extern BOOL gGodConnect; // llstartup -  extern BOOL gAcceptTOS;  extern BOOL gAcceptCriticalMessage; @@ -265,7 +252,6 @@ extern LLUUID gInventoryLibraryOwner;  extern LLUUID gInventoryLibraryRoot;  extern BOOL		gDisconnected; -extern BOOL		gDisableVoice;  // Map scale in pixels per region  extern F32 gMapScale; @@ -275,9 +261,6 @@ extern LLFrameTimer	gRestoreGLTimer;  extern BOOL			gRestoreGL;  extern BOOL		gUseWireframe; -extern F32 gMouseSensitivity; -extern BOOL gInvertMouse; -  // VFS globals - gVFS is for general use  // gStaticVFS is read-only and is shipped w/ the viewer  // it has pre-cache data like the UI .TGAs @@ -285,9 +268,6 @@ extern LLVFS	*gStaticVFS;  extern LLMemoryInfo gSysMemory; -extern bool gPreloadImages; -extern bool gPreloadSounds; -  extern LLString gLastVersionChannel;  extern LLVector3 gWindVec; @@ -298,10 +278,7 @@ extern BOOL gPrintMessagesThisFrame;  extern LLUUID gSunTextureID;  extern LLUUID gMoonTextureID; -extern BOOL gUseConsole;  -  extern BOOL gRandomizeFramerate;  extern BOOL gPeriodicSlowFrame; -extern BOOL gQAMode;  #endif // LL_LLAPPVIEWER_H diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 1993fd0a76..c36dd2955e 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -31,9 +31,11 @@  #include "llviewerprecompiledheaders.h" -#include "llmemtype.h"  #include "llappviewerlinux.h" +#include "llcommandlineparser.h" + +#include "llmemtype.h"  #include "llviewernetwork.h"  #include "llmd5.h" @@ -54,6 +56,12 @@    #     include <ucontext.h>    #endif +namespace +{ +	int gArgC = 0; +	char **gArgV = NULL; +} +  int main( int argc, char **argv )   {  	LLMemType mt1(LLMemType::MTYPE_STARTUP); @@ -62,18 +70,14 @@ int main( int argc, char **argv )  	asm ("ta\t6");		 // NOTE:  Make sure memory alignment is enforced on SPARC  #endif +	gArgC = argc; +	gArgV = argv; +  	LLAppViewer* viewer_app_ptr = new LLAppViewerLinux();  	viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); -	bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv); -	if(!ok) -	{ -		llwarns << "Unable to parse command line." << llendl; -		return -1; -	} - -	ok = viewer_app_ptr->init(); +	bool ok = viewer_app_ptr->init();  	if(!ok)  	{  		llwarns << "Application init failed." << llendl; @@ -321,7 +325,7 @@ void LLAppViewerLinux::handleCrashReporting()  			{(char*)cmd.c_str(),  			 ask_dialog,  			 (char*)"-user", -			 (char*)gGridName, +			 (char*)gGridName.c_str(),  			 (char*)"-name",  			 (char*)LLAppViewer::instance()->getSecondLifeTitle().c_str(),  			 NULL}; @@ -403,6 +407,12 @@ bool LLAppViewerLinux::initLogging()  	return LLAppViewer::initLogging();  } +bool LLAppViewerLinux::initParseCommandLine(LLCommandLineParser& clp) +{ +	clp.parseCommandLine(gArgC, gArgV); +	return true; +} +  std::string LLAppViewerLinux::generateSerialNumber()  {  	char serial_md5[MD5HEX_STR_SIZE]; diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h index f38a64a8cd..ce91b6b8b6 100644 --- a/indra/newview/llappviewerlinux.h +++ b/indra/newview/llappviewerlinux.h @@ -36,6 +36,8 @@  #include "llappviewer.h"  #endif +class LLCommandLineParser; +  class LLAppViewerLinux : public LLAppViewer  {  public: @@ -54,6 +56,7 @@ protected:  	virtual void handleCrashReporting();  	virtual bool initLogging(); +	virtual bool initParseCommandLine(LLCommandLineParser& clp);  };  #endif // LL_LLAPPVIEWERLINUX_H diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 2d7091a075..ba3f28911f 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -36,6 +36,8 @@  #endif  #include "llappviewermacosx.h" +#include "llcommandlineparser.h" +  #include "llmemtype.h"  #include "llviewernetwork.h" @@ -45,6 +47,13 @@  #include "llurldispatcher.h"  #include <Carbon/Carbon.h> +namespace  +{ +	// The command line args stored. +	// They are not used immediately by the app. +	int gArgC; +	char** gArgV; +}  int main( int argc, char **argv )   { @@ -61,14 +70,11 @@ int main( int argc, char **argv )  	viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); -	bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv); -	if(!ok) -	{ -		llwarns << "Unable to parse command line." << llendl; -		return -1; -	} - -	ok = viewer_app_ptr->init(); +	// Store off the command line args for use later. +	gArgC = argc; +	gArgV = argv; +	 +	bool ok = viewer_app_ptr->init();  	if(!ok)  	{  		llwarns << "Application init failed." << llendl; @@ -108,6 +114,27 @@ bool LLAppViewerMacOSX::init()  	return LLAppViewer::init();  } +bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp) +{ +	// First parse the command line, not often used on the mac. +	clp.parseCommandLine(gArgC, gArgV); +     +    // Now read in the args from arguments txt. +    // Succesive calls to clp.parse... will NOT override earlier  +    // options.  +    const char* filename = "arguments.txt"; +	llifstream ifs(filename, llifstream::binary); +	if (!ifs.is_open()) +	{ +		llwarns << "Unable to open file" << filename << llendl; +		return false; +	} +	 + +	clp.parseCommandLineFile(ifs); +    return true; +} +  void LLAppViewerMacOSX::handleCrashReporting()  {  	// Macintosh diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index 2c61e5a01c..cc4a7f5eb5 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -51,6 +51,7 @@ public:  protected:  	virtual void handleCrashReporting();   	std::string generateSerialNumber(); +    virtual bool initParseCommandLine(LLCommandLineParser& clp);  };  #endif // LL_LLAPPVIEWERMACOSX_H diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 09bcf6f7cc..fb726e7c97 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -55,41 +55,13 @@  #include "llviewernetwork.h"  #include "llmd5.h" -void fill_args(int& argc, char** argv, const S32 max_args, LPSTR cmd_line) -{ -	char *token = NULL; -	if( cmd_line[0] == '\"' ) -	{ -		// Exe name is enclosed in quotes -		token = strtok( cmd_line, "\"" ); -		argv[argc++] = token; -		token = strtok( NULL, " \t," ); -	} -	else -	{ -		// Exe name is not enclosed in quotes -		token = strtok( cmd_line, " \t," ); -	} +#include "llcommandlineparser.h" -	while( (token != NULL) && (argc < max_args) ) -	{ -		argv[argc++] = token; -		/* Get next token: */ -		if (*(token + strlen(token) + 1) == '\"')		/* Flawfinder: ignore*/ -		{ -			token = strtok( NULL, "\""); -		} -		else -		{ -			token = strtok( NULL, " \t," ); -		} -	} -} - -// *NOTE:Mani - this code is stolen from LLApp, where its never actually used.  LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)  { -	// Translate the signals/exceptions into cross-platform stuff +    // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. +	 +    // Translate the signals/exceptions into cross-platform stuff  	// Windows implementation  	llinfos << "Entering Windows Exception Handler..." << llendl; @@ -144,21 +116,7 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,  	// *FIX: global  	gIconResource = MAKEINTRESOURCE(IDI_LL_ICON); -	// In Win32, we need to generate argc and argv ourselves... -	// Note: GetCommandLine() returns a  potentially return a LPTSTR -	// which can resolve to a LPWSTR (unicode string). -	// (That's why it's different from lpCmdLine which is a LPSTR.) -	// We don't currently do unicode, so call the non-unicode version -	// directly. -	LPSTR cmd_line_including_exe_name = GetCommandLineA(); - -	const S32	MAX_ARGS = 100; -	int argc = 0; -	char* argv[MAX_ARGS];		/* Flawfinder: ignore */ - -	fill_args(argc, argv, MAX_ARGS, cmd_line_including_exe_name); - -	LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(); +	LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(lpCmdLine);  	// *FIX:Mani This method is poorly named, since the exception  	// is now handled by LLApp.  @@ -180,13 +138,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,  	viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash); -	ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv); -	if(!ok) -	{ -		llwarns << "Unable to parse command line." << llendl; -		return -1; -	} -  	ok = viewer_app_ptr->init();  	if(!ok)  	{ @@ -308,7 +259,8 @@ void create_console()  	setvbuf( stderr, NULL, _IONBF, 0 );  } -LLAppViewerWin32::LLAppViewerWin32() +LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) : +    mCmdLine(cmd_line)  {  } @@ -339,15 +291,11 @@ bool LLAppViewerWin32::cleanup()  	return result;  } -bool LLAppViewerWin32::initWindow() +void LLAppViewerWin32::initConsole()  { -	// pop up debug console if necessary -	if (gUseConsole && gSavedSettings.getBOOL("ShowConsoleWindow")) -	{ -		create_console(); -	} - -	return LLAppViewer::initWindow(); +	// pop up debug console +	create_console(); +	return LLAppViewer::initConsole();  }  void write_debug_dx(const char* str) @@ -368,7 +316,7 @@ bool LLAppViewerWin32::initHardwareTest()  	// Do driver verification and initialization based on DirectX  	// hardware polling and driver versions  	// -	if (gProbeHardware) +	if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))  	{  		BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup"); @@ -431,6 +379,11 @@ bool LLAppViewerWin32::initHardwareTest()  	return true;  } +bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp) +{ +    return clp.parseCommandLineString(mCmdLine); +} +  void LLAppViewerWin32::handleCrashReporting()  {  	// Windows only behaivor. Spawn win crash reporter. @@ -486,4 +439,4 @@ std::string LLAppViewerWin32::generateSerialNumber()  		llwarns << "GetVolumeInformation failed" << llendl;  	}  	return serial_md5; -}
\ No newline at end of file +} diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 23e7337618..66653c48f5 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -39,7 +39,7 @@  class LLAppViewerWin32 : public LLAppViewer  {  public: -	LLAppViewerWin32(); +	LLAppViewerWin32(const char* cmd_line);  	virtual ~LLAppViewerWin32();  	// @@ -49,15 +49,18 @@ public:  	virtual bool cleanup();  protected: -	virtual bool initWindow(); // Initialize the viewer's window. +	virtual void initConsole(); // Initialize OS level debugging console.  	virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware. -	virtual void handleCrashReporting();  +    virtual bool initParseCommandLine(LLCommandLineParser& clp); + +    virtual void handleCrashReporting();   	std::string generateSerialNumber();  private:  	void disableWinErrorReporting(); +    std::string mCmdLine;  };  #endif // LL_LLAPPVIEWERWIN32_H diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp new file mode 100644 index 0000000000..2f99ca1247 --- /dev/null +++ b/indra/newview/llcommandlineparser.cpp @@ -0,0 +1,535 @@ +/** + * @file llcommandlineparser.cpp + * @brief The LLCommandLineParser class definitions + * + * $LicenseInfo:firstyear=2007&license=viewergpl$ + *  + * Copyright (c) 2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */  + +#include "llviewerprecompiledheaders.h" +#include "llcommandlineparser.h" + +// *NOTE: The boost::lexical_cast generates  +// the warning C4701(local used with out assignment) in VC7.1. +// Disable the warning for the boost includes. +#if _MSC_VER +#   pragma warning(push) +#   pragma warning( disable : 4701 ) +#else +// NOTE: For the other platforms? +#endif + +#include <boost/program_options.hpp> +#include <boost/bind.hpp> +#include<boost/tokenizer.hpp> + +#if _MSC_VER +#   pragma warning(pop) +#endif + +#include "llsdserialize.h" +#include <iostream> +#include <sstream> + +#include "llcontrol.h" + +namespace po = boost::program_options; + +// *NTOE:MEP - Currently the boost object reside in file scope.  +// This has a couple of negatives, they are always around and  +// there can be only one instance of each.  +// The plus is that the boost-ly-ness of this implementation is  +// hidden from the rest of the world.  +// Its importatnt to realize that multiple LLCommandLineParser objects  +// will all have this single repository of option escs and parsed options. +// This could be good or bad, and probably won't matter for most use cases. +namespace  +{ +    po::options_description gOptionsDesc; +    po::positional_options_description gPositionalOptions; +	po::variables_map gVariableMap; +     +    const LLCommandLineParser::token_vector_t gEmptyValue; + +    void read_file_into_string(std::string& str, const std::basic_istream < char >& file) +    { +	    std::ostringstream oss; +	    oss << file.rdbuf(); +	    str = oss.str(); +    } + +    bool gPastLastOption = false; +} + +class LLCLPError : public std::logic_error { +public: +    LLCLPError(const std::string& what) : std::logic_error(what) {} +}; + +class LLCLPLastOption : public std::logic_error { +public: +    LLCLPLastOption(const std::string& what) : std::logic_error(what) {} +}; + +class LLCLPValue : public po::value_semantic_codecvt_helper<char>  +{ +    unsigned mMinTokens; +    unsigned mMaxTokens; +    bool mIsComposing; +    typedef boost::function1<void, const LLCommandLineParser::token_vector_t&> notify_callback_t; +    notify_callback_t mNotifyCallback; +    bool mLastOption; + +public: +    LLCLPValue() : +        mMinTokens(0), +        mMaxTokens(0), +        mIsComposing(false), +        mLastOption(false) +        {} +       +    virtual ~LLCLPValue() {}; + +    void setMinTokens(unsigned c)  +    { +        mMinTokens = c; +    } + +    void setMaxTokens(unsigned c)  +    { +        mMaxTokens = c; +    } + +    void setComposing(bool c) +    { +        mIsComposing = c; +    } + +    void setLastOption(bool c) +    { +        mLastOption = c; +    } + +    void setNotifyCallback(notify_callback_t f) +    { +        mNotifyCallback = f; +    } + +    // Overrides to support the value_semantic interface. +    virtual std::string name() const  +    {  +        const std::string arg("arg"); +        const std::string args("args"); +        return (max_tokens() > 1) ? args : arg;  +    } + +    virtual unsigned min_tokens() const +    { +        return mMinTokens; +    } + +    virtual unsigned max_tokens() const  +    { +        return mMaxTokens; +    } + +    virtual bool is_composing() const  +    { +        return mIsComposing; +    } + +    virtual bool apply_default(boost::any& value_store) const +    { +        return false; // No defaults. +    } + +    virtual void notify(const boost::any& value_store) const +    { +        const LLCommandLineParser::token_vector_t* value = +            boost::any_cast<const LLCommandLineParser::token_vector_t>(&value_store); +        if(mNotifyCallback)  +        { +           mNotifyCallback(*value); +        } + +    } + +protected: +    void xparse(boost::any& value_store, +         const std::vector<std::string>& new_tokens) const +    { +        if(gPastLastOption) +        { +            throw(LLCLPLastOption("Don't parse no more!")); +        } + +        // Error checks. Needed? +        if (!value_store.empty() && !is_composing())  +        { +            throw(LLCLPError("Non composing value with multiple occurences.")); +        } +        if (new_tokens.size() < min_tokens() || new_tokens.size() > max_tokens()) +        { +            throw(LLCLPError("Illegal number of tokens specified.")); +        } +         +        if(value_store.empty()) +        { +            value_store = boost::any(LLCommandLineParser::token_vector_t()); +        } +        LLCommandLineParser::token_vector_t* tv =  +            boost::any_cast<LLCommandLineParser::token_vector_t>(&value_store);  +        +        for(unsigned i = 0; i < new_tokens.size() && i < mMaxTokens; ++i) +        { +            tv->push_back(new_tokens[i]); +        } + +        if(mLastOption) +        { +            gPastLastOption = true; +        } +    } +}; + +//---------------------------------------------------------------------------- +// LLCommandLineParser defintions +//---------------------------------------------------------------------------- +void LLCommandLineParser::addOptionDesc(const LLString& option_name,  +                                        boost::function1<void, const token_vector_t&> notify_callback, +                                        unsigned int token_count, +                                        const LLString& description, +                                        const LLString& short_name, +                                        bool composing, +                                        bool positional, +                                        bool last_option) +{ +    // Compose the name for boost::po.  +    // It takes the format "long_name, short name" +    const LLString comma(","); +    LLString boost_option_name = option_name; +    if(short_name != LLString::null) +    { +        boost_option_name += comma; +        boost_option_name += short_name; +    } +    +    LLCLPValue* value_desc = new LLCLPValue(); +    value_desc->setMinTokens(token_count); +    value_desc->setMaxTokens(token_count); +    value_desc->setComposing(composing); +    value_desc->setLastOption(last_option); + +    boost::shared_ptr<po::option_description> d( +            new po::option_description(boost_option_name.c_str(),  +                                    value_desc,  +                                    description.c_str())); + +    if(!notify_callback.empty()) +    { +        value_desc->setNotifyCallback(notify_callback); +    } + +    gOptionsDesc.add(d); + +    if(positional) +    { +        gPositionalOptions.add(boost_option_name.c_str(), token_count); +    } +} + +bool parseAndStoreResults(po::command_line_parser& clp) +{ +    try +    { +        clp.options(gOptionsDesc); +        clp.positional(gPositionalOptions); +        clp.style(po::command_line_style::default_style  +                  | po::command_line_style::allow_long_disguise); +        po::basic_parsed_options<char> opts = clp.run(); +        po::store(opts, gVariableMap); +    } +    catch(po::error& e) +    { +        llwarns << "Caught Error:" << e.what() << llendl; +        return false; +    } +    catch(LLCLPError& e) +    { +        llwarns << "Caught Error:" << e.what() << llendl; +        return false; +    } +    catch(LLCLPLastOption&)  +    { +        // Continue without parsing. +        llwarns << "Found tokens past last option. Ignoring." << llendl; + +        // boost::po will have stored a mal-formed option.  +        // All such options will be removed below. +        for(po::variables_map::iterator i = gVariableMap.begin(); i != gVariableMap.end();) +        { +            po::variables_map::iterator tempI = i++; +            if(tempI->second.empty()) +            { +                gVariableMap.erase(tempI); +            } +        } +    }  +    return true; +} + +bool LLCommandLineParser::parseCommandLine(int argc, char **argv) +{ +    po::command_line_parser clp(argc, argv); +    return parseAndStoreResults(clp); +} + +bool LLCommandLineParser::parseCommandLineString(const std::string& str) +{ +    // Split the string content into tokens +    boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'"); +    boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep); +    std::vector<std::string> tokens; +    // std::copy(tok.begin(), tok.end(), std::back_inserter(tokens)); +    for(boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin(); +        i != tok.end(); +        ++i) +    { +        if(0 != i->size()) +        { +            tokens.push_back(*i); +        } +    } + +    po::command_line_parser clp(tokens); +    return parseAndStoreResults(clp); +         +} + +bool LLCommandLineParser::parseCommandLineFile(const std::basic_istream < char >& file) +{ +    std::string args; +    read_file_into_string(args, file); + +    return parseCommandLineString(args); +} + +void LLCommandLineParser::notify() +{ +    po::notify(gVariableMap);     +} + +void LLCommandLineParser::printOptions() const +{ +    for(po::variables_map::iterator i = gVariableMap.begin(); i != gVariableMap.end(); ++i) +    { +        std::string name = i->first; +        token_vector_t values = i->second.as<token_vector_t>(); +        std::ostringstream oss; +        oss << name << ": "; +        for(token_vector_t::iterator t_itr = values.begin(); t_itr != values.end(); ++t_itr) +        { +            oss << t_itr->c_str() << " "; +        } +        llinfos << oss.str() << llendl; +    } +} + +std::ostream& LLCommandLineParser::printOptionsDesc(std::ostream& os) const +{ +    return os << gOptionsDesc; +} + +bool LLCommandLineParser::hasOption(const std::string& name) const +{ +    return gVariableMap.count(name) > 0; +} + +const LLCommandLineParser::token_vector_t& LLCommandLineParser::getOption(const std::string& name) const +{ +    if(hasOption(name)) +    { +        return gVariableMap[name].as<token_vector_t>(); +    } + +    return gEmptyValue; +} + +//---------------------------------------------------------------------------- +// LLControlGroupCLP defintions +//---------------------------------------------------------------------------- +void setControlValueCB(const LLCommandLineParser::token_vector_t& value,  +                       const LLString& opt_name,  +                       LLControlGroup* ctrlGroup) +{ +    if(value.size() > 1) +    { +        llwarns << "Ignoring extra tokens mapped to the setting: " << opt_name << "." << llendl;  +    } +     +    // *FIX: Do sematic conversion here. +    // LLSD (ImplString) Is no good for doing string to type conversion for... +    // booleans +    // compound types +    // ?... + +    LLControlVariable* ctrl = ctrlGroup->getControl(opt_name); +    if(NULL != ctrl) +    { +        switch(ctrl->type()) +        { +        case TYPE_BOOLEAN: +            if(value.size() > 1) +            { +                llwarns << "Ignoring extra tokens." << llendl;  +            } +               +            if(value.size() > 0) +            { +                // There's a token. check the string for true/false/1/0 etc. +                BOOL result = false; +                BOOL gotSet = LLString::convertToBOOL(value[0], result); +                if(gotSet) +                { +                    ctrl->setValue(LLSD(result), false); +                } +            } +            else +            { +                ctrl->setValue(LLSD(true), false); +            } +            break; + +        default: +            { +                // For the default types, let llsd do the conversion. +                if(value.size() > 1) +                { +                    // Assume its an array... +                    LLSD llsdArray; +                    for(unsigned int i = 0; i < value.size(); ++i) +                    { +                        LLSD llsdValue; +                        llsdValue.assign(LLSD::String(value[i])); +                        llsdArray.set(i, llsdValue); +                    } + +                    ctrl->setValue(llsdArray, false); +                } +                else if(value.size() > 0) +                { +                    LLSD llsdValue; +                    llsdValue.assign(LLSD::String(value[0])); +                    ctrl->setValue(llsdValue, false); +                } +            } +            break; +        } +    } +    else +    { +        llwarns << "Command Line option mapping '"  +            << opt_name  +            << "' not found! Ignoring."  +            << llendl; +    } +} + +void LLControlGroupCLP::configure(const LLString& config_filename, LLControlGroup* controlGroup) +{ +    // This method reads the llsd based config file, and uses it to set  +    // members of a control group. +    LLSD clpConfigLLSD; +     +    llifstream input_stream; +    input_stream.open(config_filename.c_str(), std::ios::in | std::ios::binary); + +    if(input_stream.is_open()) +    { +        LLSDSerialize::fromXML(clpConfigLLSD, input_stream); +        for(LLSD::map_iterator option_itr = clpConfigLLSD.beginMap();  +            option_itr != clpConfigLLSD.endMap();  +            ++option_itr) +        { +            LLSD::String long_name = option_itr->first; +            LLSD option_params = option_itr->second; +             +            LLString desc("n/a"); +            if(option_params.has("desc")) +            { +                desc = option_params["desc"].asString(); +            } +             +            LLString short_name = LLString::null; +            if(option_params.has("short")) +            { +                short_name = option_params["short"].asString(); +            } + +            unsigned int token_count = 0; +            if(option_params.has("count")) +            { +                token_count = option_params["count"].asInteger(); +            } + +            bool composing = false; +            if(option_params.has("compose")) +            { +                composing = option_params["compose"].asBoolean(); +            } + +            bool positional = false; +            if(option_params.has("positional")) +            { +                positional = option_params["positional"].asBoolean(); +            } + +            bool last_option = false; +            if(option_params.has("last_option")) +            { +                last_option = option_params["last_option"].asBoolean(); +            } + +            boost::function1<void, const token_vector_t&> callback; +            if(option_params.has("map-to") && (NULL != controlGroup)) +            { +                LLString controlName = option_params["map-to"].asString(); +                callback = boost::bind(setControlValueCB, _1,  +                                       controlName, controlGroup); +            } + +            this->addOptionDesc( +                long_name,  +                callback, +                token_count,  +                desc,  +                short_name,  +                composing, +                positional, +                last_option); +        } +    } +} diff --git a/indra/newview/llcommandlineparser.h b/indra/newview/llcommandlineparser.h new file mode 100644 index 0000000000..6cc40ee8b4 --- /dev/null +++ b/indra/newview/llcommandlineparser.h @@ -0,0 +1,131 @@ +/**  + * @file llcommandlineparser.h + * @brief LLCommandLineParser class declaration + * + * $LicenseInfo:firstyear=2007&license=viewergpl$ + *  + * Copyright (c) 2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ +*/ + +#ifndef LL_LLCOMMANDLINEPARSER_H +#define LL_LLCOMMANDLINEPARSER_H + +#include <boost/function/function1.hpp> + +/**  + * @class LLCommandLineParser + * @brief Handle defining and parsing the command line. + */ +class LLCommandLineParser +{ +public: +    typedef std::vector< std::string > token_vector_t; + +    /** +     * @brief Add a value-less option to the command line description. +     * @param option_name The long name of the cmd-line option.  +     * @param description The text description of the option usage. +     */ +    void addOptionDesc( +        const LLString& option_name,  +        boost::function1<void, const token_vector_t&> notify_callback = 0, +        unsigned int num_tokens = 0, +        const LLString& description = LLString::null, +        const LLString& short_name = LLString::null, +        bool composing = false, +        bool positional = false, +        bool last_option = false); + + +    /**  +     * @brief Parse the command line given by argc/argv. +     */ +	bool parseCommandLine(int argc, char **argv); + +    /**  +     * @brief Parse the command line contained by the given file. +     */ +    bool parseCommandLineString(const std::string& str); + +    /**  +     * @brief Parse the command line contained by the given file. +     */ +    bool parseCommandLineFile(const std::basic_istream< char >& file); + +    /**  +     * @brief Call callbacks associated with option descriptions. +     *  +     * Use this to handle the results of parsing.  +     */ +    void notify(); + +    /** @brief Print a description of the configured options. +     * +     * Use this to print a description of options to the +     * given ostream. Useful for displaying usage info. +     */ +    std::ostream& printOptionsDesc(std::ostream& os) const; + +    /** @brief Manual option setting accessors. +     *  +     * Use these to retrieve get the values set for an option. +     * getOption will return an empty value if the option isn't +     * set.  +     */ +    bool hasOption(const std::string& name) const; +    const token_vector_t& getOption(const std::string& name) const; + +    void printOptions() const; +}; + +inline std::ostream& operator<<(std::ostream& out, const LLCommandLineParser& clp) +{ +    return clp.printOptionsDesc(out); +} + +class LLControlGroup;  + +/**  + * @class LLControlGroupCLP + * @brief Uses the CLP to configure an LLControlGroup + * + *  + */ +class LLControlGroupCLP : public LLCommandLineParser +{ +public: +    /** +     * @brief Configure the command line parser according the given config file. +     * +     * @param config_filename The name of the XML based LLSD config file.  +     * @param clp A reference to the command line parser object to configure. +     * +     * *FIX:Mani Specify config file format. +     */ +    void configure(const LLString& config_filename,  +                   LLControlGroup* controlGroup); +}; + +#endif // LL_LLCOMMANDLINEPARSER_H diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index bf7d48f911..e6fcfb6d40 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -483,7 +483,7 @@ void LLFeatureManager::applyFeatures(bool skipFeatures)  		}  		// get the control setting -		LLControlBase* ctrl = gSavedSettings.getControl(mIt->first); +		LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);  		if(ctrl == NULL)  		{  			llwarns << "AHHH! Control setting " << mIt->first << " does not exist!" << llendl; diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 97ebc02ba1..b00450eec6 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -49,7 +49,8 @@ std::set<LLString> LLFirstUse::sConfigVariables;  // static  void LLFirstUse::addConfigVariable(const LLString& var)  { -	gSavedSettings.addWarning(var); +	//Don't add the warning, now that we're storing the default in the settings_default.xml file +	//gSavedSettings.addWarning(var);  	sConfigVariables.insert(var);  } @@ -256,13 +257,15 @@ void LLFirstUse::useSculptedPrim()  // static   void LLFirstUse::useVoice()  { -	if (gDisableVoice) return; -	if (gSavedSettings.getWarning("FirstVoice")) -	{ -		gSavedSettings.setWarning("FirstVoice", FALSE); - -		LLFloaterVoiceWizard::showInstance(); -	} +	if (!gSavedSettings.getBOOL("CmdLineDisableVoice")) +    { +	    if (gSavedSettings.getWarning("FirstVoice")) +	    { +		    gSavedSettings.setWarning("FirstVoice", FALSE); + +		    LLFloaterVoiceWizard::showInstance(); +	    } +    }  }  // static  diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 4edf6f3652..3a1fc6146a 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -84,7 +84,7 @@ LLFloaterAbout::LLFloaterAbout()  		+ llformat(" %d.%d.%d (%d) %s %s (%s)",  				   LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD,  				   __DATE__, __TIME__, -				   gChannelName.c_str()); +				   gSavedSettings.getString("VersionChannelName").c_str());  	support.append(version);  	support.append("\n\n"); diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 4573ca75d2..7a0f01e5a6 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -173,8 +173,7 @@ bool LLPanelGroups::handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)  		reset();  		return true;  	} -	 -	return LLView::handleEvent(event, userdata); +	return false;  }  // Default constructor diff --git a/indra/newview/llfloatergroups.h b/indra/newview/llfloatergroups.h index a1740861d5..6d99f34085 100644 --- a/indra/newview/llfloatergroups.h +++ b/indra/newview/llfloatergroups.h @@ -83,7 +83,7 @@ protected:  	static instance_map_t sInstances;  }; -class LLPanelGroups : public LLPanel +class LLPanelGroups : public LLPanel, public LLSimpleListener  {  public:  	LLPanelGroups(); diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 584d7479e4..345561f551 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -446,7 +446,7 @@ void LLFloaterPreference::onBtnOK( void* userdata )  		fp->apply();  		fp->close(false); -		gSavedSettings.saveToFile( gSettingsFileName, TRUE ); +		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );  		std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);  		// save all settings, even if equals defaults diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp new file mode 100644 index 0000000000..7975bd95ef --- /dev/null +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -0,0 +1,490 @@ +/**  + * @file llfloatersettingsdebug.cpp + * @brief floater for debugging internal viewer settings + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfloatersettingsdebug.h" +#include "llfloater.h" +#include "llvieweruictrlfactory.h" +#include "llfirstuse.h" +#include "llcombobox.h" +#include "llspinctrl.h" +#include "llcolorswatch.h" +#include "llviewercontrol.h" + +LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; + +LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater("Configuration Editor") +{ +} + +LLFloaterSettingsDebug::~LLFloaterSettingsDebug() +{ +	sInstance = NULL; +} + +BOOL LLFloaterSettingsDebug::postBuild() +{ +	LLComboBox* settings_combo = LLUICtrlFactory::getComboBoxByName(this, "settings_combo"); + +	struct f : public LLControlGroup::ApplyFunctor +	{ +		LLComboBox* combo; +		f(LLComboBox* c) : combo(c) {} +		virtual void apply(const LLString& name, LLControlVariable* control) +		{ +			combo->add(name, (void*)control); +		} +	} func(settings_combo); + +	gSavedSettings.applyToAll(&func); +	gSavedPerAccountSettings.applyToAll(&func); +	gColors.applyToAll(&func); + +	settings_combo->sortByName(); +	settings_combo->setCommitCallback(onSettingSelect); +	settings_combo->setCallbackUserData(this); +	settings_combo->updateSelection(); + +	childSetCommitCallback("val_spinner_1", onCommitSettings); +	childSetUserData("val_spinner_1", this); +	childSetCommitCallback("val_spinner_2", onCommitSettings); +	childSetUserData("val_spinner_2", this); +	childSetCommitCallback("val_spinner_3", onCommitSettings); +	childSetUserData("val_spinner_3", this); +	childSetCommitCallback("val_spinner_4", onCommitSettings); +	childSetUserData("val_spinner_4", this); +	childSetCommitCallback("val_text", onCommitSettings); +	childSetUserData("val_text", this); +	childSetCommitCallback("boolean_combo", onCommitSettings); +	childSetUserData("boolean_combo", this); +	childSetCommitCallback("color_swatch", onCommitSettings); +	childSetUserData("color_swatch", this); +	childSetAction("default_btn", onClickDefault, this); +	mComment = getChild<LLTextEditor>("comment_text"); +	return TRUE; +} + +void LLFloaterSettingsDebug::draw() +{ +	LLComboBox* settings_combo = getChild<LLComboBox>("settings_combo"); +	LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); +	updateControl(controlp); + +	LLFloater::draw(); +} + +//static +void LLFloaterSettingsDebug::show(void*) +{ +	if (sInstance == NULL) +	{ +		sInstance = new LLFloaterSettingsDebug(); + +		gUICtrlFactory->buildFloater(sInstance, "floater_settings_debug.xml"); +	} + +	sInstance->open();		/* Flawfinder: ignore */ +} + +//static  +void LLFloaterSettingsDebug::onSettingSelect(LLUICtrl* ctrl, void* user_data) +{ +	LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; +	LLComboBox* combo_box = (LLComboBox*)ctrl; +	LLControlVariable* controlp = (LLControlVariable*)combo_box->getCurrentUserdata(); + +	floaterp->updateControl(controlp); +} + +//static +void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) +{ +	LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; + +	LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo"); +	LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); + +	LLVector3 vector; +	LLVector3d vectord; +	LLRect rect; +	LLColor4 col4; +	LLColor3 col3; +	LLColor4U col4U; +	LLColor4 color_with_alpha; + +	switch(controlp->type()) +	{		 +	  case TYPE_U32: +		controlp->set(floaterp->childGetValue("val_spinner_1")); +		break; +	  case TYPE_S32: +		controlp->set(floaterp->childGetValue("val_spinner_1")); +		break; +	  case TYPE_F32: +		controlp->set(LLSD(floaterp->childGetValue("val_spinner_1").asReal())); +		break; +	  case TYPE_BOOLEAN: +		controlp->set(floaterp->childGetValue("boolean_combo")); +		break; +	  case TYPE_STRING: +		controlp->set(LLSD(floaterp->childGetValue("val_text").asString())); +		break; +	  case TYPE_VEC3: +		vector.mV[VX] = (F32)floaterp->childGetValue("val_spinner_1").asReal(); +		vector.mV[VY] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); +		vector.mV[VZ] = (F32)floaterp->childGetValue("val_spinner_3").asReal(); +		controlp->set(vector.getValue()); +		break; +	  case TYPE_VEC3D: +		vectord.mdV[VX] = floaterp->childGetValue("val_spinner_1").asReal(); +		vectord.mdV[VY] = floaterp->childGetValue("val_spinner_2").asReal(); +		vectord.mdV[VZ] = floaterp->childGetValue("val_spinner_3").asReal(); +		controlp->set(vectord.getValue()); +		break; +	  case TYPE_RECT: +		rect.mLeft = floaterp->childGetValue("val_spinner_1").asInteger(); +		rect.mRight = floaterp->childGetValue("val_spinner_2").asInteger(); +		rect.mBottom = floaterp->childGetValue("val_spinner_3").asInteger(); +		rect.mTop = floaterp->childGetValue("val_spinner_4").asInteger(); +		controlp->set(rect.getValue()); +		break; +	  case TYPE_COL4: +		col3.setValue(floaterp->childGetValue("color_swatch")); +		col4 = LLColor4(col3, (F32)floaterp->childGetValue("val_spinner_4").asReal()); +		controlp->set(col4.getValue()); +		break; +	  case TYPE_COL3: +		controlp->set(floaterp->childGetValue("color_swatch")); +		//col3.mV[VRED] = (F32)floaterp->childGetValue("val_spinner_1").asC(); +		//col3.mV[VGREEN] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); +		//col3.mV[VBLUE] = (F32)floaterp->childGetValue("val_spinner_3").asReal(); +		//controlp->set(col3.getValue()); +		break; +	  case TYPE_COL4U: +		col3.setValue(floaterp->childGetValue("color_swatch")); +		col4U.setVecScaleClamp(col3); +		col4U.mV[VALPHA] = floaterp->childGetValue("val_spinner_4").asInteger(); +		controlp->set(col4U.getValue()); +		break; +	  default: +		break; +	} +} + +// static +void LLFloaterSettingsDebug::onClickDefault(void* user_data) +{ +	LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; +	LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo"); +	LLControlVariable* controlp = (LLControlVariable*)settings_combo->getCurrentUserdata(); + +	if (controlp) +	{ +		controlp->resetToDefault(); +		floaterp->updateControl(controlp); +	} +} + +// we've switched controls, or doing per-frame update, so update spinners, etc. +void LLFloaterSettingsDebug::updateControl(LLControlVariable* controlp) +{ +	LLSpinCtrl* spinner1 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_1"); +	LLSpinCtrl* spinner2 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_2"); +	LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3"); +	LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4"); +	LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("color_swatch"); + +	if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch) +	{ +		llwarns << "Could not find all desired controls by name" +			<< llendl; +		return; +	} + +	spinner1->setVisible(FALSE); +	spinner2->setVisible(FALSE); +	spinner3->setVisible(FALSE); +	spinner4->setVisible(FALSE); +	color_swatch->setVisible(FALSE); +	childSetVisible("val_text", FALSE); +	childSetVisible("boolean_combo", FALSE); +	mComment->setText(LLString::null); + +	if (controlp) +	{ +		eControlType type = controlp->type(); +		mComment->setText(controlp->getComment()); +		spinner1->setMaxValue(F32_MAX); +		spinner2->setMaxValue(F32_MAX); +		spinner3->setMaxValue(F32_MAX); +		spinner4->setMaxValue(F32_MAX); +		spinner1->setMinValue(-F32_MAX); +		spinner2->setMinValue(-F32_MAX); +		spinner3->setMinValue(-F32_MAX); +		spinner4->setMinValue(-F32_MAX); +		if (!spinner1->hasFocus()) +		{ +			spinner1->setIncrement(0.1f); +		} +		if (!spinner2->hasFocus()) +		{ +			spinner2->setIncrement(0.1f); +		} +		if (!spinner3->hasFocus()) +		{ +			spinner3->setIncrement(0.1f); +		} +		if (!spinner4->hasFocus()) +		{ +			spinner4->setIncrement(0.1f); +		} + +		LLSD sd = controlp->get(); +		switch(type) +		{ +		  case TYPE_U32: +			spinner1->setVisible(TRUE); +			spinner1->setLabel(LLString("value")); // Debug, don't translate +			if (!spinner1->hasFocus()) +			{ +				spinner1->setValue(sd); +				spinner1->setMinValue((F32)U32_MIN); +				spinner1->setMaxValue((F32)U32_MAX); +				spinner1->setIncrement(1.f); +				spinner1->setPrecision(0); +			} +			break; +		  case TYPE_S32: +			spinner1->setVisible(TRUE); +			spinner1->setLabel(LLString("value")); // Debug, don't translate +			if (!spinner1->hasFocus()) +			{ +				spinner1->setValue(sd); +				spinner1->setMinValue((F32)S32_MIN); +				spinner1->setMaxValue((F32)S32_MAX); +				spinner1->setIncrement(1.f); +				spinner1->setPrecision(0); +			} +			break; +		  case TYPE_F32: +			spinner1->setVisible(TRUE); +			spinner1->setLabel(LLString("value")); // Debug, don't translate +			if (!spinner1->hasFocus()) +			{ +				spinner1->setPrecision(3); +				spinner1->setValue(sd); +			} +			break; +		  case TYPE_BOOLEAN: +			childSetVisible("boolean_combo", TRUE); +			 +			if (!childHasFocus("boolean_combo")) +			{ +				if (sd.asBoolean()) +				{ +					childSetValue("boolean_combo", LLSD("true")); +				} +				else +				{ +					childSetValue("boolean_combo", LLSD("")); +				} +			} +			break; +		  case TYPE_STRING: +			childSetVisible("val_text", TRUE); +			if (!childHasFocus("val_text")) +			{ +				childSetValue("val_text", sd); +			} +			break; +		  case TYPE_VEC3: +		  { +			LLVector3 v; +			v.setValue(sd); +			spinner1->setVisible(TRUE); +			spinner1->setLabel(LLString("X")); +			spinner2->setVisible(TRUE); +			spinner2->setLabel(LLString("Y")); +			spinner3->setVisible(TRUE); +			spinner3->setLabel(LLString("Z")); +			if (!spinner1->hasFocus()) +			{ +				spinner1->setPrecision(3); +				spinner1->setValue(v[VX]); +			} +			if (!spinner2->hasFocus()) +			{ +				spinner2->setPrecision(3); +				spinner2->setValue(v[VY]); +			} +			if (!spinner3->hasFocus()) +			{ +				spinner3->setPrecision(3); +				spinner3->setValue(v[VZ]); +			} +			break; +		  } +		  case TYPE_VEC3D: +		  { +			LLVector3d v; +			v.setValue(sd); +			spinner1->setVisible(TRUE); +			spinner1->setLabel(LLString("X")); +			spinner2->setVisible(TRUE); +			spinner2->setLabel(LLString("Y")); +			spinner3->setVisible(TRUE); +			spinner3->setLabel(LLString("Z")); +			if (!spinner1->hasFocus()) +			{ +				spinner1->setPrecision(3); +				spinner1->setValue(v[VX]); +			} +			if (!spinner2->hasFocus()) +			{ +				spinner2->setPrecision(3); +				spinner2->setValue(v[VY]); +			} +			if (!spinner3->hasFocus()) +			{ +				spinner3->setPrecision(3); +				spinner3->setValue(v[VZ]); +			} +			break; +		  } +		  case TYPE_RECT: +		  { +			LLRect r; +			r.setValue(sd); +			spinner1->setVisible(TRUE); +			spinner1->setLabel(LLString("Left")); +			spinner2->setVisible(TRUE); +			spinner2->setLabel(LLString("Right")); +			spinner3->setVisible(TRUE); +			spinner3->setLabel(LLString("Bottom")); +			spinner4->setVisible(TRUE); +			spinner4->setLabel(LLString("Top")); +			if (!spinner1->hasFocus()) +			{ +				spinner1->setPrecision(0); +				spinner1->setValue(r.mLeft); +			} +			if (!spinner2->hasFocus()) +			{ +				spinner2->setPrecision(0); +				spinner2->setValue(r.mRight); +			} +			if (!spinner3->hasFocus()) +			{ +				spinner3->setPrecision(0); +				spinner3->setValue(r.mBottom); +			} +			if (!spinner4->hasFocus()) +			{ +				spinner4->setPrecision(0); +				spinner4->setValue(r.mTop); +			} + +			spinner1->setMinValue((F32)S32_MIN); +			spinner1->setMaxValue((F32)S32_MAX); +			spinner1->setIncrement(1.f); + +			spinner2->setMinValue((F32)S32_MIN); +			spinner2->setMaxValue((F32)S32_MAX); +			spinner2->setIncrement(1.f); + +			spinner3->setMinValue((F32)S32_MIN); +			spinner3->setMaxValue((F32)S32_MAX); +			spinner3->setIncrement(1.f); + +			spinner4->setMinValue((F32)S32_MIN); +			spinner4->setMaxValue((F32)S32_MAX); +			spinner4->setIncrement(1.f); +			break; +		  } +		  case TYPE_COL4: +		  { +			LLColor4 clr; +			clr.setValue(sd); +			color_swatch->setVisible(TRUE); +			// only set if changed so color picker doesn't update +			if(clr != LLColor4(color_swatch->getValue())) +			{ +				color_swatch->set(LLColor4(sd), TRUE, FALSE); +			} +			spinner4->setVisible(TRUE); +			spinner4->setLabel(LLString("Alpha")); +			if (!spinner4->hasFocus()) +			{ +				spinner4->setPrecision(3); +				spinner4->setMinValue(0.0); +				spinner4->setMaxValue(1.f); +				spinner4->setValue(clr.mV[VALPHA]); +			} +			break; +		  } +		  case TYPE_COL3: +		  { +			LLColor3 clr; +			clr.setValue(sd); +			color_swatch->setVisible(TRUE); +			color_swatch->setValue(sd); +			break; +		  } +		  case TYPE_COL4U: +		  { +			LLColor4U clr; +			clr.setValue(sd); +			color_swatch->setVisible(TRUE); +			if(LLColor4(clr) != LLColor4(color_swatch->getValue())) +			{ +				color_swatch->set(LLColor4(clr), TRUE, FALSE); +			} +			spinner4->setVisible(TRUE); +			spinner4->setLabel(LLString("Alpha")); +			if(!spinner4->hasFocus()) +			{ +				spinner4->setPrecision(0); +				spinner4->setValue(clr.mV[VALPHA]); +			} + +			spinner4->setMinValue(0); +			spinner4->setMaxValue(255); +			spinner4->setIncrement(1.f); + +			break; +		  } +		  default: +			mComment->setText(LLString("unknown")); +			break; +		} +	} + +} diff --git a/indra/newview/llfloatersettingsdebug.h b/indra/newview/llfloatersettingsdebug.h new file mode 100644 index 0000000000..389a474467 --- /dev/null +++ b/indra/newview/llfloatersettingsdebug.h @@ -0,0 +1,61 @@ +/**  + * @file llfloatersettingsdebug.h + * @brief floater for debugging internal viewer settings + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LLFLOATERDEBUGSETTINGS_H +#define LLFLOATERDEBUGSETTINGS_H + +#include "llcontrol.h" +#include "llfloater.h" +#include "lltexteditor.h" + +class LLFloaterSettingsDebug : public LLFloater +{ +public: +	LLFloaterSettingsDebug(); +	virtual ~LLFloaterSettingsDebug(); + +	virtual BOOL postBuild(); +	virtual void draw(); + +	void updateControl(LLControlVariable* control); + +	static void show(void*); +	static void onSettingSelect(LLUICtrl* ctrl, void* user_data); +	static void onCommitSettings(LLUICtrl* ctrl, void* user_data); +	static void onClickDefault(void* user_data); + +protected: +	static LLFloaterSettingsDebug* sInstance; +	LLTextEditor* mComment; +}; + +#endif //LLFLOATERDEBUGSETTINGS_H + diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 7ceb40499f..e24b5251e0 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -163,8 +163,6 @@ LLNetMap::LLNetMap(  	mPopupMenuHandle = menu->getHandle();  	sInstance = this; - -	gSavedSettings.getControl("MiniMapRotate")->addListener(&mNetMapListener);  }  LLNetMap::~LLNetMap() @@ -828,9 +826,3 @@ void LLNetMap::handleZoomLevel(void* which)  		break;  	}  } - -bool LLRotateNetMapListener::handleEvent(LLPointer<LLEvent> event, const LLSD& user_data) -{ -	LLNetMap::setRotateMap(event->getValue().asBoolean()); -	return true; -} diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index d375413d1d..dc696238ea 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -45,12 +45,6 @@ class LLCoordGL;  class LLTextBox;  class LLMenuGL; -class LLRotateNetMapListener : public LLSimpleListener -{ -public: -	bool handleEvent(LLPointer<LLEvent>, const LLSD& user_data); -}; -  class LLNetMap : public LLUICtrl  {  public: @@ -117,8 +111,6 @@ public:  	LLTextBox*		mTextBoxNorthWest;  	LLTextBox*		mTextBoxSouthWest; -	LLRotateNetMapListener mNetMapListener; -  	static BOOL		sRotateMap;  	static LLNetMap*	sInstance;  }; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 1e933706e1..b6e8c1a7f3 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -206,7 +206,7 @@ void LLLoginHandler::parse(const LLSD& queryMap)   	if (LLAppViewer::instance()->getLoginURIs().size() == 0)   	{ - 	    snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName);		/* Flawfinder: ignore */ +		gGridName = gGridInfo[gGridChoice].mName;		/* Flawfinder: ignore */   	    LLAppViewer::instance()->resetURIs();   	}	     @@ -429,7 +429,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	LLTextBox* channel_text = LLUICtrlFactory::getTextBoxByName(this, "channel_text");  	if (channel_text)  	{ -		channel_text->setText(gChannelName); +		channel_text->setText(gSavedSettings.getString("VersionChannelName"));  		channel_text->setClickedCallback(onClickVersion);  		channel_text->setCallbackUserData(this);  	} @@ -471,7 +471,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  		// kick off a request to grab the url manually  		gResponsePtr = LLIamHereLogin::build( this ); - 		std::string login_page = LLAppViewer::instance()->getLoginPage(); + 		std::string login_page = gSavedSettings.getString("LoginPage");   		if (login_page.empty())   		{   			login_page = getString( "real_url" ); @@ -927,7 +927,7 @@ void LLPanelLogin::loadLoginPage()  	std::ostringstream oStr; -	std::string login_page = LLAppViewer::instance()->getLoginPage(); +	std::string login_page = gSavedSettings.getString("LoginPage");  	if (login_page.empty())  	{  		login_page = sInstance->getString( "real_url" ); @@ -984,24 +984,24 @@ void LLPanelLogin::loadLoginPage()  	}  	LLString firstname, lastname; -	 -	if (gCmdLineFirstName.empty()) + +    if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3) +    { +        LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo"); +		firstname = cmd_line_login[0].asString(); +		lastname = cmd_line_login[1].asString(); +        password = cmd_line_login[2].asString(); +    } +    	 +	if (firstname.empty())  	{  		firstname = gSavedSettings.getString("FirstName");  	} -	else -	{ -		firstname = gCmdLineFirstName; -	} -	if (gCmdLineLastName.empty()) +	if (lastname.empty())  	{  		lastname = gSavedSettings.getString("LastName");  	} -	else -	{ -		lastname = gCmdLineLastName; -	}  	LLString version = llformat("%d.%d.%d (%d)",  						LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD); @@ -1020,9 +1020,9 @@ void LLPanelLogin::loadLoginPage()  	curl_free(curl_version); -	if (!gCmdLinePassword.empty()) +	if (!password.empty())  	{ -		oStr << "&password=" << gCmdLinePassword; +		oStr << "&password=" << password;  	}  	else if (!(password = load_password_from_disk()).empty())  	{ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index d2bc8f4100..f2475d84d9 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -447,7 +447,7 @@ BOOL idle_startup()  		{  			fclose(found_template); -			U32 port = gAgent.mViewerPort; +			U32 port = gSavedSettings.getU32("UserConnectionPort");  			if ((NET_USE_OS_ASSIGNED_PORT == port) &&   // if nothing specified on command line (-port)  			    (gSavedSettings.getBOOL("ConnectionPortEnabled"))) @@ -497,7 +497,7 @@ BOOL idle_startup()  								  invalid_message_callback,  								  NULL); -			if (gSavedSettings.getBOOL("LogMessages") || gLogMessages) +			if (gSavedSettings.getBOOL("LogMessages"))  			{  				llinfos << "Message logging activated!" << llendl;  				msg->startLogging(); @@ -516,18 +516,23 @@ BOOL idle_startup()  			}  			gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS); -			msg->mPacketRing.setDropPercentage(gPacketDropPercentage); -			if (gInBandwidth != 0.f) + +			F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage"); +			msg->mPacketRing.setDropPercentage(dropPercent); + +            F32 inBandwidth = gSavedSettings.getF32("InBandwidth");  +            F32 outBandwidth = gSavedSettings.getF32("OutBandwidth");  +			if (inBandwidth != 0.f)  			{ -				llinfos << "Setting packetring incoming bandwidth to " << gInBandwidth << llendl; +				llinfos << "Setting packetring incoming bandwidth to " << inBandwidth << llendl;  				msg->mPacketRing.setUseInThrottle(TRUE); -				msg->mPacketRing.setInBandwidth(gInBandwidth); +				msg->mPacketRing.setInBandwidth(inBandwidth);  			} -			if (gOutBandwidth != 0.f) +			if (outBandwidth != 0.f)  			{ -				llinfos << "Setting packetring outgoing bandwidth to " << gOutBandwidth << llendl; +				llinfos << "Setting packetring outgoing bandwidth to " << outBandwidth << llendl;  				msg->mPacketRing.setUseOutThrottle(TRUE); -				msg->mPacketRing.setOutBandwidth(gOutBandwidth); +				msg->mPacketRing.setOutBandwidth(outBandwidth);  			}  		} @@ -541,7 +546,7 @@ BOOL idle_startup()  		// or audio cues in connection UI.  		//------------------------------------------------- -		if (gUseAudio) +		if (FALSE == gSavedSettings.getBOOL("NoAudio"))  		{  #if LL_FMOD  			gAudiop = (LLAudioEngine *) new LLAudioEngine_FMOD(); @@ -586,14 +591,13 @@ BOOL idle_startup()  			show_connect_box = FALSE;  		} -		else if( !gCmdLineFirstName.empty()  -			&& !gCmdLineLastName.empty()  -			&& !gCmdLinePassword.empty()) -		{ -			firstname = gCmdLineFirstName; -			lastname = gCmdLineLastName; +        else if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3) +        { +            LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo"); +			firstname = cmd_line_login[0].asString(); +			lastname = cmd_line_login[1].asString(); -			LLMD5 pass((unsigned char*)gCmdLinePassword.c_str()); +			LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str());  			char md5pass[33];               /* Flawfinder: ignore */  			pass.hex_digest(md5pass);  			password = md5pass; @@ -604,9 +608,9 @@ BOOL idle_startup()  #else  			show_connect_box = FALSE;  #endif -			gAutoLogin = TRUE; -		} -		else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin")) +			gSavedSettings.setBOOL("AutoLogin", TRUE); +        } +		else if (gSavedSettings.getBOOL("AutoLogin"))  		{  			firstname = gSavedSettings.getString("FirstName");  			lastname = gSavedSettings.getString("LastName"); @@ -781,19 +785,14 @@ BOOL idle_startup()  		// create necessary directories  		// *FIX: these mkdir's should error check  		gDirUtilp->setLindenUserDir(firstname.c_str(), lastname.c_str()); +    	LLFile::mkdir(gDirUtilp->getLindenUserDir().c_str()); +        // Set UserSettingsFile to the default value. +		gSavedSettings.setString("UserSettingsFile", +			gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, DEFAULT_SETTINGS_FILE)); -		LLFile::mkdir(gDirUtilp->getLindenUserDir().c_str()); - -		// the mute list is loaded in the llmutelist class. - -		gSavedSettings.loadFromFile(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml")); - -		// handle the per account settings setup -		gPerAccountSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, DEFAULT_SETTINGS_FILE); - -		// per account settings.  Set defaults here if not found.  If we get a bunch of these, eventually move to a function. -		gSavedPerAccountSettings.loadFromFile(gPerAccountSettingsFileName); +		// Overwrite default user settings with user settings								  +		LLAppViewer::instance()->loadSettingsFromDirectory(LL_PATH_PER_SL_ACCOUNT);  		// Need to set the LastLogoff time here if we don't have one.  LastLogoff is used for "Recent Items" calculation  		// and startup time is close enough if we don't have a real value. @@ -828,7 +827,7 @@ BOOL idle_startup()  			gSavedSettings.setS32("ServerChoice", gGridChoice);  			if (gGridChoice == GRID_INFO_OTHER)  			{ -				snprintf(gGridName, MAX_STRING, "%s", server_label.c_str());/* Flawfinder: ignore */ +				gGridName = server_label;/* Flawfinder: ignore */  			}  			if ( user_picked_server ) @@ -932,7 +931,7 @@ BOOL idle_startup()  		//requested_options.push_back("inventory-meat");  		//requested_options.push_back("inventory-skel-targets");  #if (!defined LL_MINIMIAL_REQUESTED_OPTIONS) -		if(gRequestInventoryLibrary) +		if(FALSE == gSavedSettings.getBOOL("NoInventoryLibrary"))  		{  			requested_options.push_back("inventory-lib-root");  			requested_options.push_back("inventory-lib-owner"); @@ -952,7 +951,7 @@ BOOL idle_startup()  		requested_options.push_back("tutorial_setting");  		requested_options.push_back("login-flags");  		requested_options.push_back("global-textures"); -		if(gGodConnect) +		if(gSavedSettings.getBOOL("ConnectAsGod"))  		{  			gSavedSettings.setBOOL("UseDebugMenus", TRUE);  			requested_options.push_back("god-connect"); @@ -1240,7 +1239,6 @@ BOOL idle_startup()  				  << (sAuthUriNum + 1) << ".  ";  				auth_desc = s.str();  				LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE ); -				sAuthUriNum++;  				return do_normal_idle;  			}  			break; @@ -1490,7 +1488,7 @@ BOOL idle_startup()  				args["[ERROR_MESSAGE]"] = emsg.str();  				gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);  				reset_login(); -				gAutoLogin = FALSE; +				gSavedSettings.setBOOL("AutoLogin", FALSE);  				show_connect_box = TRUE;  			} @@ -1510,7 +1508,7 @@ BOOL idle_startup()  			args["[ERROR_MESSAGE]"] = emsg.str();  			gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);  			reset_login(); -			gAutoLogin = FALSE; +			gSavedSettings.setBOOL("AutoLogin", FALSE);  			show_connect_box = TRUE;  			// Don't save an incorrect password to disk.  			save_password_to_disk(NULL); @@ -1534,7 +1532,7 @@ BOOL idle_startup()  		// Since we connected, save off the settings so the user doesn't have to  		// type the name/password again if we crash. -		gSavedSettings.saveToFile(gSettingsFileName, TRUE); +		gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);  		//  		// Initialize classes w/graphics stuff. @@ -2101,7 +2099,7 @@ BOOL idle_startup()  			gSavedSettings.setString( "NextLoginLocation", "" );  			// and make sure it's saved -			gSavedSettings.saveToFile( gSettingsFileName, TRUE ); +			gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );  		};  		if (!gNoRender) @@ -2393,7 +2391,7 @@ void login_show()  	if( GRID_INFO_OTHER == gGridChoice )  	{ -		   LLPanelLogin::addServer( gGridName, GRID_INFO_OTHER ); +		   LLPanelLogin::addServer( gGridName.c_str(), GRID_INFO_OTHER );  	}  	else  	{ @@ -2441,7 +2439,7 @@ void login_callback(S32 option, void *userdata)  		{  			// turn off the setting and write out to disk  			gSavedSettings.setBOOL("RememberPassword", FALSE); -			gSavedSettings.saveToFile(gSettingsFileName, TRUE); +			gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile") , TRUE );  			// stomp the saved password on disk  			save_password_to_disk(NULL); @@ -2635,7 +2633,7 @@ void login_alert_status(S32 option, void* user_data)  void update_app(BOOL mandatory, const std::string& auth_msg)  {  	// store off config state, as we might quit soon -	gSavedSettings.saveToFile(gSettingsFileName, TRUE); +	gSavedSettings.saveToFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);	  	std::ostringstream message; @@ -2735,7 +2733,7 @@ void update_dialog_callback(S32 option, void *userdata)  	// *TODO change userserver to be grid on both viewer and sim, since  	// userserver no longer exists.  	query_map["userserver"] = gGridName; -	query_map["channel"] = gChannelName; +	query_map["channel"] = gSavedSettings.getString("VersionChannelName");  	// *TODO constantize this guy  	LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp index ffa921125a..9c8bb97343 100644 --- a/indra/newview/lltoolgun.cpp +++ b/indra/newview/lltoolgun.cpp @@ -80,14 +80,10 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)  {  	if( gAgent.cameraMouselook() )  	{ -		#if 1 //LL_WINDOWS || LL_DARWIN -			const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f; -		#else -			const F32 NOMINAL_MOUSE_SENSITIVITY = 0.025f; -		#endif +		const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f; -		 -		F32 mouse_sensitivity = clamp_rescale(gMouseSensitivity, 0.f, 15.f, 0.5f, 2.75f) * NOMINAL_MOUSE_SENSITIVITY; +		F32 mouse_sensitivity = gSavedSettings.getF32("MouseSensitivity"); +		mouse_sensitivity = clamp_rescale(mouse_sensitivity, 0.f, 15.f, 0.5f, 2.75f) * NOMINAL_MOUSE_SENSITIVITY;  		// ...move the view with the mouse @@ -98,7 +94,7 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)  		if (dx != 0 || dy != 0)  		{  			// ...actually moved off center -			if (gInvertMouse) +			if (gSavedSettings.getBOOL("InvertMouse"))  			{  				gAgent.pitch(mouse_sensitivity * -dy);  			} diff --git a/indra/newview/llvectorperfoptions.cpp b/indra/newview/llvectorperfoptions.cpp index ca8ae2e886..34c10a4f72 100644 --- a/indra/newview/llvectorperfoptions.cpp +++ b/indra/newview/llvectorperfoptions.cpp @@ -31,101 +31,4 @@  #include "llviewerprecompiledheaders.h" -#include "llvectorperfoptions.h" -#include "llviewerjointmesh.h" -#include "llviewercontrol.h" - -// Initially, we test the performance of the vectorization code, then -// turn it off if it ends up being slower. JC -BOOL	gVectorizePerfTest	= TRUE; -BOOL	gVectorizeEnable	= FALSE; -U32		gVectorizeProcessor	= 0; -BOOL	gVectorizeSkin		= FALSE; - -void update_vector_performances(void) -{ -	char *vp; -	 -	switch(gVectorizeProcessor) -	{ -		case 2: vp = "SSE2"; break;					// *TODO: replace the magic #s -		case 1: vp = "SSE"; break; -		default: vp = "COMPILER DEFAULT"; break; -	} -	llinfos << "Vectorization         : " << ( gVectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ; -	llinfos << "Vector Processor      : " << vp << llendl ; -	llinfos << "Vectorized Skinning   : " << ( gVectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ; -	 -	if(gVectorizeEnable && gVectorizeSkin) -	{ -		switch(gVectorizeProcessor) -		{ -			case 2: -				LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE2; -				break; -			case 1: -				LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE; -				break; -			default: -				LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryVectorized; -				break; -		} -	} -	else -	{ -		LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryOriginal; -	} -} - - -class LLVectorizationEnableListener: public LLSimpleListener -{ -	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) -	{ -		gVectorizeEnable = event->getValue().asBoolean(); -		update_vector_performances(); -		return true; -	} -}; -static LLVectorizationEnableListener vectorization_enable_listener; - -class LLVectorizeSkinListener: public LLSimpleListener -{ -	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) -	{ -		gVectorizeSkin = event->getValue().asBoolean(); -		update_vector_performances(); -		return true; -	} -}; -static LLVectorizeSkinListener vectorize_skin_listener; - -class LLVectorProcessorListener: public LLSimpleListener -{ -	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) -	{ -		gVectorizeProcessor = event->getValue().asInteger(); -		update_vector_performances(); -		return true; -	} -}; -static LLVectorProcessorListener vector_processor_listener; - -void LLVectorPerformanceOptions::initClass() -{ -	gVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest"); -	gVectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable"); -	gVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor"); -	gVectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin"); -	update_vector_performances(); - -	// these are currently static in this file, so they can't move to settings_setup_listeners -	gSavedSettings.getControl("VectorizeEnable")->addListener(&vectorization_enable_listener); -	gSavedSettings.getControl("VectorizeProcessor")->addListener(&vector_processor_listener); -	gSavedSettings.getControl("VectorizeSkin")->addListener(&vectorize_skin_listener); -} - -void LLVectorPerformanceOptions::cleanupClass() -{ -} - +// Deprecated - moved into llviewerjointmesh diff --git a/indra/newview/llvectorperfoptions.h b/indra/newview/llvectorperfoptions.h index dac4d1f86c..e2a0a37e33 100644 --- a/indra/newview/llvectorperfoptions.h +++ b/indra/newview/llvectorperfoptions.h @@ -32,10 +32,6 @@  #ifndef LL_VECTORPERFOPTIONS_H  #define LL_VECTORPERFOPTIONS_H -namespace LLVectorPerformanceOptions -{ -	void initClass(); // Run after configuration files are read. -	void cleanupClass(); -}; +// Deprecated - moved into llviewerjointmesh  #endif diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index affce91b79..fd85ac1bc1 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -65,7 +65,7 @@ void init_audio()  	BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio"); -	if (!mute_audio && gPreloadSounds) +	if (!mute_audio && FALSE == gSavedSettings.getBOOL("NoPreload"))  	{  		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert")));  		gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke"))); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 9c81f89e99..7733ef5ae1 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -36,26 +36,47 @@  #include "indra_constants.h" -#include "v3math.h" -#include "v3dmath.h" -#include "llrect.h" -#include "v4color.h" -#include "v4coloru.h" -#include "v3color.h" - -#include "llfloater.h" -#include "llvieweruictrlfactory.h" -#include "llfirstuse.h" -#include "llcombobox.h" -#include "llspinctrl.h" -#include "llcolorswatch.h" +// For Listeners +#include "audioengine.h" +#include "llagent.h" +#include "llconsole.h" +#include "lldrawpoolterrain.h" +#include "llflexibleobject.h" +#include "llfeaturemanager.h" +#include "llglslshader.h" +#include "llnetmap.h" +#include "llpanelgeneral.h" +#include "llpanelinput.h" +#include "llsky.h" +#include "llvieweraudio.h" +#include "llviewerimagelist.h" +#include "llviewerthrottle.h" +#include "llviewerwindow.h" +#include "llvoavatar.h" +#include "llvoiceclient.h" +#include "llvosky.h" +#include "llvotree.h" +#include "llvovolume.h" +#include "llworld.h" +#include "pipeline.h" +#include "llviewerjoystick.h" +#include "llviewerparcelmgr.h" +#include "llparcel.h" +#include "llnotify.h" +#include "llkeyboard.h" +#include "llerrorcontrol.h" +#include "llversionviewer.h" +#include "llappviewer.h" +#include "llvosurfacepatch.h" +#include "llvowlsky.h" +#include "llglimmediate.h"  #ifdef TOGGLE_HACKED_GODLIKE_VIEWER  BOOL 				gHackGodmode = FALSE;  #endif -LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; +std::map<LLString, LLControlGroup*> gSettings;  LLControlGroup gSavedSettings;	// saved at end of session  LLControlGroup gSavedPerAccountSettings; // saved at end of session  LLControlGroup gViewerArt;		// read-only @@ -65,461 +86,440 @@ LLControlGroup gCrashSettings;	// saved at end of session  LLString gLastRunVersion;  LLString gCurrentVersion; -LLString gSettingsFileName; -LLString gPerAccountSettingsFileName; +extern BOOL gResizeScreenTexture; -LLFloaterSettingsDebug::LLFloaterSettingsDebug() : LLFloater("Configuration Editor") +//////////////////////////////////////////////////////////////////////////// +// Listeners + +static bool handleRenderAvatarMouselookChanged(const LLSD& newvalue) +{ +	LLVOAvatar::sVisibleInFirstPerson = newvalue.asBoolean(); +	return true; +} + +static bool handleRenderFarClipChanged(const LLSD& newvalue)  { +	F32 draw_distance = (F32) newvalue.asReal(); +	gAgent.mDrawDistance = draw_distance; +	if (gWorldPointer) +	{ +		gWorldPointer->setLandFarClip(draw_distance); +	} +	return true;  } -LLFloaterSettingsDebug::~LLFloaterSettingsDebug() +static bool handleTerrainDetailChanged(const LLSD& newvalue)  { -	sInstance = NULL; +	LLDrawPoolTerrain::sDetailMode = newvalue.asInteger(); +	return true;  } -BOOL LLFloaterSettingsDebug::postBuild() + +static bool handleSetShaderChanged(const LLSD& newvalue)  { -	LLComboBox* settings_combo = LLUICtrlFactory::getComboBoxByName(this, "settings_combo"); +	LLShaderMgr::setShaders(); +	return true; +} -	LLControlGroup::ctrl_name_table_t::iterator name_it; -	for(name_it = gSavedSettings.mNameTable.begin(); name_it != gSavedSettings.mNameTable.end(); ++name_it) +static bool handleReleaseGLBufferChanged(const LLSD& newvalue) +{ +	if (gPipeline.isInit())  	{ -		settings_combo->add(name_it->first, (void*)name_it->second); +		gPipeline.releaseGLBuffers(); +		gPipeline.createGLBuffers();  	} -	for(name_it = gSavedPerAccountSettings.mNameTable.begin(); name_it != gSavedPerAccountSettings.mNameTable.end(); ++name_it) +	return true; +} + +static bool handleVolumeLODChanged(const LLSD& newvalue) +{ +	LLVOVolume::sLODFactor = (F32) newvalue.asReal(); +	LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f; +	return true; +} + +static bool handleAvatarLODChanged(const LLSD& newvalue) +{ +	LLVOAvatar::sLODFactor = (F32) newvalue.asReal(); +	return true; +} + +static bool handleTerrainLODChanged(const LLSD& newvalue) +{ +		LLVOSurfacePatch::sLODFactor = (F32)newvalue.asReal(); +		//sqaure lod factor to get exponential range of [0,4] and keep +		//a value of 1 in the middle of the detail slider for consistency +		//with other detail sliders (see panel_preferences_graphics1.xml) +		LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; +		return true; +} + +static bool handleTreeLODChanged(const LLSD& newvalue) +{ +	LLVOTree::sTreeFactor = (F32) newvalue.asReal(); +	return true; +} + +static bool handleFlexLODChanged(const LLSD& newvalue) +{ +	LLVolumeImplFlexible::sUpdateFactor = (F32) newvalue.asReal(); +	return true; +} + +static bool handleGammaChanged(const LLSD& newvalue) +{ +	F32 gamma = (F32) newvalue.asReal(); +	if (gamma == 0.0f)  	{ -		settings_combo->add(name_it->first, (void*)name_it->second); +		gamma = 1.0f; // restore normal gamma  	} -	for(name_it = gColors.mNameTable.begin(); name_it != gColors.mNameTable.end(); ++name_it) +	if (gViewerWindow && gViewerWindow->getWindow() && gamma != gViewerWindow->getWindow()->getGamma())  	{ -		settings_combo->add(name_it->first, (void*)name_it->second); +		// Only save it if it's changed +		if (!gViewerWindow->getWindow()->setGamma(gamma)) +		{ +			llwarns << "setGamma failed!" << llendl; +		}  	} -	settings_combo->sortByName(); -	settings_combo->setCommitCallback(onSettingSelect); -	settings_combo->setCallbackUserData(this); -	settings_combo->updateSelection(); - -	childSetCommitCallback("val_spinner_1", onCommitSettings); -	childSetUserData("val_spinner_1", this); -	childSetCommitCallback("val_spinner_2", onCommitSettings); -	childSetUserData("val_spinner_2", this); -	childSetCommitCallback("val_spinner_3", onCommitSettings); -	childSetUserData("val_spinner_3", this); -	childSetCommitCallback("val_spinner_4", onCommitSettings); -	childSetUserData("val_spinner_4", this); -	childSetCommitCallback("val_text", onCommitSettings); -	childSetUserData("val_text", this); -	childSetCommitCallback("boolean_combo", onCommitSettings); -	childSetUserData("boolean_combo", this); -	childSetCommitCallback("color_swatch", onCommitSettings); -	childSetUserData("color_swatch", this); -	childSetAction("default_btn", onClickDefault, this); -	mComment = getChild<LLTextEditor>("comment_text"); -	return TRUE; -} - -void LLFloaterSettingsDebug::draw() -{ -	LLComboBox* settings_combo = getChild<LLComboBox>("settings_combo"); -	LLControlBase* controlp = (LLControlBase*)settings_combo->getCurrentUserdata(); -	updateControl(controlp); - -	LLFloater::draw(); -} - -//static -void LLFloaterSettingsDebug::show(void*) -{ -	if (sInstance == NULL) -	{ -		sInstance = new LLFloaterSettingsDebug(); -		gUICtrlFactory->buildFloater(sInstance, "floater_settings_debug.xml"); -	} +	return true; +} -	sInstance->open();		/* Flawfinder: ignore */ -} - -//static  -void LLFloaterSettingsDebug::onSettingSelect(LLUICtrl* ctrl, void* user_data) -{ -	LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; -	LLComboBox* combo_box = (LLComboBox*)ctrl; -	LLControlBase* controlp = (LLControlBase*)combo_box->getCurrentUserdata(); - -	floaterp->updateControl(controlp); -} - -//static -void LLFloaterSettingsDebug::onCommitSettings(LLUICtrl* ctrl, void* user_data) -{ -	LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; - -	LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo"); -	LLControlBase* controlp = (LLControlBase*)settings_combo->getCurrentUserdata(); - -	LLVector3 vector; -	LLVector3d vectord; -	LLRect rect; -	LLColor4 col4; -	LLColor3 col3; -	LLColor4U col4U; -	LLColor4 color_with_alpha; - -	switch(controlp->type()) -	{		 -	  case TYPE_U32: -		controlp->set(floaterp->childGetValue("val_spinner_1")); -		break; -	  case TYPE_S32: -		controlp->set(floaterp->childGetValue("val_spinner_1")); -		break; -	  case TYPE_F32: -		controlp->set(LLSD(floaterp->childGetValue("val_spinner_1").asReal())); -		break; -	  case TYPE_BOOLEAN: -		controlp->set(floaterp->childGetValue("boolean_combo")); -		break; -	  case TYPE_STRING: -		controlp->set(LLSD(floaterp->childGetValue("val_text").asString())); -		break; -	  case TYPE_VEC3: -		vector.mV[VX] = (F32)floaterp->childGetValue("val_spinner_1").asReal(); -		vector.mV[VY] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); -		vector.mV[VZ] = (F32)floaterp->childGetValue("val_spinner_3").asReal(); -		controlp->set(vector.getValue()); -		break; -	  case TYPE_VEC3D: -		vectord.mdV[VX] = floaterp->childGetValue("val_spinner_1").asReal(); -		vectord.mdV[VY] = floaterp->childGetValue("val_spinner_2").asReal(); -		vectord.mdV[VZ] = floaterp->childGetValue("val_spinner_3").asReal(); -		controlp->set(vectord.getValue()); -		break; -	  case TYPE_RECT: -		rect.mLeft = floaterp->childGetValue("val_spinner_1").asInteger(); -		rect.mRight = floaterp->childGetValue("val_spinner_2").asInteger(); -		rect.mBottom = floaterp->childGetValue("val_spinner_3").asInteger(); -		rect.mTop = floaterp->childGetValue("val_spinner_4").asInteger(); -		controlp->set(rect.getValue()); -		break; -	  case TYPE_COL4: -		col3.setValue(floaterp->childGetValue("color_swatch")); -		col4 = LLColor4(col3, (F32)floaterp->childGetValue("val_spinner_4").asReal()); -		controlp->set(col4.getValue()); -		break; -	  case TYPE_COL3: -		controlp->set(floaterp->childGetValue("color_swatch")); -		//col3.mV[VRED] = (F32)floaterp->childGetValue("val_spinner_1").asC(); -		//col3.mV[VGREEN] = (F32)floaterp->childGetValue("val_spinner_2").asReal(); -		//col3.mV[VBLUE] = (F32)floaterp->childGetValue("val_spinner_3").asReal(); -		//controlp->set(col3.getValue()); -		break; -	  case TYPE_COL4U: -		col3.setValue(floaterp->childGetValue("color_swatch")); -		col4U.setVecScaleClamp(col3); -		col4U.mV[VALPHA] = floaterp->childGetValue("val_spinner_4").asInteger(); -		controlp->set(col4U.getValue()); -		break; -	  default: -		break; -	} +const F32 MAX_USER_FOG_RATIO = 10.f; +const F32 MIN_USER_FOG_RATIO = 0.5f; + +static bool handleFogRatioChanged(const LLSD& newvalue) +{ +	F32 fog_ratio = llmax(MIN_USER_FOG_RATIO, llmin((F32) newvalue.asReal(), MAX_USER_FOG_RATIO)); +	gSky.setFogRatio(fog_ratio); +	return true; +} + +static bool handleMaxPartCountChanged(const LLSD& newvalue) +{ +	LLViewerPartSim::setMaxPartCount(newvalue.asInteger()); +	return true;  } -// static -void LLFloaterSettingsDebug::onClickDefault(void* user_data) +const S32 MAX_USER_COMPOSITE_LIMIT = 100; +const S32 MIN_USER_COMPOSITE_LIMIT = 0; + +static bool handleCompositeLimitChanged(const LLSD& newvalue)  { -	LLFloaterSettingsDebug* floaterp = (LLFloaterSettingsDebug*)user_data; -	LLComboBox* settings_combo = floaterp->getChild<LLComboBox>("settings_combo"); -	LLControlBase* controlp = (LLControlBase*)settings_combo->getCurrentUserdata(); +	S32 composite_limit = llmax(MIN_USER_COMPOSITE_LIMIT,  llmin((S32)newvalue.asInteger(), MAX_USER_COMPOSITE_LIMIT)); +	LLVOAvatar::sMaxOtherAvatarsToComposite = composite_limit; +	return true; +} -	if (controlp) +static bool handleVideoMemoryChanged(const LLSD& newvalue) +{ +	gImageList.updateMaxResidentTexMem(newvalue.asInteger()); +	return true; +} + +static bool handleBandwidthChanged(const LLSD& newvalue) +{ +	gViewerThrottle.setMaxBandwidth((F32) newvalue.asReal()); +	return true; +} + +static bool handleChatFontSizeChanged(const LLSD& newvalue) +{ +	if(gConsole)  	{ -		controlp->resetToDefault(); -		floaterp->updateControl(controlp); +		gConsole->setFontSize(newvalue.asInteger());  	} +	return true;  } -// we've switched controls, or doing per-frame update, so update spinners, etc. -void LLFloaterSettingsDebug::updateControl(LLControlBase* controlp) +static bool handleChatPersistTimeChanged(const LLSD& newvalue)  { -	LLSpinCtrl* spinner1 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_1"); -	LLSpinCtrl* spinner2 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_2"); -	LLSpinCtrl* spinner3 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_3"); -	LLSpinCtrl* spinner4 = LLUICtrlFactory::getSpinnerByName(this, "val_spinner_4"); -	LLColorSwatchCtrl* color_swatch = getChild<LLColorSwatchCtrl>("color_swatch"); +	if(gConsole) +	{ +		gConsole->setLinePersistTime((F32) newvalue.asReal()); +	} +	return true; +} -	if (!spinner1 || !spinner2 || !spinner3 || !spinner4 || !color_swatch) +static bool handleConsoleMaxLinesChanged(const LLSD& newvalue) +{ +	if(gConsole)  	{ -		llwarns << "Could not find all desired controls by name" -			<< llendl; -		return; +		gConsole->setMaxLines(newvalue.asInteger());  	} +	return true; +} -	spinner1->setVisible(FALSE); -	spinner2->setVisible(FALSE); -	spinner3->setVisible(FALSE); -	spinner4->setVisible(FALSE); -	color_swatch->setVisible(FALSE); -	childSetVisible("val_text", FALSE); -	mComment->setText(LLString::null); +static void handleAudioVolumeChanged(const LLSD& newvalue) +{ +	audio_update_volume(true); +} -	if (controlp) -	{ -		eControlType type = controlp->type(); -		mComment->setText(controlp->getComment()); -		spinner1->setMaxValue(F32_MAX); -		spinner2->setMaxValue(F32_MAX); -		spinner3->setMaxValue(F32_MAX); -		spinner4->setMaxValue(F32_MAX); -		spinner1->setMinValue(-F32_MAX); -		spinner2->setMinValue(-F32_MAX); -		spinner3->setMinValue(-F32_MAX); -		spinner4->setMinValue(-F32_MAX); -		if (!spinner1->hasFocus()) -		{ -			spinner1->setIncrement(0.1f); -		} -		if (!spinner2->hasFocus()) -		{ -			spinner2->setIncrement(0.1f); -		} -		if (!spinner3->hasFocus()) -		{ -			spinner3->setIncrement(0.1f); -		} -		if (!spinner4->hasFocus()) -		{ -			spinner4->setIncrement(0.1f); -		} +static bool handleJoystickChanged(const LLSD& newvalue) +{ +	LLViewerJoystick::updateCamera(TRUE); +	return true; +} -		LLSD sd = controlp->get(); -		switch(type) +static bool handleAudioStreamMusicChanged(const LLSD& newvalue) +{ +	if (gAudiop) +	{ +		if ( newvalue.asBoolean() )  		{ -		  case TYPE_U32: -			spinner1->setVisible(TRUE); -			spinner1->setLabel(LLString("value")); // Debug, don't translate -			childSetVisible("boolean_combo", FALSE); -			if (!spinner1->hasFocus()) +			if (gParcelMgr +				&& gParcelMgr->getAgentParcel() +				&& !gParcelMgr->getAgentParcel()->getMusicURL().empty())  			{ -				spinner1->setValue(sd); -				spinner1->setMinValue((F32)U32_MIN); -				spinner1->setMaxValue((F32)U32_MAX); -				spinner1->setIncrement(1.f); -				spinner1->setPrecision(0); -			} -			break; -		  case TYPE_S32: -			spinner1->setVisible(TRUE); -			spinner1->setLabel(LLString("value")); // Debug, don't translate -			childSetVisible("boolean_combo", FALSE); -			if (!spinner1->hasFocus()) -			{ -				spinner1->setValue(sd); -				spinner1->setMinValue((F32)S32_MIN); -				spinner1->setMaxValue((F32)S32_MAX); -				spinner1->setIncrement(1.f); -				spinner1->setPrecision(0); -			} -			break; -		  case TYPE_F32: -			spinner1->setVisible(TRUE); -			spinner1->setLabel(LLString("value")); // Debug, don't translate -			childSetVisible("boolean_combo", FALSE); -			if (!spinner1->hasFocus()) -			{ -				spinner1->setPrecision(3); -				spinner1->setValue(sd); -			} -			break; -		  case TYPE_BOOLEAN: -			childSetVisible("boolean_combo", TRUE); -			 -			if (!childHasFocus("boolean_combo")) -			{ -				if (sd.asBoolean()) +				// if stream is already playing, don't call this +				// otherwise music will briefly stop +				if ( ! gAudiop->isInternetStreamPlaying() )  				{ -					childSetValue("boolean_combo", LLSD("true")); +					gAudiop->startInternetStream(gParcelMgr->getAgentParcel()->getMusicURL().c_str());  				} -				else -				{ -					childSetValue("boolean_combo", LLSD("")); -				} -			} -			break; -		  case TYPE_STRING: -			childSetVisible("val_text", TRUE); -			childSetVisible("boolean_combo", FALSE); -			if (!childHasFocus("val_text")) -			{ -				childSetValue("val_text", sd); -			} -			break; -		  case TYPE_VEC3: -		  { -			childSetVisible("boolean_combo", FALSE); -			LLVector3 v; -			v.setValue(sd); -			spinner1->setVisible(TRUE); -			spinner1->setLabel(LLString("X")); -			spinner2->setVisible(TRUE); -			spinner2->setLabel(LLString("Y")); -			spinner3->setVisible(TRUE); -			spinner3->setLabel(LLString("Z")); -			if (!spinner1->hasFocus()) -			{ -				spinner1->setPrecision(3); -				spinner1->setValue(v[VX]); -			} -			if (!spinner2->hasFocus()) -			{ -				spinner2->setPrecision(3); -				spinner2->setValue(v[VY]); -			} -			if (!spinner3->hasFocus()) -			{ -				spinner3->setPrecision(3); -				spinner3->setValue(v[VZ]); -			} -			break; -		  } -		  case TYPE_VEC3D: -		  { -			childSetVisible("boolean_combo", FALSE); -			LLVector3d v; -			v.setValue(sd); -			spinner1->setVisible(TRUE); -			spinner1->setLabel(LLString("X")); -			spinner2->setVisible(TRUE); -			spinner2->setLabel(LLString("Y")); -			spinner3->setVisible(TRUE); -			spinner3->setLabel(LLString("Z")); -			if (!spinner1->hasFocus()) -			{ -				spinner1->setPrecision(3); -				spinner1->setValue(v[VX]); -			} -			if (!spinner2->hasFocus()) -			{ -				spinner2->setPrecision(3); -				spinner2->setValue(v[VY]); -			} -			if (!spinner3->hasFocus()) -			{ -				spinner3->setPrecision(3); -				spinner3->setValue(v[VZ]); -			} -			break; -		  } -		  case TYPE_RECT: -		  { -			childSetVisible("boolean_combo", FALSE); -			LLRect r; -			r.setValue(sd); -			spinner1->setVisible(TRUE); -			spinner1->setLabel(LLString("Left")); -			spinner2->setVisible(TRUE); -			spinner2->setLabel(LLString("Right")); -			spinner3->setVisible(TRUE); -			spinner3->setLabel(LLString("Bottom")); -			spinner4->setVisible(TRUE); -			spinner4->setLabel(LLString("Top")); -			if (!spinner1->hasFocus()) -			{ -				spinner1->setPrecision(0); -				spinner1->setValue(r.mLeft); -			} -			if (!spinner2->hasFocus()) -			{ -				spinner2->setPrecision(0); -				spinner2->setValue(r.mRight); -			} -			if (!spinner3->hasFocus()) -			{ -				spinner3->setPrecision(0); -				spinner3->setValue(r.mBottom); -			} -			if (!spinner4->hasFocus()) -			{ -				spinner4->setPrecision(0); -				spinner4->setValue(r.mTop);  			} +		} +		else +		{ +			gAudiop->stopInternetStream(); +		} +	} +	return true; +} -			spinner1->setMinValue((F32)S32_MIN); -			spinner1->setMaxValue((F32)S32_MAX); -			spinner1->setIncrement(1.f); - -			spinner2->setMinValue((F32)S32_MIN); -			spinner2->setMaxValue((F32)S32_MAX); -			spinner2->setIncrement(1.f); - -			spinner3->setMinValue((F32)S32_MIN); -			spinner3->setMaxValue((F32)S32_MAX); -			spinner3->setIncrement(1.f); - -			spinner4->setMinValue((F32)S32_MIN); -			spinner4->setMaxValue((F32)S32_MAX); -			spinner4->setIncrement(1.f); -			break; -		  } -		  case TYPE_COL4: -		  { -			childSetVisible("boolean_combo", FALSE); -			LLColor4 clr; -			clr.setValue(sd); -			color_swatch->setVisible(TRUE); -			// only set if changed so color picker doesn't update -			if(clr != LLColor4(color_swatch->getValue())) -			{ -				color_swatch->set(LLColor4(sd), TRUE, FALSE); -			} -			spinner4->setVisible(TRUE); -			spinner4->setLabel(LLString("Alpha")); -			if (!spinner4->hasFocus()) -			{ -				spinner4->setPrecision(3); -				spinner4->setMinValue(0.0); -				spinner4->setMaxValue(1.f); -				spinner4->setValue(clr.mV[VALPHA]); -			} -			break; -		  } -		  case TYPE_COL3: -		  { -			childSetVisible("boolean_combo", FALSE); -			LLColor3 clr; -			clr.setValue(sd); -			color_swatch->setVisible(TRUE); -			color_swatch->setValue(sd); -			break; -		  } -		  case TYPE_COL4U: -		  { -			childSetVisible("boolean_combo", FALSE); -			LLColor4U clr; -			clr.setValue(sd); -			color_swatch->setVisible(TRUE); -			if(LLColor4(clr) != LLColor4(color_swatch->getValue())) -			{ -				color_swatch->set(LLColor4(clr), TRUE, FALSE); -			} -			spinner4->setVisible(TRUE); -			spinner4->setLabel(LLString("Alpha")); -			if(!spinner4->hasFocus()) -			{ -				spinner4->setPrecision(0); -				spinner4->setValue(clr.mV[VALPHA]); -			} +static bool handleUseOcclusionChanged(const LLSD& newvalue) +{ +	LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery  +			&& gFeatureManagerp->isFeatureAvailable("UseOcclusion") && !gUseWireframe) ? 2 : 0; +	return true; +} -			spinner4->setMinValue(0); -			spinner4->setMaxValue(255); -			spinner4->setIncrement(1.f); +static bool handleNumpadControlChanged(const LLSD& newvalue) +{ +	if (gKeyboard) +	{ +		gKeyboard->setNumpadDistinct(static_cast<LLKeyboard::e_numpad_distinct>(newvalue.asInteger())); +	} +	return true; +} -			break; -		  } -		  default: -			mComment->setText(LLString("unknown")); -			break; -		} +static bool handleRenderUseVBOChanged(const LLSD& newvalue) +{ +	if (gPipeline.isInit()) +	{ +		gPipeline.setUseVBO(newvalue.asBoolean()); +	} +	return true; +} + +static bool handleWLSkyDetailChanged(const LLSD&) +{ +	if (gSky.mVOWLSkyp.notNull()) +	{ +		gSky.mVOWLSkyp->updateGeometry(gSky.mVOWLSkyp->mDrawable);  	} +	return true; +} +static bool handleRenderLightingDetailChanged(const LLSD& newvalue) +{ +	if (gPipeline.isInit()) +	{ +		gPipeline.setLightingDetail(newvalue.asInteger()); +	} +	return true;  } + +static bool handleResetVertexBuffersChanged(const LLSD&) +{ +	if (gPipeline.isInit()) +	{ +		gPipeline.resetVertexBuffers(); +	} +	return true; +} + +static bool handleRenderDynamicLODChanged(const LLSD& newvalue) +{ +	LLPipeline::sDynamicLOD = newvalue.asBoolean(); +	return true; +} + +static bool handleRenderUseFBOChanged(const LLSD& newvalue) +{ +	LLRenderTarget::sUseFBO = newvalue.asBoolean(); +	if (gPipeline.isInit()) +	{ +		gPipeline.releaseGLBuffers(); +		gPipeline.createGLBuffers(); +	} +	return true; +} + +static bool handleRenderUseImpostorsChanged(const LLSD& newvalue) +{ +	LLVOAvatar::sUseImpostors = newvalue.asBoolean(); +	return true; +} + +static bool handleRenderUseCleverUIChanged(const LLSD& newvalue) +{ +	gGL.setClever(newvalue.asBoolean()); +	return true; +} + +static bool handleRenderResolutionDivisorChanged(const LLSD&) +{ +	gResizeScreenTexture = TRUE; +	return true; +} + +static bool handleDebugViewsChanged(const LLSD& newvalue) +{ +	LLView::sDebugRects = newvalue.asBoolean(); +	return true; +} + +static bool handleLogFileChanged(const LLSD& newvalue) +{ +	std::string log_filename = newvalue.asString(); +	LLFile::remove(log_filename.c_str()); +	LLError::logToFile(log_filename); +	return true; +} + +bool handleHideGroupTitleChanged(const LLSD& newvalue) +{ +	gAgent.setHideGroupTitle(newvalue); +	return true; +} + +bool handleEffectColorChanged(const LLSD& newvalue) +{ +	gAgent.setEffectColor(LLColor4(newvalue)); +	return true; +} + +bool handleRotateNetMapChanged(const LLSD& newvalue) +{ +	LLNetMap::setRotateMap(newvalue.asBoolean()); +	return true; +} + +bool handleVectorizeChanged(const LLSD& newvalue) +{ +	LLViewerJointMesh::updateVectorize(); +	return true; +} + +bool handleVoiceClientPrefsChanged(const LLSD& newvalue) +{ +	if(gVoiceClient) +	{ +		// Note: Ignore the specific event value, look up the ones we want + +		gVoiceClient->setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat")); +		gVoiceClient->setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); +		std::string keyString = gSavedSettings.getString("PushToTalkButton"); +		gVoiceClient->setPTTKey(keyString); +		gVoiceClient->setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); +		gVoiceClient->setEarLocation(gSavedSettings.getS32("VoiceEarLocation")); +		std::string serverName = gSavedSettings.getString("VivoxDebugServerName"); +		gVoiceClient->setVivoxDebugServerName(serverName); + +		std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); +		gVoiceClient->setCaptureDevice(inputDevice); +		std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); +		gVoiceClient->setRenderDevice(outputDevice); +	} +	return true; +} + +//////////////////////////////////////////////////////////////////////////// + +void settings_setup_listeners() +{ +	gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _1)); +	gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _1)); +	gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _1)); +	gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("RenderDynamicReflections")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1)); +	gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("EnableRippleWater")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("RenderGlowResolutionPow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1)); +	gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); +	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _1)); +	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _1)); +	gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _1)); +	gSavedSettings.getControl("RenderTreeLODFactor")->getSignal()->connect(boost::bind(&handleTreeLODChanged, _1)); +	gSavedSettings.getControl("RenderFlexTimeFactor")->getSignal()->connect(boost::bind(&handleFlexLODChanged, _1)); +	gSavedSettings.getControl("ThrottleBandwidthKBPS")->getSignal()->connect(boost::bind(&handleBandwidthChanged, _1)); +	gSavedSettings.getControl("RenderGamma")->getSignal()->connect(boost::bind(&handleGammaChanged, _1)); +	gSavedSettings.getControl("RenderFogRatio")->getSignal()->connect(boost::bind(&handleFogRatioChanged, _1)); +	gSavedSettings.getControl("RenderMaxPartCount")->getSignal()->connect(boost::bind(&handleMaxPartCountChanged, _1)); +	gSavedSettings.getControl("RenderDynamicLOD")->getSignal()->connect(boost::bind(&handleRenderDynamicLODChanged, _1)); +	gSavedSettings.getControl("RenderDebugTextureBind")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1)); +	gSavedSettings.getControl("RenderFastAlpha")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1)); +	gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1)); +	gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1)); +	gSavedSettings.getControl("RenderUseFBO")->getSignal()->connect(boost::bind(&handleRenderUseFBOChanged, _1)); +	gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _1)); +	gSavedSettings.getControl("RenderUseCleverUI")->getSignal()->connect(boost::bind(&handleRenderUseCleverUIChanged, _1)); +	gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _1)); +	gSavedSettings.getControl("AvatarCompositeLimit")->getSignal()->connect(boost::bind(&handleCompositeLimitChanged, _1)); +	gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _1)); +	gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _1)); +	gSavedSettings.getControl("ChatPersistTime")->getSignal()->connect(boost::bind(&handleChatPersistTimeChanged, _1)); +	gSavedSettings.getControl("ConsoleMaxLines")->getSignal()->connect(boost::bind(&handleConsoleMaxLinesChanged, _1)); +	gSavedSettings.getControl("UseOcclusion")->getSignal()->connect(boost::bind(&handleUseOcclusionChanged, _1)); +	gSavedSettings.getControl("AudioLevelMaster")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); + 	gSavedSettings.getControl("AudioLevelSFX")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); + 	gSavedSettings.getControl("AudioLevelUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioLevelAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioLevelMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioLevelMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioLevelVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioLevelDistance")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioLevelDoppler")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _1)); +	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("MuteMedia")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("MuteVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("MuteAmbient")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("MuteUI")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _1)); +	gSavedSettings.getControl("RenderVBOEnable")->getSignal()->connect(boost::bind(&handleRenderUseVBOChanged, _1)); +	gSavedSettings.getControl("WLSkyDetail")->getSignal()->connect(boost::bind(&handleWLSkyDetailChanged, _1)); +	gSavedSettings.getControl("RenderLightingDetail")->getSignal()->connect(boost::bind(&handleRenderLightingDetailChanged, _1)); +	gSavedSettings.getControl("NumpadControl")->getSignal()->connect(boost::bind(&handleNumpadControlChanged, _1)); +	gSavedSettings.getControl("FlycamAxis0")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1)); +	gSavedSettings.getControl("FlycamAxis1")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1)); +	gSavedSettings.getControl("FlycamAxis2")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1)); +	gSavedSettings.getControl("FlycamAxis3")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1)); +	gSavedSettings.getControl("FlycamAxis4")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1)); +	gSavedSettings.getControl("FlycamAxis5")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1)); +	gSavedSettings.getControl("FlycamAxis6")->getSignal()->connect(boost::bind(&handleJoystickChanged, _1)); +    gSavedSettings.getControl("DebugViews")->getSignal()->connect(boost::bind(&handleDebugViewsChanged, _1)); +    gSavedSettings.getControl("UserLogFile")->getSignal()->connect(boost::bind(&handleLogFileChanged, _1)); +	gSavedSettings.getControl("RenderHideGroupTitle")->getSignal()->connect(boost::bind(handleHideGroupTitleChanged, _1)); +	gSavedSettings.getControl("EffectColor")->getSignal()->connect(boost::bind(handleEffectColorChanged, _1)); +	gSavedSettings.getControl("MiniMapRotate")->getSignal()->connect(boost::bind(handleRotateNetMapChanged, _1)); +	gSavedSettings.getControl("VectorizePerfTest")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1)); +	gSavedSettings.getControl("VectorizeEnable")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1)); +	gSavedSettings.getControl("VectorizeProcessor")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1)); +	gSavedSettings.getControl("VectorizeSkin")->getSignal()->connect(boost::bind(&handleVectorizeChanged, _1)); +	gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +	gSavedSettings.getControl("PTTCurrentlyEnabled")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +	gSavedSettings.getControl("PushToTalkButton")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +	gSavedSettings.getControl("PushToTalkToggle")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +	gSavedSettings.getControl("VoiceEarLocation")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +	gSavedSettings.getControl("VivoxDebugServerName")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +	gSavedSettings.getControl("VoiceInputAudioDevice")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +	gSavedSettings.getControl("VoiceOutputAudioDevice")->getSignal()->connect(boost::bind(&handleVoiceClientPrefsChanged, _1)); +} + diff --git a/indra/newview/llviewercontrol.h b/indra/newview/llviewercontrol.h index c2a9dc9096..2727e36b53 100644 --- a/indra/newview/llviewercontrol.h +++ b/indra/newview/llviewercontrol.h @@ -32,9 +32,8 @@  #ifndef LL_LLVIEWERCONTROL_H  #define LL_LLVIEWERCONTROL_H +#include <map>  #include "llcontrol.h" -#include "llfloater.h" -#include "lltexteditor.h"  // Enabled this definition to compile a 'hacked' viewer that  // allows a hacked godmode to be toggled on and off. @@ -43,33 +42,12 @@  extern BOOL gHackGodmode;  #endif -class LLFloaterSettingsDebug : public LLFloater -{ -public: -	LLFloaterSettingsDebug(); -	virtual ~LLFloaterSettingsDebug(); - -	virtual BOOL postBuild(); -	virtual void draw(); - -	void updateControl(LLControlBase* control); - -	static void show(void*); -	static void onSettingSelect(LLUICtrl* ctrl, void* user_data); -	static void onCommitSettings(LLUICtrl* ctrl, void* user_data); -	static void onClickDefault(void* user_data); - -protected: -	static LLFloaterSettingsDebug* sInstance; -	LLTextEditor* mComment; -}; -  // These functions found in llcontroldef.cpp *TODO: clean this up!  //setting variables are declared in this function -void declare_settings(); -void fixup_settings();  void settings_setup_listeners(); +extern std::map<LLString, LLControlGroup*> gSettings; +  // for the graphics settings  void create_graphics_group(LLControlGroup& group); @@ -90,7 +68,4 @@ extern LLControlGroup gCrashSettings;  extern LLString gLastRunVersion;  extern LLString gCurrentVersion; -extern LLString gSettingsFileName; -extern LLString gPerAccountSettingsFileName; -  #endif // LL_LLVIEWERCONTROL_H diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 2677b33af8..fe00c25c63 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -866,13 +866,53 @@ static F64 sUpdateGeometryRunAvgOn[10];  static U32 sUpdateGeometryRunCount			= 0 ;  static U32 sUpdateGeometryCalls				= 0 ;  static U32 sUpdateGeometryLastProcessor		= 0 ; +static BOOL sVectorizePerfTest 				= FALSE; +static U32 sVectorizeProcessor 				= 0; + +//static  void (*LLViewerJointMesh::sUpdateGeometryFunc)(LLFace* face, LLPolyMesh* mesh); -void LLViewerJointMesh::updateGeometry() +//static +void LLViewerJointMesh::updateVectorize()  { -	extern BOOL gVectorizePerfTest; -	extern U32	gVectorizeProcessor; +	sVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest"); +	sVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor"); +	BOOL vectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable"); +	BOOL vectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin"); +	std::string vp; +	switch(sVectorizeProcessor) +	{ +		case 2: vp = "SSE2"; break;					// *TODO: replace the magic #s +		case 1: vp = "SSE"; break; +		default: vp = "COMPILER DEFAULT"; break; +	} +	llinfos << "Vectorization         : " << ( vectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ; +	llinfos << "Vector Processor      : " << vp << llendl ; +	llinfos << "Vectorized Skinning   : " << ( vectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ; +	if(vectorizeEnable && vectorizeSkin) +	{ +		switch(sVectorizeProcessor) +		{ +			case 2: +				sUpdateGeometryFunc = &updateGeometrySSE2; +				break; +			case 1: +				sUpdateGeometryFunc = &updateGeometrySSE; +				break; +			default: +				sUpdateGeometryFunc = &updateGeometryVectorized; +				break; +		} +	} +	else +	{ +		sUpdateGeometryFunc = &updateGeometryOriginal; +	} +} + +void LLViewerJointMesh::updateGeometry() +{  	if (!(mValid  		  && mMesh  		  && mFace @@ -883,7 +923,7 @@ void LLViewerJointMesh::updateGeometry()  		return;  	} -	if (!gVectorizePerfTest) +	if (!sVectorizePerfTest)  	{  		// Once we've measured performance, just run the specified  		// code version. @@ -916,13 +956,13 @@ void LLViewerJointMesh::updateGeometry()  		{  			F64 time_since_app_start = ug_timer.getElapsedSeconds();  			if(sUpdateGeometryGlobalTime == 0.0  -				|| sUpdateGeometryLastProcessor != gVectorizeProcessor) +				|| sUpdateGeometryLastProcessor != sVectorizeProcessor)  			{  				sUpdateGeometryGlobalTime		= time_since_app_start;  				sUpdateGeometryElapsedTime		= 0;  				sUpdateGeometryCalls			= 0;  				sUpdateGeometryRunCount			= 0; -				sUpdateGeometryLastProcessor	= gVectorizeProcessor; +				sUpdateGeometryLastProcessor	= sVectorizeProcessor;  				sUpdateGeometryCallPointer		= false;  				return;  			} @@ -969,7 +1009,7 @@ void LLViewerJointMesh::updateGeometry()  				F64 perf_boost = ( sUpdateGeometryElapsedTimeOff - sUpdateGeometryElapsedTimeOn ) / sUpdateGeometryElapsedTimeOn;  				llinfos << "run averages (" << (F64)sUpdateGeometryRunCount  					<< "/10) vectorize off " << a -					<< "% : vectorize type " << gVectorizeProcessor +					<< "% : vectorize type " << sVectorizeProcessor  					<< " " << b  					<< "% : performance boost "   					<< perf_boost * 100.0 @@ -983,7 +1023,6 @@ void LLViewerJointMesh::updateGeometry()  					// We have data now on which version is faster.  Switch to that  					// code and save the data for next run. -					gVectorizePerfTest = FALSE;  					gSavedSettings.setBOOL("VectorizePerfTest", FALSE);  					if (perf_boost > 0.0) diff --git a/indra/newview/llviewerjointmesh.h b/indra/newview/llviewerjointmesh.h index 8e1ee514ff..4cef1552ca 100644 --- a/indra/newview/llviewerjointmesh.h +++ b/indra/newview/llviewerjointmesh.h @@ -149,6 +149,9 @@ public:  	/*virtual*/ BOOL isAnimatable() { return FALSE; } +	static void updateVectorize(); // Update globals when settings variables change +	 +private:  	// Avatar vertex skinning is a significant performance issue on computers  	// with avatar vertex programs turned off (for example, most Macs).  We  	// therefore have custom versions that use SIMD instructions. diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index f86d822d90..9af072ad6f 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -44,9 +44,6 @@  #include "llmediamanager.h"  #include "lluuid.h" -// don't want to include llappviewer.h -extern std::string gChannelName; -  // Implementation functions not exported into header file  class LLViewerMediaImpl  	:	public LLMediaObserver @@ -457,7 +454,7 @@ void LLViewerMedia::initClass()  	// append our magic version number string to the browser user agent id  	std::ostringstream codec;  	codec << "[Second Life "; -	codec << "(" << gChannelName << ")"; +	codec << "(" << gSavedSettings.getString("VersionChannelName") << ")";  	codec << " - " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH << "." << LL_VERSION_BUILD;  	codec << "]";  	init_data->setBrowserUserAgentId( codec.str() ); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index a384d24947..a2b9cde5d1 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -120,6 +120,7 @@  #include "llfloaterregioninfo.h"  #include "llfloaterreporter.h"  #include "llfloaterscriptdebug.h" +#include "llfloatersettingsdebug.h"  #include "llfloaterenvsettings.h"  #include "llfloaterstats.h"  #include "llfloatertest.h" @@ -376,6 +377,11 @@ void toggle_cull_small(void *);  void toggle_show_xui_names(void *);  BOOL check_show_xui_names(void *); +void run_vectorize_perf_test(void *) +{ +	gSavedSettings.setBOOL("VectorizePerfTest", TRUE); +} +  // Debug UI  void handle_web_search_demo(void*);  void handle_slurl_test(void*); @@ -1091,7 +1097,7 @@ void init_client_menu(LLMenuGL* menu)  										&menu_check_control,  										(void*)"ShowConsoleWindow")); -	if(gQAMode) +	if(gSavedSettings.getBOOL("QAMode"))  	{  		LLMenuGL* sub = NULL;  		sub = new LLMenuGL("Debugging"); @@ -1171,7 +1177,6 @@ extern BOOL gDebugClicks;  extern BOOL gDebugWindowProc;  extern BOOL gDebugTextEditorTips;  extern BOOL gDebugSelectMgr; -extern BOOL gVectorizePerfTest;  void init_debug_ui_menu(LLMenuGL* menu)  { @@ -1383,7 +1388,7 @@ void init_debug_rendering_menu(LLMenuGL* menu)  										   (void*)"ShowDepthBuffer"));  	sub_menu->append(new LLMenuItemToggleGL("Show Select Buffer", &gDebugSelect)); -	sub_menu->append(new LLMenuItemToggleGL("Vectorize Perf Test", &gVectorizePerfTest)); +	sub_menu->append(new LLMenuItemCallGL("Vectorize Perf Test", &run_vectorize_perf_test));  	sub_menu = new LLMenuGL("Render Tests"); @@ -4848,7 +4853,7 @@ BOOL menu_check_build_tool( void* user_data )  void handle_reload_settings(void*)  {  	gSavedSettings.resetToDefaults(); -	gSavedSettings.loadFromFile(gSettingsFileName, TRUE); +	gSavedSettings.loadFromFile(gSavedSettings.getString("ClientSettingsFile"), TRUE);  	llinfos << "Loading colors from colors.xml" << llendl;  	std::string color_file = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"colors.xml"); diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index 6fb2957023..b0ebc64b7a 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -114,10 +114,5 @@ LLGridData gGridInfo[GRID_INFO_COUNT] =  // Use this to figure out which domain name and login URI to use.  EGridInfo gGridChoice = GRID_INFO_NONE; -char gGridName[MAX_STRING];		/* Flawfinder: ignore */ - -F32 gPacketDropPercentage = 0.f; -F32 gInBandwidth = 0.f; -F32 gOutBandwidth = 0.f; - +LLString gGridName;		/* Flawfinder: ignore */  unsigned char gMACAddress[MAC_ADDRESS_BYTES];		/* Flawfinder: ignore */ diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 4de73aae7a..4e6c874921 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -55,7 +55,7 @@ enum EGridInfo  	GRID_INFO_VAAK,  	GRID_INFO_YAMI,  	GRID_INFO_LOCAL, -	GRID_INFO_OTHER, // IP address set via -user or other command line option +	GRID_INFO_OTHER, // IP address set via command line option  	GRID_INFO_COUNT  }; @@ -68,12 +68,9 @@ struct LLGridData  	const char* mHelperURI;  }; -extern F32 gPacketDropPercentage; -extern F32 gInBandwidth; -extern F32 gOutBandwidth;  extern EGridInfo gGridChoice;  extern LLGridData gGridInfo[]; -extern char gGridName[MAX_STRING];		/* Flawfinder: ignore */ +extern LLString gGridName;		/* Flawfinder: ignore */  const S32 MAC_ADDRESS_BYTES = 6;  extern unsigned char gMACAddress[MAC_ADDRESS_BYTES];		/* Flawfinder: ignore */ diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 69e08db2bf..e2ea6e6ecf 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -678,31 +678,6 @@ void LLVivoxProtocolParser::processResponse(std::string tag)  /////////////////////////////////////////////////////////////////////////////////////////////// -class LLVoiceClientPrefsListener: public LLSimpleListener -{ -	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) -	{ -		// Note: Ignore the specific event value, look up the ones we want - -		gVoiceClient->setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat")); -		gVoiceClient->setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); -		std::string keyString = gSavedSettings.getString("PushToTalkButton"); -		gVoiceClient->setPTTKey(keyString); -		gVoiceClient->setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); -		gVoiceClient->setEarLocation(gSavedSettings.getS32("VoiceEarLocation")); -		std::string serverName = gSavedSettings.getString("VivoxDebugServerName"); -		gVoiceClient->setVivoxDebugServerName(serverName); - -		std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); -		gVoiceClient->setCaptureDevice(inputDevice); -		std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice"); -		gVoiceClient->setRenderDevice(outputDevice); - -		return true; -	} -}; -static LLVoiceClientPrefsListener voice_prefs_listener; -  class LLVoiceClientMuteListObserver : public LLMuteListObserver  {  	/* virtual */ void onChange()  { gVoiceClient->muteListChanged();} @@ -859,16 +834,6 @@ LLVoiceClient::LLVoiceClient()  	std::string renderDevice = gSavedSettings.getString("VoiceOutputAudioDevice");  	setRenderDevice(renderDevice); -	// Set up our listener to get updates on all prefs values we care about. -	gSavedSettings.getControl("EnableVoiceChat")->addListener(&voice_prefs_listener); -	gSavedSettings.getControl("PTTCurrentlyEnabled")->addListener(&voice_prefs_listener); -	gSavedSettings.getControl("PushToTalkButton")->addListener(&voice_prefs_listener); -	gSavedSettings.getControl("PushToTalkToggle")->addListener(&voice_prefs_listener); -	gSavedSettings.getControl("VoiceEarLocation")->addListener(&voice_prefs_listener); -	gSavedSettings.getControl("VivoxDebugServerName")->addListener(&voice_prefs_listener); -	gSavedSettings.getControl("VoiceInputAudioDevice")->addListener(&voice_prefs_listener); -	gSavedSettings.getControl("VoiceOutputAudioDevice")->addListener(&voice_prefs_listener); -  	mTuningMode = false;  	mTuningEnergy = 0.0f;  	mTuningMicVolume = 0; @@ -1281,7 +1246,7 @@ void LLVoiceClient::stateMachine()  		break;  		case stateStart: -			if(gDisableVoice) +			if(gSavedSettings.getBOOL("CmdLineDisableVoice"))  			{  				// Voice is locked out, we must not launch the vivox daemon.  				setState(stateJail); @@ -3644,7 +3609,7 @@ void LLVoiceClient::setVoiceEnabled(bool enabled)  bool LLVoiceClient::voiceEnabled()  { -	return gSavedSettings.getBOOL("EnableVoiceChat") && !gDisableVoice; +	return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice");  }  void LLVoiceClient::setUsePTT(bool usePTT) diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp index 9dc92efa81..fc4ede5bab 100644 --- a/indra/newview/llxmlrpctransaction.cpp +++ b/indra/newview/llxmlrpctransaction.cpp @@ -238,8 +238,9 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)  //	mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging  	mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);  	mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this); -	mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, gVerifySSLCert); -	mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, gVerifySSLCert? 2 : 0); +    	BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert"); +	mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, vefifySSLCert); +	mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, vefifySSLCert ? 2 : 0);  	// Be a little impatient about establishing connections.  	mCurlRequest->setopt(CURLOPT_CONNECTTIMEOUT, 40L); diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index b19e4e2c9c..e87fe8d8ff 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -115,15 +115,15 @@ class ViewerManifest(LLManifest):                  if not self.default_grid():                          if self.default_channel():                                  # beta grid viewer -                                channel_flags = '-settings settings_beta.xml' -                        grid_flags = "-helperuri http://preview-%(grid)s.secondlife.com/helpers/ -loginuri https://login.%(grid)s.lindenlab.com/cgi-bin/login.cgi" % {'grid':self.args['grid']} +                                channel_flags = '--settings settings_beta.xml' +                        grid_flags = "--helperuri http://preview-%(grid)s.secondlife.com/helpers/ --loginuri https://login.%(grid)s.lindenlab.com/cgi-bin/login.cgi" % {'grid':self.args['grid']}                  if not self.default_channel():                          # some channel on some grid -                        channel_flags = '-settings settings_%s.xml -channel "%s"' % (self.channel_lowerword(), self.channel()) +                        channel_flags = '--settings settings_%s.xml --channel "%s"' % (self.channel_lowerword(), self.channel())                  elif self.login_channel():                          # Report a special channel during login, but use default channel elsewhere -                        channel_flags = '-channel "%s"' % (self.login_channel()) +                        channel_flags = '--channel "%s"' % (self.login_channel())                  return " ".join((channel_flags, grid_flags)).strip()  | 
