diff options
| -rw-r--r-- | indra/llui/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | indra/llui/llbutton.cpp | 8 | ||||
| -rw-r--r-- | indra/llui/llfloater.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llfloaterreg.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/lltabcontainer.cpp | 3 | ||||
| -rw-r--r-- | indra/llui/lltoolbar.cpp | 4 | ||||
| -rw-r--r-- | indra/llui/lluictrl.cpp | 22 | ||||
| -rw-r--r-- | indra/llui/lluictrl.h | 4 | ||||
| -rw-r--r-- | indra/llui/lluiusage.cpp | 146 | ||||
| -rw-r--r-- | indra/llui/lluiusage.h | 57 | ||||
| -rw-r--r-- | indra/newview/llchatbar.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llfloaterimnearbychat.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llviewermessage.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llviewerstats.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/llworldmipmap.cpp | 2 | 
16 files changed, 261 insertions, 3 deletions
| diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index cce618487b..f781ff4110 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -122,6 +122,7 @@ set(llui_SOURCE_FILES      lluictrl.cpp      lluictrlfactory.cpp      lluistring.cpp +    lluiusage.cpp      llundo.cpp      llurlaction.cpp      llurlentry.cpp @@ -241,6 +242,7 @@ set(llui_HEADER_FILES      llui.h      lluicolor.h      lluistring.h +    lluiusage.h      llundo.h      llurlaction.h      llurlentry.h diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 9682c3bc10..0e59fdf519 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -47,6 +47,7 @@  #include "llnotificationsutil.h"  #include "llrender.h"  #include "lluictrlfactory.h" +#include "lluiusage.h"  #include "llhelp.h"  #include "lldockablefloater.h"  #include "llviewereventrecorder.h" @@ -437,6 +438,13 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask)  			setFocus(TRUE);  		} +		if (!mFunctionName.empty()) +		{ +			LL_DEBUGS("UIUsage") << "calling mouse down function " << mFunctionName << LL_ENDL; +			LLUIUsage::instance().logCommand(mFunctionName); +			LLUIUsage::instance().logControl(getPathname()); +		} +  		/*  		 * ATTENTION! This call fires another mouse down callback.  		 * If you wish to remove this call emit that signal directly diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index e9c980ad9a..c03b024dd5 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -58,6 +58,7 @@  #include "llhelp.h"  #include "llmultifloater.h"  #include "llsdutil.h" +#include "lluiusage.h"  #include <boost/foreach.hpp> @@ -1631,6 +1632,7 @@ void LLFloater::bringToFront( S32 x, S32 y )  // virtual  void LLFloater::setVisibleAndFrontmost(BOOL take_focus,const LLSD& key)  { +	LLUIUsage::instance().logFloater(getInstanceName());  	LLMultiFloater* hostp = getHost();  	if (hostp)  	{ diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 85e07fc6a6..7c0933f554 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -32,6 +32,7 @@  #include "llfloater.h"  #include "llmultifloater.h"  #include "llfloaterreglistener.h" +#include "lluiusage.h"  //******************************************************* @@ -472,7 +473,6 @@ void LLFloaterReg::toggleInstanceOrBringToFront(const LLSD& sdname, const LLSD&  	std::string name = sdname.asString();  	LLFloater* instance = getInstance(name, key);  -  	if (!instance)  	{  		LL_DEBUGS() << "Unable to get instance of floater '" << name << "'" << LL_ENDL; diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index e6b43da8e5..459fdcf2ae 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -38,6 +38,7 @@  #include "llrender.h"  #include "llfloater.h"  #include "lltrans.h" +#include "lluiusage.h"  //---------------------------------------------------------------------------- @@ -1556,6 +1557,8 @@ BOOL LLTabContainer::setTab(S32 which)  			if (is_selected)  			{ +				LLUIUsage::instance().logPanel(tuple->mTabPanel->getName()); +  				// Make sure selected tab is within scroll region  				if (mIsVertical)  				{ diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index e6f466ec78..4868c66d1b 100644 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -967,6 +967,8 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)  			executeStopParam.function_name = executeStopFunction;  			executeStopParam.parameter = commandp->executeStopParameters();  			LLUICtrl::commit_callback_t execute_func = initCommitCallback(executeParam); +			button->setFunctionName(commandp->executeFunctionName()); +			LL_DEBUGS("UIUsage") << "button function name a -> " << commandp->executeFunctionName() << LL_ENDL;  			LLUICtrl::commit_callback_t stop_func = initCommitCallback(executeStopParam);  			button->setMouseDownCallback(boost::bind(&LLToolBarButton::callIfEnabled, button, execute_func, _1, _2)); @@ -974,6 +976,8 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)  		}  		else  		{ +			button->setFunctionName(commandp->executeFunctionName()); +			LL_DEBUGS("UIUsage") << "button function name b -> " << commandp->executeFunctionName() << LL_ENDL;  			button->setCommitCallback(executeParam);  		} diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 544a76e8d5..5924542a19 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -35,6 +35,7 @@  #include "lluictrlfactory.h"  #include "lltabcontainer.h"  #include "llaccordionctrltab.h" +#include "lluiusage.h"  static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl"); @@ -282,6 +283,7 @@ LLUICtrl::commit_signal_t::slot_type LLUICtrl::initCommitCallback(const CommitCa  	else  	{  		std::string function_name = cb.function_name; +		setFunctionName(function_name);  		commit_callback_t* func = (CommitCallbackRegistry::getValue(function_name));  		if (func)  		{ @@ -422,7 +424,19 @@ BOOL LLUICtrl::canFocusChildren() const  void LLUICtrl::onCommit()  {  	if (mCommitSignal) -	(*mCommitSignal)(this, getValue()); +	{ +		if (!mFunctionName.empty()) +		{ +			LL_DEBUGS("UIUsage") << "calling commit function " << mFunctionName << LL_ENDL; +			LLUIUsage::instance().logCommand(mFunctionName); +			LLUIUsage::instance().logControl(getPathname()); +		} +		else +		{ +			//LL_DEBUGS("UIUsage") << "calling commit function " << "UNKNOWN" << LL_ENDL; +		} +		(*mCommitSignal)(this, getValue()); +	}  }  //virtual @@ -597,6 +611,12 @@ void LLUICtrl::setMakeInvisibleControlVariable(LLControlVariable* control)  		setVisible(!(mMakeInvisibleControlVariable->getValue().asBoolean()));  	}  } + +void LLUICtrl::setFunctionName(const std::string& function_name) +{ +	mFunctionName = function_name; +} +  // static  bool LLUICtrl::controlListener(const LLSD& newvalue, LLHandle<LLUICtrl> handle, std::string type)  { diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 7360bd7659..67dd24341c 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -183,6 +183,8 @@ public:  	void setMakeVisibleControlVariable(LLControlVariable* control);  	void setMakeInvisibleControlVariable(LLControlVariable* control); +	void setFunctionName(const std::string& function_name); +	  	virtual void	setTentative(BOOL b);  	virtual BOOL	getTentative() const;  	virtual void	setValue(const LLSD& value); @@ -310,6 +312,8 @@ protected:  	LLControlVariable* mMakeInvisibleControlVariable;  	boost::signals2::connection mMakeInvisibleControlConnection; +	std::string mFunctionName; +  	static F32 sActiveControlTransparency;  	static F32 sInactiveControlTransparency; diff --git a/indra/llui/lluiusage.cpp b/indra/llui/lluiusage.cpp new file mode 100644 index 0000000000..ccae6643b9 --- /dev/null +++ b/indra/llui/lluiusage.cpp @@ -0,0 +1,146 @@ +/** +* @file lluiuisage.cpp +* @brief Source file for LLUIUsage +* +* $LicenseInfo:firstyear=2021&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2021, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#include "linden_common.h" +#include "lluiusage.h" +#include <boost/algorithm/string.hpp> + +LLUIUsage::LLUIUsage() +{ +} + +LLUIUsage::~LLUIUsage() +{ +} + +// static +std::string LLUIUsage::sanitized(const std::string& s) +{ +	// Remove characters that make the ViewerStats db unhappy +	std::string result(s); +	std::replace(result.begin(), result.end(), '.', '_'); +	std::replace(result.begin(), result.end(), ' ', '_'); +	return result; +} + +// static +void LLUIUsage::setLLSDPath(LLSD& sd, const std::string& path, S32 max_elts, const LLSD& val) +{ +	// Keep the last max_elts components of the specified path +	std::vector<std::string> fields; +	boost::split(fields, path, boost::is_any_of("/")); +	auto first_pos = std::max(fields.begin(), fields.end() - max_elts); +	auto end_pos = fields.end(); +	std::vector<std::string> last_fields(first_pos,end_pos); + +	setLLSDNested(sd, last_fields, val); +} + +// setLLSDNested() +// Accomplish the equivalent of  +//   sd[fields[0]][fields[1]]... = val; +// for an arbitrary number of fields. +// This might be useful as an LLSD utility function; is not specific to LLUIUsage +//  +// static +void LLUIUsage::setLLSDNested(LLSD& sd, const std::vector<std::string>& fields, const LLSD& val) +{ +	LLSD* fsd = &sd; +	for (auto it=fields.begin(); it!=fields.end(); ++it) +	{ +		if (it == fields.end()-1) +		{ +			(*fsd)[*it] = val; +		} +		else +		{ +			if (!(*fsd)[*it].isMap()) +			{ +				(*fsd)[*it] = LLSD::emptyMap(); +			} +			fsd = &(*fsd)[*it]; +		} +	} +} + +void LLUIUsage::logCommand(const std::string& command) +{ +	mCommandCounts[sanitized(command)]++; +	LL_DEBUGS("UIUsage") << "command " << command << LL_ENDL; +} + +void LLUIUsage::logControl(const std::string& control) +{ +	mControlCounts[sanitized(control)]++; +	LL_DEBUGS("UIUsage") << "control " << control << LL_ENDL; +} + + +void LLUIUsage::logFloater(const std::string& floater) +{ +	mFloaterCounts[sanitized(floater)]++; +	LL_DEBUGS("UIUsage") << "floater " << floater << LL_ENDL; +} + +void LLUIUsage::logPanel(const std::string& p) +{ +	mPanelCounts[sanitized(p)]++; +	LL_DEBUGS("UIUsage") << "panel " << p << LL_ENDL; +} + +LLSD LLUIUsage::asLLSD() const +{ +	LLSD result; +	for (auto const& it : mCommandCounts) +	{ +		result["commands"][it.first] = LLSD::Integer(it.second); +	} +	for (auto const& it : mControlCounts) +	{ +		setLLSDPath(result["controls"], it.first, 2, LLSD::Integer(it.second)); +	} +	for (auto const& it : mFloaterCounts) +	{ +		result["floaters"][it.first] = LLSD::Integer(it.second); +	} +	for (auto const& it : mPanelCounts) +	{ +		result["panels"][it.first] = LLSD::Integer(it.second); +	} +	return result; +} + +// Clear up some junk content generated during initial login/UI initialization +void LLUIUsage::clear() +{ + +	LL_DEBUGS("UIUsage") << "clear" << LL_ENDL; +	mCommandCounts.clear(); +	mControlCounts.clear(); +	mFloaterCounts.clear(); +	mPanelCounts.clear(); +} + diff --git a/indra/llui/lluiusage.h b/indra/llui/lluiusage.h new file mode 100644 index 0000000000..a30cd80db3 --- /dev/null +++ b/indra/llui/lluiusage.h @@ -0,0 +1,57 @@ +/** +* @file lluiuisage.h +* @brief Header file for LLUIUsage +* +* $LicenseInfo:firstyear=2021&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2021, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA +* $/LicenseInfo$ +*/ + +#ifndef LL_LLUIUSAGE_H +#define LL_LLUIUSAGE_H + +#include <map> +#include "llsd.h" +#include "llsingleton.h" + +// UIUsage tracking to see which operations and UI elements are most popular in a session +class LLUIUsage : public LLSingleton<LLUIUsage> +{ +public: +	LLSINGLETON(LLUIUsage); +	~LLUIUsage(); +public: +	static std::string sanitized(const std::string& s); +	static void setLLSDPath(LLSD& sd, const std::string& path, S32 max_elts, const LLSD& val); +	static void setLLSDNested(LLSD& sd, const std::vector<std::string>& fields, const LLSD& val); +	void logCommand(const std::string& command); +	void logControl(const std::string& control); +	void logFloater(const std::string& floater); +	void logPanel(const std::string& p); +	LLSD asLLSD() const; +	void clear(); +private: +	std::map<std::string,U32> mCommandCounts; +	std::map<std::string,U32> mControlCounts; +	std::map<std::string,U32> mFloaterCounts; +	std::map<std::string,U32> mPanelCounts; +}; + +#endif // LLUIUIUSAGE.h diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 3ab5c669c4..e400609a74 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -58,6 +58,7 @@  #include "llmultigesture.h"  #include "llui.h"  #include "lluictrlfactory.h" +#include "lluiusage.h"  //  // Globals @@ -566,6 +567,8 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL  	// as soon as we say something, we no longer care about teaching the user  	// how to chat  	gWarningSettings.setBOOL("FirstOtherChatBeforeUser", FALSE); + +	LLUIUsage::instance().logCommand("Chat.Send"); // Pseudo-command  	// Look for "/20 foo" channel chats.  	S32 channel = 0; diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index a6531ed7e1..3a850d4b68 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -67,6 +67,7 @@  #include "llviewerchat.h"  #include "lltranslate.h"  #include "llautoreplace.h" +#include "lluiusage.h"  S32 LLFloaterIMNearbyChat::sLastSpecialChatChannel = 0; @@ -697,6 +698,7 @@ void LLFloaterIMNearbyChat::sendChatFromViewer(const std::string &utf8text, ECha  void LLFloaterIMNearbyChat::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)  { +	LLUIUsage::instance().logCommand("Chat.Send"); // pseuo-command  	// Look for "/20 foo" channel chats.  	S32 channel = 0;  	LLWString out_text = stripChannelNumber(wtext, &channel); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 17777c3ceb..b458582fa8 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -142,6 +142,7 @@  #include "lltoolmgr.h"  #include "lltrans.h"  #include "llui.h" +#include "lluiusage.h"  #include "llurldispatcher.h"  #include "llurlentry.h"  #include "llslurl.h" @@ -2257,6 +2258,8 @@ bool idle_startup()  		gAgentAvatarp->sendHoverHeight(); +		LLUIUsage::instance().clear(); +  		return TRUE;  	} diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 458fc3b13d..0d1b074743 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -116,7 +116,6 @@  #include "llviewerregion.h"  #include "llfloaterregionrestarting.h" -#include <boost/algorithm/string/split.hpp> //  #include <boost/foreach.hpp>  #include "llnotificationmanager.h" // diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 05f88b0a75..314c1a1f1e 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -63,6 +63,7 @@  #include "llsdutil.h"  #include "llcorehttputil.h"  #include "llvoicevivox.h" +#include "lluiusage.h"  namespace LLStatViewer  { @@ -577,6 +578,8 @@ void send_viewer_stats(bool include_preferences)  	fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets;  	fail["missing_updater"] = (S32) LLAppViewer::instance()->isUpdaterMissing(); +	body["ui"] = LLUIUsage::instance().asLLSD(); +		  	body["stats"]["voice"] = LLVoiceVivoxStats::getInstance()->read();  	// Misc stats, two strings and two ints diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp index a2e519a61a..040d0deaf3 100644 --- a/indra/newview/llworldmipmap.cpp +++ b/indra/newview/llworldmipmap.cpp @@ -190,6 +190,8 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32  	//LL_INFOS("WorldMap") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;  	LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); +	LL_INFOS("MAPURL") << "fetching map tile from " << imageurl << LL_ENDL; +  	img->setBoostLevel(LLGLTexture::BOOST_MAP);  	// Return the smart pointer | 
