diff options
| author | Oz Linden <oz@lindenlab.com> | 2012-11-27 11:18:52 -0500 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2012-11-27 11:18:52 -0500 | 
| commit | cceeacc72620ab2e5b0fb608f2974e4af694a6d5 (patch) | |
| tree | 6cacf606bbb6340755174e4f80012224fc7fff7b | |
| parent | c57a40da173bb0622d56771ec9ab9998c3f74e28 (diff) | |
| parent | c3d6211b346195110314e25485ff4ff2a752f950 (diff) | |
merge storm-1855 to latest viewer-development
| -rw-r--r-- | doc/contributions.txt | 5 | ||||
| -rw-r--r-- | indra/cmake/Variables.cmake | 2 | ||||
| -rw-r--r-- | indra/llui/lltexteditor.cpp | 24 | ||||
| -rw-r--r-- | indra/llui/lltexteditor.h | 2 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 165 | ||||
| -rw-r--r-- | indra/newview/llappviewer.h | 6 | ||||
| -rw-r--r-- | indra/newview/llfloaterbulkpermission.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llfloaterbulkpermission.h | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_bulk_perms.xml | 19 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/panel_preferences_advanced.xml | 2 | 
10 files changed, 176 insertions, 57 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index f18985adcd..4120e3bc8f 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -496,6 +496,8 @@ Ima Mechanique  	STORM-959  	STORM-1175  	STORM-1708 +	STORM-1855 +	VWR-20553  Imnotgoing Sideways  Inma Rau  Innula Zenovka @@ -639,6 +641,8 @@ Jonathan Yap  	STORM-1793  	STORM-1810  	STORM-1877 +	STORM-1892 +	STORM-1894  	STORM-1860  	STORM-1852  	STORM-1870 @@ -1033,6 +1037,7 @@ Satanello Miami  Satomi Ahn  	STORM-501  	STORM-229 +	VWR-20553  	VWR-24502  Scrim Pinion  Scrippy Scofield diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 4b459f1a48..a64ce2d4ba 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -141,7 +141,7 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")  set(GRID agni CACHE STRING "Target Grid")  set(VIEWER ON CACHE BOOL "Build Second Life viewer.") -set(VIEWER_CHANNEL "LindenDeveloper" CACHE STRING "Viewer Channel Name") +set(VIEWER_CHANNEL "Second Life Developer" CACHE STRING "Viewer Channel Name")  set(VIEWER_LOGIN_CHANNEL ${VIEWER_CHANNEL} CACHE STRING "Fake login channel for A/B Testing")  if (XCODE_VERSION GREATER 4.2) diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 144b6960a1..1e3a99c088 100644 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1095,7 +1095,8 @@ void LLTextEditor::addChar(llwchar wc)  	setCursorPos(mCursorPos + addChar( mCursorPos, wc ));  } -void LLTextEditor::addLineBreakChar() + +void LLTextEditor::addLineBreakChar(BOOL group_together)  {  	if( !getEnabled() )  	{ @@ -1113,7 +1114,7 @@ void LLTextEditor::addLineBreakChar()  	LLStyleConstSP sp(new LLStyle(LLStyle::Params()));  	LLTextSegmentPtr segment = new LLLineBreakTextSegment(sp, mCursorPos); -	S32 pos = execute(new TextCmdAddChar(mCursorPos, FALSE, '\n', segment)); +	S32 pos = execute(new TextCmdAddChar(mCursorPos, group_together, '\n', segment));  	setCursorPos(mCursorPos + pos);  } @@ -1436,21 +1437,28 @@ void LLTextEditor::pasteHelper(bool is_primary)  	std::basic_string<llwchar>::size_type start = 0;  	std::basic_string<llwchar>::size_type pos = clean_string.find('\n',start); -	while(pos!=-1) +	while((pos != -1) && (pos != clean_string.length() -1))  	{  		if(pos!=start)  		{  			std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,pos-start); -			setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +			setCursorPos(mCursorPos + insert(mCursorPos, str, TRUE, LLTextSegmentPtr()));  		} -		addLineBreakChar(); -		 +		addLineBreakChar(TRUE);			// Add a line break and group with the next addition. +  		start = pos+1;  		pos = clean_string.find('\n',start);  	} -	std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start); -	setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +	if (pos != start) +	{ +		std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start); +		setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +	} +	else +	{ +		addLineBreakChar(FALSE);		// Add a line break and end the grouping. +	}  	deselect(); diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 40821ae9fb..7d2dd09a28 100644 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -239,7 +239,7 @@ protected:  	// Undoable operations  	void			addChar(llwchar c); // at mCursorPos  	S32				addChar(S32 pos, llwchar wc); -	void			addLineBreakChar(); +	void			addLineBreakChar(BOOL group_together = FALSE);  	S32				overwriteChar(S32 pos, llwchar wc);  	void			removeChar();  	S32 			removeChar(S32 pos); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 30f82926f1..aa465b7a75 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -323,7 +323,7 @@ BOOL gLogoutInProgress = FALSE;  ////////////////////////////////////////////////////////////  // Internal globals... that should be removed.  static std::string gArgs; - +const int MAX_MARKER_LENGTH = 1024;  const std::string MARKER_FILE_NAME("SecondLife.exec_marker");  const std::string ERROR_MARKER_FILE_NAME("SecondLife.error_marker");  const std::string LLERROR_MARKER_FILE_NAME("SecondLife.llerror_marker"); @@ -626,7 +626,7 @@ LLTextureFetch* LLAppViewer::sTextureFetch = NULL;  LLAppViewer::LLAppViewer() :   	mMarkerFile(), -	mLogoutMarkerFile(NULL), +	mLogoutMarkerFile(),  	mReportedCrash(false),  	mNumSessions(0),  	mPurgeCache(false), @@ -3206,8 +3206,8 @@ void LLAppViewer::writeSystemInfo()  	}  	// Dump some debugging info -	LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME") -			<< " version " << LLVersionInfo::getShortVersion() << LL_ENDL; +	LL_INFOS("SystemInfo") << "Application: " << LLTrans::getString("APP_NAME") << LL_ENDL; +	LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::getChannelAndVersion() << LL_ENDL;  	// Dump the local time and time zone  	time_t now; @@ -3335,22 +3335,27 @@ void LLAppViewer::handleViewerCrash()  	//we're already in a crash situation	  	if (gDirUtilp)  	{ -		std::string crash_file_name; -		if(gLLErrorActivated) crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME); -		else crash_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME); -		llinfos << "Creating crash marker file " << crash_file_name << llendl; +		std::string crash_file_name = ( gLLErrorActivated ) +			? gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LLERROR_MARKER_FILE_NAME) +			: gDirUtilp->getExpandedFilename(LL_PATH_LOGS,ERROR_MARKER_FILE_NAME); +		LL_INFOS("MarkerFile") << "Creating crash marker file " << crash_file_name << LL_ENDL;  		LLAPRFile crash_file ;  		crash_file.open(crash_file_name, LL_APR_W);  		if (crash_file.getFileHandle())  		{  			LL_INFOS("MarkerFile") << "Created crash marker file " << crash_file_name << LL_ENDL; +			recordMarkerVersion(crash_file);  		}  		else  		{  			LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_file_name << LL_ENDL;  		}		  	} +	else +	{ +		LL_WARNS("MarkerFile") << "No gDirUtilp with which to create error marker file name" << LL_ENDL; +	}		  	if (gMessageSystem && gDirUtilp)  	{ @@ -3402,7 +3407,7 @@ bool LLAppViewer::anotherInstanceRunning()  	// If the file is currently locked, that means another process is already running.  	std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, MARKER_FILE_NAME); -	LL_DEBUGS("MarkerFile") << "Checking marker file for lock..." << LL_ENDL; +	LL_DEBUGS("MarkerFile") << "Checking marker file '"<< marker_file << "' for lock..." << LL_ENDL;  	//Freeze case checks  	if (LLAPRFile::isExist(marker_file, NULL, LL_APR_RB)) @@ -3428,6 +3433,46 @@ bool LLAppViewer::anotherInstanceRunning()  	return false;  } +// static +void LLAppViewer::recordMarkerVersion(LLAPRFile& marker_file)  +{		 +	std::string marker_version(LLVersionInfo::getChannelAndVersion()); +	if ( marker_version.length() > MAX_MARKER_LENGTH ) +	{ +		LL_WARNS_ONCE("MarkerFile") << "Version length ("<< marker_version.length()<< ") greater than maximum: marker matching may be incorrect" << LL_ENDL; +	} + +	// record the viewer version in the marker file +	marker_file.write(marker_version.data(), marker_version.length()); +} + +bool LLAppViewer::markerIsSameVersion(const std::string& marker_name) const +{ +	bool sameVersion = false; + +	std::string my_version(LLVersionInfo::getChannelAndVersion()); +	char marker_version[MAX_MARKER_LENGTH]; +	S32  marker_version_length; + +	LLAPRFile marker_file; +	marker_file.open(marker_name, LL_APR_RB); +	if (marker_file.getFileHandle()) +	{ +		marker_version_length = marker_file.read(marker_version, sizeof(marker_version)); +		LL_DEBUGS("MarkerFile") << "Compare markers: "; +		std::string marker_string(marker_version, marker_version_length); +		LL_CONT << "\n   mine '" << my_version    << "'" +				<< "\n marker '" << marker_string << "'" +				<< LL_ENDL; +		if ( 0 == my_version.compare( 0, my_version.length(), marker_version, 0, marker_version_length ) ) +		{ +			sameVersion = true; +		} +		marker_file.close(); +	} +	return sameVersion; +} +  void LLAppViewer::initMarkerFile()  {  	//First, check for the existence of other files. @@ -3450,27 +3495,55 @@ void LLAppViewer::initMarkerFile()  	if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning())  	{ -		gLastExecEvent = LAST_EXEC_FROZE; -		LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL; +		if ( markerIsSameVersion(mMarkerFileName) ) +		{ +			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found" << LL_ENDL; +			gLastExecEvent = LAST_EXEC_FROZE; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found, but versions did not match" << LL_ENDL; +		}  	}      	if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))  	{ -		gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; -		LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		if (markerIsSameVersion(logout_marker_file)) +		{ +			gLastExecEvent = LAST_EXEC_LOGOUT_FROZE; +			LL_INFOS("MarkerFile") << "Logout crashed '"<< logout_marker_file << "', setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Logout crash marker '"<< logout_marker_file << "' found, but versions did not match" << LL_ENDL; +		}  		LLAPRFile::remove(logout_marker_file);  	}  	if(LLAPRFile::isExist(llerror_marker_file, NULL, LL_APR_RB))  	{ -		if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; -		else gLastExecEvent = LAST_EXEC_LLERROR_CRASH; -		LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		if (markerIsSameVersion(llerror_marker_file)) +		{ +			gLastExecEvent = ( gLastExecEvent == LAST_EXEC_LOGOUT_FROZE ) +				? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_LLERROR_CRASH; +			LL_INFOS("MarkerFile") << "Last exec LLError '"<< llerror_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Last exec LLError marker '"<< llerror_marker_file << "' found, but versions did not match" << LL_ENDL; +		}  		LLAPRFile::remove(llerror_marker_file);  	}  	if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB))  	{ -		if(gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; -		else gLastExecEvent = LAST_EXEC_OTHER_CRASH; -		LL_INFOS("MarkerFile") << "Last exec crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		if (markerIsSameVersion(error_marker_file)) +		{ +			gLastExecEvent = (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) +				? LAST_EXEC_LOGOUT_CRASH : LAST_EXEC_OTHER_CRASH; +			LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Last exec '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL; +		}  		LLAPRFile::remove(error_marker_file);  	} @@ -3486,35 +3559,48 @@ void LLAppViewer::initMarkerFile()  	if (s == APR_SUCCESS && mMarkerFile.getFileHandle())  	{ -		LL_DEBUGS("MarkerFile") << "Marker file created." << LL_ENDL; +		LL_DEBUGS("MarkerFile") << "Marker file '"<< mMarkerFileName << "' created." << LL_ENDL; +		if (APR_SUCCESS == apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE))  +		{ +			recordMarkerVersion(mMarkerFile); +			LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL; +		} +		else +		{ +			LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL; +		}  	}  	else  	{ -		LL_INFOS("MarkerFile") << "Failed to create marker file." << LL_ENDL; -		return; -	} -	if (apr_file_lock(mMarkerFile.getFileHandle(), APR_FLOCK_NONBLOCK | APR_FLOCK_EXCLUSIVE) != APR_SUCCESS)  -	{ -		mMarkerFile.close() ; -		LL_INFOS("MarkerFile") << "Marker file cannot be locked." << LL_ENDL; -		return; +		LL_INFOS("MarkerFile") << "Failed to create marker file '"<< mMarkerFileName << "'." << LL_ENDL;  	} - -	LL_DEBUGS("MarkerFile") << "Marker file locked." << LL_ENDL;  }  void LLAppViewer::removeMarkerFile(bool leave_logout_marker)  { -	LL_DEBUGS("MarkerFile") << "removeMarkerFile()" << LL_ENDL; +	LL_DEBUGS("MarkerFile") << "removeMarkerFile("<<leave_logout_marker<<")" << LL_ENDL;  	if (mMarkerFile.getFileHandle())  	{ -		mMarkerFile.close() ; +		LL_DEBUGS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"'"<< LL_ENDL; +		mMarkerFile.close();  		LLAPRFile::remove( mMarkerFileName );  	} -	if (mLogoutMarkerFile != NULL && !leave_logout_marker) +	else  	{ +		LL_WARNS("MarkerFile") << "removeMarkerFile marker '"<<mMarkerFileName<<"' not open"<< LL_ENDL; +	} +	if (!leave_logout_marker) +	{ +		if (mLogoutMarkerFile.getFileHandle()) +		{ +			LL_DEBUGS("MarkerFile") << "removeMarkerFile marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL; +			mLogoutMarkerFile.close(); +		} +		else +		{ +			LL_WARNS("MarkerFile") << "removeMarkerFile marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; +		}  		LLAPRFile::remove( mLogoutMarkerFileName ); -		mLogoutMarkerFile = NULL;  	}  } @@ -4718,16 +4804,15 @@ void LLAppViewer::sendLogoutRequest()  		mLogoutMarkerFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,LOGOUT_MARKER_FILE_NAME);  		LLAPRFile outfile ; -		outfile.open(mLogoutMarkerFileName, LL_APR_W); -		mLogoutMarkerFile =  outfile.getFileHandle() ; -		if (mLogoutMarkerFile) +		mLogoutMarkerFile.open(mLogoutMarkerFileName, LL_APR_W); +		if (mLogoutMarkerFile.getFileHandle())  		{ -			llinfos << "Created logout marker file " << mLogoutMarkerFileName << llendl; -    		apr_file_close(mLogoutMarkerFile); +			LL_INFOS("MarkerFile") << "Created logout marker file '"<< mLogoutMarkerFileName << "' " << mLogoutMarkerFileName << LL_ENDL; +			recordMarkerVersion(outfile);  		}  		else  		{ -			llwarns << "Cannot create logout marker file " << mLogoutMarkerFileName << llendl; +			LL_WARNS("MarkerFile") << "Cannot create logout marker file " << mLogoutMarkerFileName << LL_ENDL;  		}		  	}  } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 7a474f9122..0cfedd8b2a 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -214,7 +214,9 @@ private:  	bool anotherInstanceRunning();   	void initMarkerFile();  -     +	static void recordMarkerVersion(LLAPRFile& marker_file); +	bool markerIsSameVersion(const std::string& marker_name) const; +	      void idle();       void idleShutdown();  	// update avatar SLID and display name caches @@ -234,7 +236,7 @@ private:  	LLAPRFile mMarkerFile; // A file created to indicate the app is running.  	std::string mLogoutMarkerFileName; -	apr_file_t* mLogoutMarkerFile; // A file created to indicate the app is running. +	LLAPRFile mLogoutMarkerFile; // A file created to indicate the app is running.  	LLOSInfo mSysOSInfo;  diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 90f40628a8..d9577eb74a 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -57,6 +57,7 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)  	mDone(FALSE)  {  	mID.generate(); +	mCommitCallbackRegistrar.add("BulkPermission.Ok",		boost::bind(&LLFloaterBulkPermission::onOkBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.Apply",	boost::bind(&LLFloaterBulkPermission::onApplyBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.Close",	boost::bind(&LLFloaterBulkPermission::onCloseBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.CheckAll",	boost::bind(&LLFloaterBulkPermission::onCheckAll, this)); @@ -144,6 +145,12 @@ void LLFloaterBulkPermission::inventoryChanged(LLViewerObject* viewer_object,  	}  } +void LLFloaterBulkPermission::onOkBtn() +{ +	doApply(); +	closeFloater(); +} +  void LLFloaterBulkPermission::onApplyBtn()  {  	doApply(); diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index 7dd05df7ee..58e4467f4d 100644 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -72,6 +72,7 @@ private:  								bool is_new);  	void onCloseBtn(); +	void onOkBtn();  	void onApplyBtn();  	void onCommitCopy();  	void onCheckAll() { doCheckUncheckAll(TRUE); } diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 4e0cfb0cd4..e7ab3cacdc 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -6,7 +6,7 @@   layout="topleft"   name="floaterbulkperms"   help_topic="floaterbulkperms" - title="EDIT CONTENT PERMISSIONS" + title="ADJUST CONTENT PERMISSIONS"   width="410">      <floater.string       name="nothing_to_modify_text"> @@ -192,7 +192,7 @@       name="newperms"       top="90"       width="250"> -        New Content Permissions +        Adjust Content Permissions To      </text>        <text         type="string" @@ -292,11 +292,22 @@       height="23"       label="OK"       layout="topleft" -     left="205" -     name="apply" +     left="110" +     name="ok"       top_pad="10"       width="90">        <button.commit_callback +       function="BulkPermission.Ok"/> +    </button> +    <button +     follows="left|top" +     height="23" +     label="Apply" +     layout="topleft" +     left_pad="5" +     name="apply" +     width="90"> +      <button.commit_callback         function="BulkPermission.Apply"/>      </button>      <button diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 2cc9d9c1b0..50fd57494f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -138,7 +138,7 @@     initial_value="1"     layout="topleft"     left_pad="0" -   max_val="1.4" +   max_val="1.5"     min_val="0.75"     name="ui_scale_slider"     top_pad="-14" | 
