diff options
| author | Oz Linden <oz@lindenlab.com> | 2013-10-15 17:47:37 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2013-10-15 17:47:37 -0400 | 
| commit | 9c313aea13c70db145d3f2ba840fdc34ed8c8adf (patch) | |
| tree | 72b76053aac0fedf411145b0427b2239971034b1 /indra/newview | |
| parent | 1e32b9dd33fb9e2f0d9a7935a3696b423a191354 (diff) | |
| parent | 8dc273b942ca3bae7469dcbaf7bab171b889eea1 (diff) | |
merge changes for DRTVWR-336
Diffstat (limited to 'indra/newview')
35 files changed, 561 insertions, 150 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 458ec591dc..41aac583d7 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4941,6 +4941,16 @@        <key>Value</key>        <array />      </map> +    <key>LeapPlaybackEventsCommand</key> +    <map> +      <key>Comment</key> +      <string>Command line to use leap to launch playback of event recordings</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>LLSD</string> +      <key>Value</key> +    </map>      <key>LSLFindCaseInsensitivity</key>          <map>          <key>Comment</key> @@ -10444,6 +10454,17 @@        <key>Value</key>        <integer>0</integer>      </map> +    <key>ShowEventRecorderMenuItems</key> +    <map> +      <key>Comment</key> +      <string>Whether or not Event Recorder menu choices - Start / Stop event recording should appear in the (currently) Develop menu</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>0</integer> +    </map>      <key>ShowGestureButton</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 5e8958d7d8..539d186441 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -223,6 +223,10 @@  #include "llmachineid.h"  #include "llmainlooprepeater.h" + +#include "llviewereventrecorder.h" + +  // *FIX: These extern globals should be cleaned up.  // The globals either represent state/config/resource-storage of either   // this app, or another 'component' of the viewer. App globals should be  @@ -696,6 +700,7 @@ LLAppViewer::LLAppViewer() :  LLAppViewer::~LLAppViewer()  {  	delete mSettingsLocationList; +	LLViewerEventRecorder::instance().~LLViewerEventRecorder();  	LLLoginInstance::instance().setUpdaterService(0); @@ -2250,13 +2255,13 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,  		BOOST_FOREACH(const SettingsFile& file, group.files)  		{ -			llinfos << "Attempting to load settings for the group " << file.name() -			    << " - from location " << location_key << llendl; +			LL_INFOS("Settings") << "Attempting to load settings for the group " << file.name() +			    << " - from location " << location_key << LL_ENDL;  			LLControlGroup* settings_group = LLControlGroup::getInstance(file.name);  			if(!settings_group)  			{ -				llwarns << "No matching settings group for name " << file.name() << llendl; +				LL_WARNS("Settings") << "No matching settings group for name " << file.name() << LL_ENDL;  				continue;  			} @@ -2285,7 +2290,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,  			if(settings_group->loadFromFile(full_settings_path, set_defaults, file.persistent))  			{	// success! -				llinfos << "Loaded settings file " << full_settings_path << llendl; +				LL_INFOS("Settings") << "Loaded settings file " << full_settings_path << LL_ENDL;  			}  			else  			{	// failed to load @@ -2299,7 +2304,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,  					// only complain if we actually have a filename at this point  					if (!full_settings_path.empty())  					{ -						llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl; +						LL_INFOS("Settings") << "Cannot load " << full_settings_path << " - No settings found." << LL_ENDL;  					}  				}  			} @@ -2395,8 +2400,6 @@ bool LLAppViewer::initConfiguration()  	gSavedSettings.setString("ClientSettingsFile",           gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global"))); -	gSavedSettings.setString("VersionChannelName", LLVersionInfo::getChannel()); -  #ifndef	LL_RELEASE_FOR_DOWNLOAD  	// provide developer build only overrides for these control variables that are not  	// persisted to settings.xml @@ -2460,8 +2463,8 @@ bool LLAppViewer::initConfiguration()  			gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,   										   clp.getOption("settings")[0]);		  		gSavedSettings.setString("ClientSettingsFile", user_settings_filename); -		llinfos	<< "Using command line specified settings filename: "  -			<< user_settings_filename << llendl; +		LL_INFOS("Settings")	<< "Using command line specified settings filename: "  +			<< user_settings_filename << LL_ENDL;  	}  	// - load overrides from user_settings  @@ -2477,8 +2480,8 @@ bool LLAppViewer::initConfiguration()  	{  		std::string session_settings_filename = clp.getOption("sessionsettings")[0];		  		gSavedSettings.setString("SessionSettingsFile", session_settings_filename); -		llinfos	<< "Using session settings filename: "  -			<< session_settings_filename << llendl; +		LL_INFOS("Settings")	<< "Using session settings filename: "  +			<< session_settings_filename << LL_ENDL;  	}  	loadSettingsFromDirectory("Session"); @@ -2486,8 +2489,8 @@ bool LLAppViewer::initConfiguration()  	{  		std::string user_session_settings_filename = clp.getOption("usersessionsettings")[0];		  		gSavedSettings.setString("UserSessionSettingsFile", user_session_settings_filename); -		llinfos	<< "Using user session settings filename: "  -			<< user_session_settings_filename << llendl; +		LL_INFOS("Settings") << "Using user session settings filename: "  +			<< user_session_settings_filename << LL_ENDL;  	}  	loadSettingsFromDirectory("UserSession"); @@ -2575,6 +2578,10 @@ bool LLAppViewer::initConfiguration()          }      } +    if  (clp.hasOption("logevents")) { +	LLViewerEventRecorder::instance().setEventLoggingOn(); +    } +  	std::string CmdLineChannel(gSavedSettings.getString("CmdLineChannel"));  	if(! CmdLineChannel.empty())      { diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 3cf3c739d9..80a80f4298 100755 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -172,21 +172,20 @@ void ll_nvapi_init(NvDRSSessionHandle hSession)  			nvapi_error(status);  			return;  		} + +        // (5) Now we apply (or save) our changes to the system +        status = NvAPI_DRS_SaveSettings(hSession); +        if (status != NVAPI_OK)  +        { +            nvapi_error(status); +            return; +        }  	}  	else if (status != NVAPI_OK)  	{  		nvapi_error(status);  		return;  	} - -	 - -	// (5) Now we apply (or save) our changes to the system -	status = NvAPI_DRS_SaveSettings(hSession); -	if (status != NVAPI_OK)  -	{ -		nvapi_error(status); -	}  }  //#define DEBUGGING_SEH_FILTER 1 diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index b513a52ff7..70cc48f12b 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -73,6 +73,8 @@  #include "llcallingcard.h"  #include "llslurl.h"			// IDEVO  #include "llsidepanelinventory.h" +#include "llavatarname.h" +#include "llagentui.h"  // static  void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name) @@ -391,6 +393,72 @@ void LLAvatarActions::pay(const LLUUID& id)  	}  } +void LLAvatarActions::teleport_request_callback(const LLSD& notification, const LLSD& response) +{ +	S32 option; +	if (response.isInteger())  +	{ +		option = response.asInteger(); +	} +	else +	{ +		option = LLNotificationsUtil::getSelectedOption(notification, response); +	} + +	if (0 == option) +	{ +		LLMessageSystem* msg = gMessageSystem; + +		msg->newMessageFast(_PREHASH_ImprovedInstantMessage); +		msg->nextBlockFast(_PREHASH_AgentData); +		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + +		msg->nextBlockFast(_PREHASH_MessageBlock); +		msg->addBOOLFast(_PREHASH_FromGroup, FALSE); +		msg->addUUIDFast(_PREHASH_ToAgentID, notification["substitutions"]["uuid"] ); +		msg->addU8Fast(_PREHASH_Offline, IM_ONLINE); +		msg->addU8Fast(_PREHASH_Dialog, IM_TELEPORT_REQUEST); +		msg->addUUIDFast(_PREHASH_ID, LLUUID::null); +		msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary + +		std::string name; +		LLAgentUI::buildFullname(name); + +		msg->addStringFast(_PREHASH_FromAgentName, name); +		msg->addStringFast(_PREHASH_Message, response["message"]); +		msg->addU32Fast(_PREHASH_ParentEstateID, 0); +		msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); +		msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); + +		gMessageSystem->addBinaryDataFast( +				_PREHASH_BinaryBucket, +				EMPTY_BINARY_BUCKET, +				EMPTY_BINARY_BUCKET_SIZE); + +		gAgent.sendReliableMessage(); +	} +} + +// static +void LLAvatarActions::teleportRequest(const LLUUID& id) +{ +	LLSD notification; +	notification["uuid"] = id; +	LLAvatarName av_name; +	if (!LLAvatarNameCache::get(id, &av_name)) +	{ +		// unlikely ... they just picked this name from somewhere... +		LLAvatarNameCache::get(id, boost::bind(&LLAvatarActions::teleportRequest, id)); +		return; // reinvoke this when the name resolves +	} +	notification["NAME"] = av_name.getCompleteName(); + +	LLSD payload; + +	LLNotificationsUtil::add("TeleportRequestPrompt", notification, payload, teleport_request_callback); +} +  // static  void LLAvatarActions::kick(const LLUUID& id)  { diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 6e1198cd09..403414558e 100755 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -111,6 +111,12 @@ public:  	static void pay(const LLUUID& id);  	/** +	 * Request teleport from other avatar +	 */ +	static void teleportRequest(const LLUUID& id); +	static void teleport_request_callback(const LLSD& notification, const LLSD& response); + +	/**  	 * Share items with the avatar.  	 */  	static void share(const LLUUID& id); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 88884042d4..131aea9da3 100755 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -220,18 +220,25 @@ void LLNotificationChiclet::setCounter(S32 counter)  bool LLNotificationChiclet::ChicletNotificationChannel::filterNotification( LLNotificationPtr notification )  { -	if (notification->getName() == "ScriptDialog") +	bool displayNotification; +	if (   (notification->getName() == "ScriptDialog") // special case for scripts +		// if there is no toast window for the notification, filter it +		|| (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID())) +		)  	{ -		return false; +		displayNotification = false;  	} - -	if( !(notification->canLogToIM() && notification->hasFormElements()) -		&& (!notification->getPayload().has("give_inventory_notification") -			|| notification->getPayload()["give_inventory_notification"])) +	else if( !(notification->canLogToIM() && notification->hasFormElements()) +			&& (!notification->getPayload().has("give_inventory_notification") +				|| notification->getPayload()["give_inventory_notification"]))  	{ -		return true; +		displayNotification = true;  	} -	return false; +	else +	{ +		displayNotification = false; +	} +	return displayNotification;  }  ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp index 5ab108b39f..44212298cf 100755 --- a/indra/newview/llconversationloglist.cpp +++ b/indra/newview/llconversationloglist.cpp @@ -313,6 +313,10 @@ void LLConversationLogList::onCustomAction(const LLSD& userdata)  	{  		LLAvatarActions::offerTeleport(selected_conversation_participant_id);  	} +	else if ("request_teleport" == command_name) +	{ +		LLAvatarActions::teleportRequest(selected_conversation_participant_id); +	}  	else if("add_friend" == command_name)  	{  		if (!LLAvatarActions::isFriend(selected_conversation_participant_id)) diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index 192a594c9d..affa24f78c 100755 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -132,6 +132,7 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32  		items.push_back(std::string("view_profile"));  		items.push_back(std::string("im"));  		items.push_back(std::string("offer_teleport")); +		items.push_back(std::string("request_teleport"));  		items.push_back(std::string("voice_call"));  		items.push_back(std::string("chat_history"));  		items.push_back(std::string("separator_chat_history")); diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 21bc747648..90b4490e1d 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -1080,6 +1080,10 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec  		{  			LLAvatarActions::offerTeleport(selectedIDS);  		} +		else if ("request_teleport" == command) +		{ +			LLAvatarActions::teleportRequest(selectedIDS.front()); +		}  		else if ("voice_call" == command)  		{  			LLAvatarActions::startCall(userID); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 6ef4d8717d..8f20d4e082 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2097,7 +2097,6 @@ void LLPanelLandOptions::refresh()  // virtual  void LLPanelLandOptions::draw()  { -	refreshSearch();	// Is this necessary?  JC  	LLPanel::draw();  } @@ -2111,9 +2110,8 @@ void LLPanelLandOptions::refreshSearch()  		mCheckShowDirectory->set(FALSE);  		mCheckShowDirectory->setEnabled(FALSE); -		// *TODO:Translate -		const std::string& none_string = LLParcel::getCategoryUIString(LLParcel::C_NONE); -		mCategoryCombo->setSimple(none_string); +		const std::string& none_string = LLParcel::getCategoryString(LLParcel::C_NONE); +		mCategoryCombo->setValue(none_string);  		mCategoryCombo->setEnabled(FALSE);  		return;  	} @@ -2140,10 +2138,9 @@ void LLPanelLandOptions::refreshSearch()  	mCheckShowDirectory	->set(show_directory);  	// Set by string in case the order in UI doesn't match the order by index. -	// *TODO:Translate  	LLParcel::ECategory cat = parcel->getCategory(); -	const std::string& category_string = LLParcel::getCategoryUIString(cat); -	mCategoryCombo->setSimple(category_string); +	const std::string& category_string = LLParcel::getCategoryString(cat); +	mCategoryCombo->setValue(category_string);  	std::string tooltip;  	bool enable_show_directory = false; diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 50c013a49d..66bf49331b 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -1734,7 +1734,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, void* data)  			LLSD args;  			args["NUM_ADDED"] = llformat("%d",ids.size());  			args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); -			args["LIST_TYPE"] = "Allowed Residents"; +			args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents");  			args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);  			LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);  			delete change_info; @@ -1750,7 +1750,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, void* data)  			LLSD args;  			args["NUM_ADDED"] = llformat("%d",ids.size());  			args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); -			args["LIST_TYPE"] = "Banned Residents"; +			args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents");  			args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);  			LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);  			delete change_info; @@ -2815,9 +2815,10 @@ bool LLDispatchSetEstateAccess::operator()(  		} -		std::string msg = llformat("Banned residents: (%d, max %d)", -									totalBannedAgents, -									ESTATE_MAX_ACCESS_IDS); +		LLStringUtil::format_map_t args; +		args["[BANNEDAGENTS]"] = llformat("%d", totalBannedAgents); +		args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); +		std::string msg = LLTrans::getString("RegionInfoBannedResidents", args);  		panel->getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg));  		if (banned_agent_name_list) @@ -2837,9 +2838,10 @@ bool LLDispatchSetEstateAccess::operator()(  	if (access_flags & ESTATE_ACCESS_MANAGERS)  	{ -		std::string msg = llformat("Estate Managers: (%d, max %d)", -									num_estate_managers, -									ESTATE_MAX_MANAGERS); +		LLStringUtil::format_map_t args; +		args["[ESTATEMANAGERS]"] = llformat("%d", num_estate_managers); +		args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); +		std::string msg = LLTrans::getString("RegionInfoEstateManagers", args);  		panel->getChild<LLUICtrl>("estate_manager_label")->setValue(LLSD(msg));  		LLNameListCtrl* estate_manager_name_list = diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e4fc469bb7..80ef506272 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4739,6 +4739,16 @@ void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string act  			LLAvatarActions::offerTeleport(item->getCreatorUUID());  		}  	} +	else if ("request_lure" == action) +	{ +		LLViewerInventoryItem *item = getItem(); +		if (item && (item->getCreatorUUID() != gAgent.getID()) && +			(!item->getCreatorUUID().isNull())) +		{ +			LLAvatarActions::teleportRequest(item->getCreatorUUID()); +		} +	} +  	else LLItemBridge::performAction(model, action);  } @@ -4825,6 +4835,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		items.push_back(std::string("Send Instant Message Separator"));  		items.push_back(std::string("Send Instant Message"));  		items.push_back(std::string("Offer Teleport...")); +		items.push_back(std::string("Request Teleport..."));  		items.push_back(std::string("Conference Chat"));  		if (!good_card) @@ -4834,6 +4845,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		if (!good_card || !user_online)  		{  			disabled_items.push_back(std::string("Offer Teleport...")); +			disabled_items.push_back(std::string("Request Teleport..."));  			disabled_items.push_back(std::string("Conference Chat"));  		}  	} diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index dea90b9042..08b5eaedbb 100755 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -343,8 +343,11 @@ void LLNetMap::draw()  		// Draw avatars  		for (U32 i = 0; i < avatar_ids.size(); i++)  		{ -			pos_map = globalPosToView(positions[i]);  			LLUUID uuid = avatar_ids[i]; +			// Skip self, we'll draw it later +			if (uuid == gAgent.getID()) continue; + +			pos_map = globalPosToView(positions[i]);  			bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL); diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 2854962922..a3b15931c6 100755 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -90,7 +90,7 @@ bool LLScriptHandler::processNotification(const LLNotificationPtr& notification)  	{  		LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());  	} -	else +	else if (notification->canShowToast())  	{  		LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification); diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 313056f06a..6979ae06e0 100755 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -75,6 +75,7 @@ LLContextMenu* PeopleContextMenu::createMenu()  		registrar.add("Avatar.Pay",				boost::bind(&LLAvatarActions::pay,						id));  		registrar.add("Avatar.BlockUnblock",	boost::bind(&LLAvatarActions::toggleBlock,				id));  		registrar.add("Avatar.InviteToGroup",	boost::bind(&LLAvatarActions::inviteToGroup,			id)); +		registrar.add("Avatar.TeleportRequest",	boost::bind(&PeopleContextMenu::requestTeleport,		this));  		registrar.add("Avatar.Calllog",			boost::bind(&LLAvatarActions::viewChatHistory,			id));  		enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2)); @@ -126,6 +127,7 @@ void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)  		items.push_back(std::string("view_profile"));  		items.push_back(std::string("im"));  		items.push_back(std::string("offer_teleport")); +		items.push_back(std::string("request_teleport"));  		items.push_back(std::string("voice_call"));  		items.push_back(std::string("chat_history"));  		items.push_back(std::string("separator_chat_history")); @@ -256,6 +258,13 @@ bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)  	return false;  } +void PeopleContextMenu::requestTeleport() +{ +	// boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(), +	// so we have to use a wrapper. +	LLAvatarActions::teleportRequest(mUUIDs.front()); +} +  void PeopleContextMenu::offerTeleport()  {  	// boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(), @@ -285,6 +294,7 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)  		items.push_back(std::string("view_profile"));  		items.push_back(std::string("im"));  		items.push_back(std::string("offer_teleport")); +		items.push_back(std::string("request_teleport"));  		items.push_back(std::string("voice_call"));  		items.push_back(std::string("chat_history"));  		items.push_back(std::string("separator_chat_history")); diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 5367eca0d3..945382ebc5 100755 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -47,6 +47,7 @@ private:  	bool enableContextMenuItem(const LLSD& userdata);  	bool checkContextMenuItem(const LLSD& userdata);  	void offerTeleport(); +	void requestTeleport();  };  /** diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 928d26646b..c4d5450e2b 100755 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -207,6 +207,7 @@ LLSD _basic_constraints_ext(X509* cert)  			}  		} +		BASIC_CONSTRAINTS_free( bs );  	}  	return result;  } @@ -268,6 +269,8 @@ LLSD _ext_key_usage_ext(X509* cert)  				ASN1_OBJECT_free(usage);  			}  		} + +		EXTENDED_KEY_USAGE_free( eku );  	}  	return result;  } @@ -280,6 +283,8 @@ LLSD _subject_key_identifier_ext(X509 *cert)  	if(skeyid)  	{  		result = cert_string_from_octet_string(skeyid); + +		ASN1_OCTET_STRING_free( skeyid );  	}  	return result;  } @@ -300,6 +305,9 @@ LLSD _authority_key_identifier_ext(X509* cert)  		{  			result[CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL] = cert_string_from_asn1_integer(akeyid->serial);  		}	 + + +		AUTHORITY_KEYID_free( akeyid );  	}  	// we ignore the issuer name in the authority key identifier, we check the issue name via @@ -1049,6 +1057,8 @@ void LLBasicCertificateStore::validate(int validation_policy,  		throw LLInvalidCertificate((*current_cert));			  	}  	std::string sha1_hash((const char *)cert_x509->sha1_hash, SHA_DIGEST_LENGTH); +	X509_free( cert_x509 ); +	cert_x509 = NULL;  	t_cert_cache::iterator cache_entry = mTrustedCertCache.find(sha1_hash);  	if(cache_entry != mTrustedCertCache.end())  	{ diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 1a3add2bfb..626d69aca4 100755 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -118,6 +118,11 @@ void LLSysWellWindow::removeItemByID(const LLUUID& id)  	}  } + LLPanel * LLSysWellWindow::findItemByID(const LLUUID& id) +{ +       return mMessageList->getItemByValue(id); +} +  //---------------------------------------------------------------------------------  //---------------------------------------------------------------------------------  void LLSysWellWindow::initChannel()  diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index cc5c057d8b..71b41476f5 100755 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -55,6 +55,7 @@ public:  	// Operating with items  	void removeItemByID(const LLUUID& id); +	LLPanel * findItemByID(const LLUUID& id);  	// Operating with outfit  	virtual void setVisible(BOOL visible); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 2fbb3bf868..aa9de076b8 100755 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -687,7 +687,10 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key,  MASK translated_mask, BOOL  	{  		// it is sufficient to set this value once per call to handlekey  		// without clearing it, as it is only used in the subsequent call to scanKey -		mKeyHandledByUI[translated_key] = gViewerWindow->handleKey(translated_key, translated_mask); +		mKeyHandledByUI[translated_key] = gViewerWindow->handleKey(translated_key, translated_mask);  +		// mKeyHandledByUI is not what you think ... this indicates whether the UI has handled this keypress yet (any keypress) +		// NOT whether some UI shortcut wishes to handle the keypress +	    	}  	return mKeyHandledByUI[translated_key];  } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index c096ef3f54..ac2940fcfc 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -40,6 +40,7 @@  #include "llinventorypanel.h"  #include "llnotifications.h"  #include "llnotificationsutil.h" +#include "llviewereventrecorder.h"  // newview includes  #include "llagent.h" @@ -1954,6 +1955,43 @@ class LLAdvancedDropPacket : public view_listener_t  }; +//////////////////// +// EVENT Recorder // +/////////////////// + + +class LLAdvancedViewerEventRecorder : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +		std::string command = userdata.asString(); +		if ("start playback" == command) +		{ +			llinfos << "Event Playback starting" << llendl; +			LLViewerEventRecorder::instance().playbackRecording(); +			llinfos << "Event Playback completed" << llendl; +		} +		else if ("stop playback" == command) +		{ +			// Future +		} +		else if ("start recording" == command) +		{ +			LLViewerEventRecorder::instance().setEventLoggingOn(); +			llinfos << "Event recording started" << llendl; +		} +		else if ("stop recording" == command) +		{ +			LLViewerEventRecorder::instance().setEventLoggingOff(); +			llinfos << "Event recording stopped" << llendl; +		}  + +		return true; +	}		 +}; + + +  /////////////////  // AGENT PILOT // @@ -8422,6 +8460,8 @@ void initialize_menus()  	// Don't prepend MenuName.Foo because these can be used in any menu.  	enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service)); +	enable.add("displayViewerEventRecorderMenuItems",boost::bind(&LLViewerEventRecorder::displayViewerEventRecorderMenuItems,&LLViewerEventRecorder::instance())); +  	view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts");  	enable.add("Conversation.IsConversationLoggingAllowed", boost::bind(&LLFloaterIMContainer::isConversationLoggingAllowed)); @@ -8680,6 +8720,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLAdvancedAgentPilot(), "Advanced.AgentPilot");  	view_listener_t::addMenu(new LLAdvancedToggleAgentPilotLoop(), "Advanced.ToggleAgentPilotLoop");  	view_listener_t::addMenu(new LLAdvancedCheckAgentPilotLoop(), "Advanced.CheckAgentPilotLoop"); +	view_listener_t::addMenu(new LLAdvancedViewerEventRecorder(), "Advanced.EventRecorder");  	// Advanced > Debugging  	view_listener_t::addMenu(new LLAdvancedForceErrorBreakpoint(), "Advanced.ForceErrorBreakpoint"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index c38af1f990..ab9ea5618e 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2220,7 +2220,7 @@ static std::string clean_name_from_im(const std::string& name, EInstantMessage t  	case IM_LURE_ACCEPTED:  	case IM_LURE_DECLINED:  	case IM_GODLIKE_LURE_USER: -	case IM_YET_TO_BE_USED: +	case IM_TELEPORT_REQUEST:  	case IM_GROUP_ELECTION_DEPRECATED:  	//IM_GOTO_URL  	//IM_FROM_TASK_AS_ALERT @@ -2988,6 +2988,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  		break;  	case IM_LURE_USER: +	case IM_TELEPORT_REQUEST:  		{  			if (is_muted)  			{  @@ -3010,7 +3011,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				bool canUserAccessDstRegion = true;  				bool doesUserRequireMaturityIncrease = false; -				if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access)) +				// Do not parse the (empty) lure bucket for TELEPORT_REQUEST +				if (IM_TELEPORT_REQUEST != dialog && parse_lure_bucket(region_info, region_handle, pos, look_at, region_access))  				{  					region_access_str = LLViewerRegion::accessToString(region_access);  					region_access_icn = LLViewerRegion::getAccessIcon(region_access); @@ -3082,12 +3084,22 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				}  				else  				{ -			    LLNotification::Params params("TeleportOffered"); +					LLNotification::Params params; +					if (IM_LURE_USER == dialog) +					{ +						params.name = "TeleportOffered"; +						params.functor.name = "TeleportOffered"; +					} +					else if (IM_TELEPORT_REQUEST == dialog) +					{ +						params.name = "TeleportRequest"; +						params.functor.name = "TeleportRequest"; +					} +  			    params.substitutions = args;  			    params.payload = payload;  			    LLPostponedNotification::add<LLPostponedOfferNotification>(	params, from_id, false);  			} -  			}  		}  		break; @@ -6873,6 +6885,51 @@ void send_group_notice(const LLUUID& group_id,  			bin_bucket_size);  } +void send_lures(const LLSD& notification, const LLSD& response) +{ +	std::string text = response["message"].asString(); +	LLSLURL slurl; +	LLAgentUI::buildSLURL(slurl); +	text.append("\r\n").append(slurl.getSLURLString()); + +	LLMessageSystem* msg = gMessageSystem; +	msg->newMessageFast(_PREHASH_StartLure); +	msg->nextBlockFast(_PREHASH_AgentData); +	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +	msg->nextBlockFast(_PREHASH_Info); +	msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. +	msg->addStringFast(_PREHASH_Message, text); +	for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray(); +		it != notification["payload"]["ids"].endArray(); +		++it) +	{ +		LLUUID target_id = it->asUUID(); + +		msg->nextBlockFast(_PREHASH_TargetData); +		msg->addUUIDFast(_PREHASH_TargetID, target_id); + +		// Record the offer. +		{ +			std::string target_name; +			gCacheName->getFullName(target_id, target_name);  // for im log filenames +			LLSD args; +			args["TO_NAME"] = LLSLURL("agent", target_id, "displayname").getSLURLString();; +	 +			LLSD payload; +				 +			//*TODO please rewrite all keys to the same case, lower or upper +			payload["from_id"] = target_id; +			payload["SUPPRESS_TOAST"] = true; +			LLNotificationsUtil::add("TeleportOfferSent", args, payload); + +			// Add the recepient to the recent people list. +			LLRecentPeople::instance().add(target_id); +		} +	} +	gAgent.sendReliableMessage(); +} +  bool handle_lure_callback(const LLSD& notification, const LLSD& response)  {  	static const unsigned OFFER_RECIPIENT_LIMIT = 250; @@ -6886,50 +6943,12 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)  		LLNotificationsUtil::add("TooManyTeleportOffers", args);  		return false;  	} -	 -	std::string text = response["message"].asString(); -	LLSLURL slurl; -	LLAgentUI::buildSLURL(slurl); -	text.append("\r\n").append(slurl.getSLURLString()); +  	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);  	if(0 == option)  	{ -		LLMessageSystem* msg = gMessageSystem; -		msg->newMessageFast(_PREHASH_StartLure); -		msg->nextBlockFast(_PREHASH_AgentData); -		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -		msg->nextBlockFast(_PREHASH_Info); -		msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. -		msg->addStringFast(_PREHASH_Message, text); -		for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray(); -			it != notification["payload"]["ids"].endArray(); -			++it) -		{ -			LLUUID target_id = it->asUUID(); - -			msg->nextBlockFast(_PREHASH_TargetData); -			msg->addUUIDFast(_PREHASH_TargetID, target_id); - -			// Record the offer. -			{ -				std::string target_name; -				gCacheName->getFullName(target_id, target_name);  // for im log filenames -				LLSD args; -				args["TO_NAME"] = LLSLURL("agent", target_id, "displayname").getSLURLString();; -	 -				LLSD payload; -				 -				//*TODO please rewrite all keys to the same case, lower or upper -				payload["from_id"] = target_id; -				LLNotificationsUtil::add("TeleportOfferSent", args, payload); - -				// Add the recepient to the recent people list. -				LLRecentPeople::instance().add(target_id); -			} -		} -		gAgent.sendReliableMessage(); +		send_lures(notification, response);  	}  	return false; @@ -6969,6 +6988,58 @@ void handle_lure(const uuid_vec_t& ids)  	}  } +bool teleport_request_callback(const LLSD& notification, const LLSD& response) +{ +	LLUUID from_id = notification["payload"]["from_id"].asUUID(); +	if(from_id.isNull()) +	{ +		llwarns << "from_id is NULL" << llendl; +		return false; +	} + +	std::string from_name; +	gCacheName->getFullName(from_id, from_name); + +	if(LLMuteList::getInstance()->isMuted(from_id) && !LLMuteList::getInstance()->isLinden(from_name)) +	{ +		return false; +	} + +	S32 option = 0; +	if (response.isInteger())  +	{ +		option = response.asInteger(); +	} +	else +	{ +		option = LLNotificationsUtil::getSelectedOption(notification, response); +	} + +	switch(option) +	{ +	// Yes +	case 0: +		{ +			LLSD dummy_notification; +			dummy_notification["payload"]["ids"][0] = from_id; + +			LLSD dummy_response; +			dummy_response["message"] = response["message"]; + +			send_lures(dummy_notification, dummy_response); +		} +		break; + +	// No +	case 1: +	default: +		break; +	} + +	return false; +} + +static LLNotificationFunctorRegistration teleport_request_callback_reg("TeleportRequest", teleport_request_callback);  void send_improved_im(const LLUUID& to_id,  							const std::string& name, diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 66615657d8..b4e287c446 100755 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -954,15 +954,17 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)  			objectp = *idle_iter;  			llassert(objectp->isActive());  			objectp->idleUpdate(agent, world, frame_time); - -			} +		}  		//update flexible objects  		LLVolumeImplFlexible::updateClass();  		//update animated textures -		LLViewerTextureAnim::updateClass(); -			} +		if (gAnimateTextures) +		{ +			LLViewerTextureAnim::updateClass(); +		} +	} diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index bf11bce3da..ff7642a773 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -198,6 +198,8 @@  #include "llagentui.h"  #include "llwearablelist.h" +#include "llviewereventrecorder.h" +  #include "llnotifications.h"  #include "llnotificationsutil.h"  #include "llnotificationmanager.h" @@ -954,27 +956,18 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK  			{  				llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl;  			} -			return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down); -		} -		// Topmost view gets a chance before the hierarchy -		//LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); -		//if (top_ctrl) -		//{ -		//	S32 local_x, local_y; -		//	top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); -		//		if (top_ctrl->pointInView(local_x, local_y)) -		//		{ -		//			return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down)	; -		//		} -		//		else -		//		{ -		//		if (down) -		//		{ -		//			gFocusMgr.setTopCtrl(NULL); -		//		} -		//	} -		//} +			BOOL r = mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down);  +			if (r) { + +				lldebugs << "LLViewerWindow::handleAnyMouseClick viewer with mousecaptor calling updatemouseeventinfo - local_x|global x  "<< local_x << " " << x  << "local/global y " << local_y << " " << y << llendl; + +				LLViewerEventRecorder::instance().setMouseGlobalCoords(x,y); +				LLViewerEventRecorder::instance().logMouseEvent(std::string(buttonstatestr),std::string(buttonname));  + +			} +			return r; +		}  		// Mark the click as handled and return if we aren't within the root view to avoid spurious bugs  		if( !mRootView->pointInView(x, y) ) @@ -982,27 +975,44 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window,  LLCoordGL pos, MASK  			return TRUE;  		}  		// Give the UI views a chance to process the click -		if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) ) + +		BOOL r= mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) ; +		if (r)   		{ + +			lldebugs << "LLViewerWindow::handleAnyMouseClick calling updatemouseeventinfo - global x  "<< " " << x	<< "global y " << y	 << "buttonstate: " << buttonstatestr << " buttonname " << buttonname << llendl; + +			LLViewerEventRecorder::instance().setMouseGlobalCoords(x,y); + +			// Clear local coords - this was a click on root window so these are not needed +			// By not including them, this allows the test skeleton generation tool to be smarter when generating code +			// the code generator can be smarter because when local coords are present it can try the xui path with local coords +			// and fallback to global coordinates only if needed.  +			// The drawback to this approach is sometimes a valid xui path will appear to work fine, but NOT interact with the UI element +			// (VITA support not implemented yet or not visible to VITA due to widget further up xui path not being visible to VITA) +			// For this reason it's best to provide hints where possible here by leaving out local coordinates +			LLViewerEventRecorder::instance().setMouseLocalCoords(-1,-1); +			LLViewerEventRecorder::instance().logMouseEvent(buttonstatestr,buttonname);  +  			if (LLView::sDebugMouseHandling)  			{ -				llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl; -			} +				llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLViewerEventRecorder::instance().get_xui()	<< llendl; +			}   			return TRUE; -		} -		else if (LLView::sDebugMouseHandling) -		{ -			llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl; -		} +		} else if (LLView::sDebugMouseHandling) +			{ +				llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl; +			}  	}  	// Do not allow tool manager to handle mouseclicks if we have disconnected	  	if(!gDisconnected && LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) )  	{ +		LLViewerEventRecorder::instance().clear_xui();   		return TRUE;  	} -	 +	  	// If we got this far on a down-click, it wasn't handled.  	// Up-clicks, though, are always handled as far as the OS is concerned.  	BOOL default_rtn = !down; @@ -1373,7 +1383,8 @@ BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key,  MASK mask)  void LLViewerWindow::handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)  {  	LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); -	return gViewerKeyboard.scanKey(key, key_down, key_up, key_level); +	gViewerKeyboard.scanKey(key, key_down, key_up, key_level); +	return; // Be clear this function returns nothing  } @@ -2519,6 +2530,8 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  		||(gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE))  		||(gMenuHolder && gMenuHolder->handleKey(key, mask, TRUE)))  	{ +		lldebugs << "LLviewerWindow::handleKey handle nav keys for nav" << llendl; +		LLViewerEventRecorder::instance().logKeyEvent(key,mask);  		return TRUE;  	} @@ -2533,12 +2546,14 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  			&& keyboard_focus   			&& keyboard_focus->handleKey(key,mask,FALSE))  		{ +			LLViewerEventRecorder::instance().logKeyEvent(key,mask);  			return TRUE;  		}  		if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask))  			||(gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask)))  		{ +			LLViewerEventRecorder::instance().logKeyEvent(key,mask);  			return TRUE;  		}  	} @@ -2548,6 +2563,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  	// if nothing has focus, go to first or last UI element as appropriate  	if (key == KEY_TAB && (mask & MASK_CONTROL || gFocusMgr.getKeyboardFocus() == NULL))  	{ +		llwarns << "LLviewerWindow::handleKey give floaters first chance at tab key " << llendl;  		if (gMenuHolder) gMenuHolder->hideMenus();  		// if CTRL-tabbing (and not just TAB with no focus), go into window cycle mode @@ -2562,11 +2578,13 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  		{  			mRootView->focusNextRoot();  		} +		LLViewerEventRecorder::instance().logKeyEvent(key,mask);  		return TRUE;  	}  	// hidden edit menu for cut/copy/paste  	if (gEditMenu && gEditMenu->handleAcceleratorKey(key, mask))  	{ +		LLViewerEventRecorder::instance().logKeyEvent(key,mask);  		return TRUE;  	} @@ -2606,18 +2624,27 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  		if (keyboard_focus->handleKey(key, mask, FALSE))  		{ + +			lldebugs << "LLviewerWindow::handleKey - in 'traverse up' - no loops seen... just called keyboard_focus->handleKey an it returned true" << llendl; +			LLViewerEventRecorder::instance().logKeyEvent(key,mask);   			return TRUE; +		} else { +			lldebugs << "LLviewerWindow::handleKey - in 'traverse up' - no loops seen... just called keyboard_focus->handleKey an it returned FALSE" << llendl;  		}  	}  	if( LLToolMgr::getInstance()->getCurrentTool()->handleKey(key, mask) )  	{ +		lldebugs << "LLviewerWindow::handleKey toolbar handling?" << llendl; +		LLViewerEventRecorder::instance().logKeyEvent(key,mask);  		return TRUE;  	}  	// Try for a new-format gesture  	if (LLGestureMgr::instance().triggerGesture(key, mask))  	{ +		lldebugs << "LLviewerWindow::handleKey new gesture feature" << llendl; +		LLViewerEventRecorder::instance().logKeyEvent(key,mask);  		return TRUE;  	} @@ -2625,6 +2652,8 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)  	// don't pass it down to the menus.  	if (gGestureList.trigger(key, mask))  	{ +		lldebugs << "LLviewerWindow::handleKey check gesture trigger" << llendl; +		LLViewerEventRecorder::instance().logKeyEvent(key,mask);  		return TRUE;  	} @@ -2673,7 +2702,7 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask)  	// HACK: Numeric keypad <enter> on Mac is Unicode 3  	// HACK: Control-M on Windows is Unicode 13  	if ((uni_char == 13 && mask != MASK_CONTROL) -		|| (uni_char == 3 && mask == MASK_NONE)) +	    || (uni_char == 3 && mask == MASK_NONE) )  	{  		if (mask != MASK_ALT)  		{ @@ -2696,14 +2725,7 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask)  			return TRUE;  		} -		//// Topmost view gets a chance before the hierarchy -		//LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); -		//if (top_ctrl && top_ctrl->handleUnicodeChar( uni_char, FALSE ) ) -		//{ -		//	return TRUE; -		//} - -		return TRUE; +        return TRUE;  	}  	return FALSE; @@ -2712,8 +2734,6 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask)  void LLViewerWindow::handleScrollWheel(S32 clicks)  { -	LLView::sMouseHandlerMessage.clear(); -  	LLUI::resetMouseIdleTimer();  	LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index 28f959eb71..a8e06511d7 100755 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -265,7 +265,9 @@ void LLWindowListener::getPaths(LLSD const & request)  void LLWindowListener::keyDown(LLSD const & evt)  {  	Response response(LLSD(), evt); -	 +	KEY key = getKEY(evt); +	MASK mask = getMask(evt); +  	if (evt.has("path"))  	{  		std::string path(evt["path"]); @@ -280,8 +282,6 @@ void LLWindowListener::keyDown(LLSD const & evt)  			response.setResponse(target_view->getInfo());  			gFocusMgr.setKeyboardFocus(target_view); -			KEY key = getKEY(evt); -			MASK mask = getMask(evt);  			gViewerKeyboard.handleKey(key, mask, false);  			if(key < 0x80) mWindow->handleUnicodeChar(key, mask);  		} @@ -294,7 +294,8 @@ void LLWindowListener::keyDown(LLSD const & evt)  	}  	else   	{ -		mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt)); +		gViewerKeyboard.handleKey(key, mask, false);  +		if(key < 0x80) mWindow->handleUnicodeChar(key, mask);  	}  } diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 5fa380e0e3..bfae142812 100755 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -522,6 +522,17 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID&  			tooltip_fmt.setArg("[AREA]",  llformat("%d", extra));  			tooltip_fmt.setArg("[PRICE]", llformat("%d", extra2)); + +			// Check for division by zero +			if (extra != 0) +			{ +				tooltip_fmt.setArg("[SQMPRICE]", llformat("%.1f", (F32)extra2 / (F32)extra)); +			} +			else +			{ +				tooltip_fmt.setArg("[SQMPRICE]",  LLTrans::getString("Unknown")); +			} +  			new_item.setTooltip(tooltip_fmt.getString());  			if (type == MAP_ITEM_LAND_FOR_SALE) diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 793a6e6fa1..a660e812cc 100755 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1365,7 +1365,7 @@ Only large parcels can be listed in search.                  <combo_box.item                   label="Any Category"                   name="item0" -                 value="any" /> +                 value="none" />                  <combo_box.item                   label="Linden Location"                   name="item1" diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index b3d28788da..31b1d091ee 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -53,6 +53,13 @@          <on_enable function="Avatar.EnableItem" parameter="can_offer_teleport"/>      </menu_item_call>      <menu_item_call +     label="Request teleport" +     layout="topleft" +     name="request_teleport"> +        <on_click function="Avatar.DoToSelected" parameter="request_teleport"/> +        <on_enable function="Avatar.EnableItem" parameter="can_offer_teleport"/> +    </menu_item_call> +    <menu_item_call       label="Voice call"       layout="topleft"       name="voice_call"> diff --git a/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml index 8796b87955..a1a3afbf68 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml @@ -56,6 +56,16 @@        function="Calllog.Enable"        parameter="can_offer_teleport"/>      </menu_item_call> +    <menu_item_call +    label="Request Teleport" +    name="request_teleport"> +      <on_click +       function="Calllog.Action" +       parameter="request_teleport"/> +      <on_enable +      function="Calllog.Enable" +      parameter="can_offer_teleport"/> +    </menu_item_call>      <menu_item_separator />      <menu_item_call       label="Add Friend" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 13dc0b941a..512205ba43 100755 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -591,6 +591,14 @@           parameter="lure" />      </menu_item_call>      <menu_item_call +     label="Request Teleport..." +     layout="topleft" +     name="Request Teleport..."> +        <menu_item_call.on_click +        function="Inventory.DoToSelected" +        parameter="request_lure" /> +    </menu_item_call> +    <menu_item_call       label="Start Conference Chat"       layout="topleft"       name="Conference Chat"> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index 3abb5f7bc8..f12226ebeb 100755 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -29,6 +29,15 @@        parameter="can_offer_teleport"/>      </menu_item_call>      <menu_item_call +    label="Request Teleport" +    name="request_teleport"> +      <menu_item_call.on_click +       function="Avatar.TeleportRequest"/> +      <menu_item_call.on_enable +      function="Avatar.EnableItem" +      parameter="can_offer_teleport"/> +    </menu_item_call> +    <menu_item_call       label="Voice call"       layout="topleft"       name="voice_call"> @@ -134,5 +143,4 @@           function="Avatar.EnableItem"           parameter="can_block" />      </menu_item_check> -    <menu_item_separator />  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index a131d4b8e0..da3ea9bd4c 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2955,6 +2955,34 @@           label="Recorder"           name="Recorder"           tear_off="true"> +            <menu_item_call visible="false" +             label="Start event recording" +             name="Start event recording"> +	      <menu_item_call.on_visible +		 function="displayViewerEventRecorderMenuItems" /> +                <menu_item_call.on_click +                 function="Advanced.EventRecorder" +                 parameter="start recording" /> +            </menu_item_call> +            <menu_item_call visible="false" +             label="Stop event recording" +             name="Stop event recording"> +	      <menu_item_call.on_visible +		 function="displayViewerEventRecorderMenuItems" /> +                <menu_item_call.on_click +                 function="Advanced.EventRecorder" +                 parameter="stop recording" /> +            </menu_item_call> +            <menu_item_call visible="false" +             label="Playback event recording" +             name="Playback event recording"> +	      <menu_item_call.on_visible +		 function="displayViewerEventRecorderMenuItems" /> +                <menu_item_call.on_click +                 function="Advanced.EventRecorder" +                 parameter="start playback" /> +            </menu_item_call> +              <menu_item_call               label="Start Playback"               name="Start Playback"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index dff8335efc..e7c89db069 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4071,6 +4071,27 @@ Join me in [REGION]    <notification     icon="alertmodal.tga" +   name="TeleportRequestPrompt" +   type="alertmodal"> +Request a teleport to [NAME] with the following message +    <tag>confirm</tag> +    <form name="form"> +      <input name="message" type="text"> + +      </input> +      <button +       default="true" +       index="0" +       name="OK" +       text="OK"/> +      <button +       index="1" +       name="Cancel" +       text="Cancel"/> +    </form> +  </notification> +  <notification +   icon="alertmodal.tga"     name="TooManyTeleportOffers"     type="alertmodal">  You attempted to make [OFFERS] teleport offers @@ -6644,7 +6665,7 @@ Your object named <nolink>[OBJECTFROMNAME]</nolink> has given you th     sound="UISndNewIncomingIMSession">  [NAME_SLURL] has offered to teleport you to their location: -“[MESSAGE]” +"[MESSAGE]”  <icon>[MATURITY_ICON]</icon> - [MATURITY_STR]      <tag>confirm</tag>      <form name="form"> @@ -6709,6 +6730,27 @@ However, this region contains content accessible to adults only.  	Teleport offer sent to [TO_NAME]    </notification> +  <notification +   icon="notify.tga" +   name="TeleportRequest" +   log_to_im="true" +   type="offer"> +[NAME_SLURL] is requesting to be teleported to your location. +[MESSAGE] + +Offer a teleport? +    <tag>confirm</tag> +    <form name="form"> +      <button +       index="0" +       name="Yes" +       text="Yes"/> +      <button +       index="1" +       name="No" +       text="No"/> +    </form> +  </notification>    <notification     icon="notify.tga" @@ -6757,7 +6799,6 @@ However, this region contains content accessible to adults only.     icon="notify.tga"     name="FriendshipOffered"     log_to_im="true"    -   show_toast="false"        type="notify">      <tag>friendship</tag>  	You have offered friendship to [TO_NAME] @@ -6807,7 +6848,6 @@ However, this region contains content accessible to adults only.     icon="notify.tga"     name="FriendshipAcceptedByMe"     log_to_im="true"    -   show_toast="false"     type="notify">      <tag>friendship</tag>  Friendship offer accepted. @@ -6817,7 +6857,6 @@ Friendship offer accepted.     icon="notify.tga"     name="FriendshipDeclinedByMe"     log_to_im="true"    -   show_toast="false"        type="notify">      <tag>friendship</tag>  Friendship offer declined. diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index dd2a0c6627..064ece6e4b 100755 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -113,7 +113,7 @@       image_pressed="Pause_Press"       image_pressed_selected="Play_Press"       is_toggle="true" -     left_pad="15" +     left_pad="5"       top="1"       name="media_toggle_btn"       tool_tip="Start/Stop All Media (Music, Video, Web pages)" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 5c23ffa1df..4d7daa1b51 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -387,7 +387,7 @@ Please try logging in again in a minute.</string>  	<!-- world map -->  	<string name="texture_loading">Loading...</string>  	<string name="worldmap_offline">Offline</string> -	<string name="worldmap_item_tooltip_format">[AREA] m² L$[PRICE]</string> +	<string name="worldmap_item_tooltip_format">[AREA] m² L$[PRICE] ([SQMPRICE] L$/m²)</string>  	<string name="worldmap_results_none_found">None found.</string>  	<!-- animations uploading status codes --> @@ -2472,7 +2472,11 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale  		all estates that you manage for [OWNER]  	</string>  	<string name="RegionInfoAllowedResidents">Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])</string> -	<string name="RegionInfoAllowedGroups">Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string> +	<string name="RegionInfoAllowedGroups">Allowed Groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string> +	<string name="RegionInfoEstateManagers">Estate Managers: ([ESTATEMANAGERS], max [MAXMANAGERS])</string> +	<string name="RegionInfoBannedResidents">Banned Residents: ([BANNEDAGENTS], max [MAXBANNED])</string> +	<string name="RegionInfoListTypeAllowedAgents">Allowed Residents</string> +	<string name="RegionInfoListTypeBannedAgents">Banned Residents</string>  	<!-- script limits floater -->  	<string name="ScriptLimitsParcelScriptMemory">Parcel Script Memory</string> | 
