diff options
Diffstat (limited to 'indra/newview')
106 files changed, 1681 insertions, 524 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2d3c885522..674923e88d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4515,28 +4515,6 @@        <key>Value</key>        <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>      </map> -    <key>WebProfileURL</key> -    <map> -      <key>Comment</key> -      <string>URL for Web Profiles</string> -      <key>Persist</key> -      <integer>0</integer> -      <key>Type</key> -      <string>String</string> -      <key>Value</key> -      <string>https://my.secondlife.com/[AGENT_NAME]</string> -    </map> -	<key>WebProfileNonProductionURL</key> -	<map> -		<key>Comment</key> -		<string>URL for Web Profiles on Non-Production grids</string> -		<key>Persist</key> -		<integer>0</integer> -		<key>Type</key> -		<string>String</string> -		<key>Value</key> -		<string>https://my-demo.secondlife.com/[AGENT_NAME]</string> -	</map>      <key>HighResSnapshot</key>      <map>        <key>Comment</key> @@ -4881,7 +4859,7 @@      <key>InventoryTrashMaxCapacity</key>      <map>          <key>Comment</key> -        <string>Maximum capacity of the Trash folder. User will ve offered to clean it up when exceeded.</string> +        <string>Maximum capacity of the Trash folder. User will be offered to clean it up when exceeded.</string>          <key>Persist</key>          <integer>1</integer>          <key>Type</key> @@ -7951,6 +7929,17 @@        <key>Value</key>        <integer>100000</integer>      </map> +    <key>PrimTextMaxDrawDistance</key> +    <map> +      <key>Comment</key> +      <string>Maximum draw distance beyond which PRIM_TEXT won't be rendered</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>64.0</real> +    </map>      <key>ProbeHardwareOnStartup</key>      <map>        <key>Comment</key> @@ -10103,6 +10092,17 @@      <key>Value</key>      <integer>10</integer>    </map> +  <key>ComplexityChangesPopUpDelay</key> +  <map> +    <key>Comment</key> +    <string>Delay before viewer will show avatar complexity notice again</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>300</integer> +  </map>    <key>RenderAvatarMaxComplexity</key>    <map>      <key>Comment</key> @@ -10115,6 +10115,50 @@      <key>Value</key>      <integer>0</integer>    </map> +  <key>RenderHUDObjectsWarning</key> +  <map> +    <key>Comment</key> +    <string>Viewer will warn user about HUD containing to many objects if objects count is above this value</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>1000</integer> +  </map> +  <key>RenderHUDTexturesWarning</key> +  <map> +    <key>Comment</key> +    <string>Viewer will warn user about HUD containing to many textures if texture count is above this value</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>200</integer> +  </map> +  <key>RenderHUDOversizedTexturesWarning</key> +  <map> +    <key>Comment</key> +    <string>How many textures with size 1024 * 1024 or bigger HUD can contain before notifying user</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>6</integer> +  </map> +  <key>RenderHUDTexturesVirtualMemoryWarning</key> +  <map> +    <key>Comment</key> +    <string>Viewer will warn user about HUD textures using memory above this value (Virtual memory, in pixels)</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>U32</string> +    <key>Value</key> +    <integer>10000000</integer> +  </map>    <key>RenderAutoMuteSurfaceAreaLimit</key>    <map>      <key>Comment</key> @@ -10229,6 +10273,17 @@        <key>Value</key>        <real>1.0</real>      </map> +    <key>RenderRiggedFactorMultiplier</key> +    <map> +      <key>Comment</key> +      <string>Affects level of detail for worn rigged meshes</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>6.5</real> +    </map>      <key>RenderWater</key>      <map>        <key>Comment</key> @@ -12803,6 +12858,17 @@        <key>Value</key>        <real>1.0</real>      </map> +    <key>LastSystemUIScaleFactor</key> +    <map> +      <key>Comment</key> +      <string>Size of system UI during last run. On Windows 100% (96 DPI) system setting is 1.0 UI size</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>F32</string> +      <key>Value</key> +      <real>1.0</real> +    </map>      <key>UIScrollbarSize</key>      <map>        <key>Comment</key> @@ -13298,6 +13364,17 @@        <key>Value</key>        <string>1</string>      </map> +    <key>UpdaterShowReleaseNotes</key> +    <map> +        <key>Comment</key> +        <string>Enables displaying of the Release notes in a web floater after update.</string> +        <key>Persist</key> +        <integer>1</integer> +        <key>Type</key> +        <string>Boolean</string> +        <key>Value</key> +        <integer>1</integer> +    </map>      <key>UploadBakedTexOld</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d933537d2e..6a1215c3af 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3191,7 +3191,7 @@ void LLAgent::initOriginGlobal(const LLVector3d &origin_global)  }  BOOL LLAgent::leftButtonGrabbed() const	 -{ +{   	const BOOL camera_mouse_look = gAgentCamera.cameraMouselook();  	return (!camera_mouse_look && mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0)   		|| (camera_mouse_look && mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0) @@ -3199,13 +3199,6 @@ BOOL LLAgent::leftButtonGrabbed() const  		|| (camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0);  } -BOOL LLAgent::leftButtonBlocked() const -{ -    const BOOL camera_mouse_look = gAgentCamera.cameraMouselook(); -    return (!camera_mouse_look && mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0) -        || (camera_mouse_look && mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0); -} -  BOOL LLAgent::rotateGrabbed() const		  {   	return (mControlsTakenCount[CONTROL_YAW_POS_INDEX] > 0) @@ -3663,14 +3656,7 @@ BOOL LLAgent::anyControlGrabbed() const  BOOL LLAgent::isControlGrabbed(S32 control_index) const  { -    if (gAgent.mControlsTakenCount[control_index] > 0) -        return TRUE; -    return gAgent.mControlsTakenPassedOnCount[control_index] > 0; -} - -BOOL LLAgent::isControlBlocked(S32 control_index) const -{ -    return mControlsTakenCount[control_index] > 0; +	return mControlsTakenCount[control_index] > 0;  }  void LLAgent::forceReleaseControls() @@ -3895,11 +3881,17 @@ void LLAgent::handleTeleportFinished()  		mIsMaturityRatingChangingDuringTeleport = false;  	} -    // Init SLM Marketplace connection so we know which UI should be used for the user as a merchant -    // Note: Eventually, all merchant will be migrated to the new SLM system and there will be no reason to show the old UI at all. -    // Note: Some regions will not support the SLM cap for a while so we need to do that check for each teleport. -    // *TODO : Suppress that line from here once the whole grid migrated to SLM and move it to idle_startup() (llstartup.cpp) -    check_merchant_status(); +    if (mRegionp) +    { +        if (mRegionp->capabilitiesReceived()) +        { +            onCapabilitiesReceivedAfterTeleport(); +        } +        else +        { +            mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::onCapabilitiesReceivedAfterTeleport)); +        } +    }  }  void LLAgent::handleTeleportFailed() @@ -3931,6 +3923,14 @@ void LLAgent::handleTeleportFailed()  	}  } +/*static*/ +void LLAgent::onCapabilitiesReceivedAfterTeleport() +{ + +    check_merchant_status(); +} + +  void LLAgent::teleportRequest(  	const U64& region_handle,  	const LLVector3& pos_local, diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 3a533c2cba..b5da5e9062 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -444,8 +444,7 @@ private:  	// Grab  	//--------------------------------------------------------------------  public: -    BOOL 			leftButtonGrabbed() const; -    BOOL 			leftButtonBlocked() const; +	BOOL 			leftButtonGrabbed() const;  	BOOL 			rotateGrabbed() const;  	BOOL 			forwardGrabbed() const;  	BOOL 			backwardGrabbed() const; @@ -462,9 +461,8 @@ public:  	BOOL			controlFlagsDirty() const;  	void			enableControlFlagReset();  	void 			resetControlFlags(); -	BOOL			anyControlGrabbed() const; 		// True if a script has taken over any control -    BOOL			isControlGrabbed(S32 control_index) const; // True if a script has taken over a control -    BOOL			isControlBlocked(S32 control_index) const; // Control should be ignored or won't be passed +	BOOL			anyControlGrabbed() const; 		// True iff a script has taken over a control +	BOOL			isControlGrabbed(S32 control_index) const;  	// Send message to simulator to force grabbed controls to be  	// released, in case of a poorly written script.  	void			forceReleaseControls(); @@ -676,6 +674,8 @@ private:  	void            handleTeleportFinished();  	void            handleTeleportFailed(); +    static void     onCapabilitiesReceivedAfterTeleport(); +  	//--------------------------------------------------------------------  	// Teleport State  	//-------------------------------------------------------------------- diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index b76a66ab39..170e4063a1 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -62,23 +62,37 @@ using namespace LLAvatarAppearanceDefines;  /////////////////////////////////////////////////////////////////////////////// -// Callback to wear and start editing an item that has just been created. -void wear_and_edit_cb(const LLUUID& inv_item) +void set_default_permissions(LLViewerInventoryItem* item)  { -	if (inv_item.isNull()) return; -	 -		LLViewerInventoryItem* item = gInventory.getItem(inv_item); -		if (!item) return; - -		LLPermissions perm = item->getPermissions(); +	llassert(item); +	LLPermissions perm = item->getPermissions(); +	if (perm.getMaskNextOwner() != LLFloaterPerms::getNextOwnerPerms("Wearables") +		|| perm.getMaskEveryone() != LLFloaterPerms::getEveryonePerms("Wearables") +		|| perm.getMaskGroup() != LLFloaterPerms::getGroupPerms("Wearables")) +	{  		perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));  		perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));  		perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables")); +  		item->setPermissions(perm);  		item->updateServer(FALSE); -		gInventory.updateItem(item); -		gInventory.notifyObservers(); +	} +} + +// Callback to wear and start editing an item that has just been created. +void wear_and_edit_cb(const LLUUID& inv_item) +{ +	if (inv_item.isNull()) return; +	 +	LLViewerInventoryItem* item = gInventory.getItem(inv_item); +	if (!item) return; + +	set_default_permissions(item); + +	// item was just created, update even if permissions did not changed +	gInventory.updateItem(item); +	gInventory.notifyObservers();  	// Request editing the item after it gets worn.  	gAgentWearables.requestEditingWearable(inv_item); @@ -94,13 +108,8 @@ void wear_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables")); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables")); -			item->setPermissions(perm); +			set_default_permissions(item); -			item->updateServer(FALSE);  			gInventory.updateItem(item);  			gInventory.notifyObservers();  		} @@ -253,6 +262,7 @@ void LLAgentWearables::AddWearableToAgentInventoryCallback::fire(const LLUUID& i  	{  		LLAppearanceMgr::instance().addCOFItemLink(inv_item,   			new LLUpdateAppearanceAndEditWearableOnDestroy(inv_item), mDescription); +		editWearable(inv_item);  	}  } @@ -423,7 +433,7 @@ void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,  	// old_wearable may still be referred to by other inventory items. Revert  	// unsaved changes so other inventory items aren't affected by the changes  	// that were just saved. -	old_wearable->revertValues(); +	old_wearable->revertValuesWithoutUpdate();  }  void LLAgentWearables::revertWearable(const LLWearableType::EType type, const U32 index) @@ -1364,6 +1374,30 @@ void LLAgentWearables::findAttachmentsAddRemoveInfo(LLInventoryModel::item_array  	// LL_INFOS() << "remove " << remove_count << " add " << add_count << LL_ENDL;  } +std::vector<LLViewerObject*> LLAgentWearables::getTempAttachments() +{ +	llvo_vec_t temp_attachs; +	if (isAgentAvatarValid()) +	{ +		for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); iter != gAgentAvatarp->mAttachmentPoints.end();) +		{ +			LLVOAvatar::attachment_map_t::iterator curiter = iter++; +			LLViewerJointAttachment* attachment = curiter->second; +			for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); +				attachment_iter != attachment->mAttachedObjects.end(); +				++attachment_iter) +			{ +				LLViewerObject *objectp = (*attachment_iter); +				if (objectp && objectp->isTempAttachment()) +				{ +					temp_attachs.push_back(objectp); +				} +			} +		} +	} +	return temp_attachs; +} +  void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remove)  {  	if (!isAgentAvatarValid()) return; diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index 1004482020..b27698fd8f 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -185,6 +185,8 @@ public:  	static void		userRemoveMultipleAttachments(llvo_vec_t& llvo_array);  	static void		userAttachMultipleAttachments(LLInventoryModel::item_array_t& obj_item_array); +	static llvo_vec_t getTempAttachments(); +  	//--------------------------------------------------------------------  	// Signals  	//-------------------------------------------------------------------- diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 9f07ebdc40..1b50a3fbfd 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1875,15 +1875,15 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id)  		return false;  	} -	// Check whether the outfit contains any wearables we aren't wearing already (STORM-702). +	// Check whether the outfit contains any wearables  	LLInventoryModel::cat_array_t cats;  	LLInventoryModel::item_array_t items; -	LLFindWearablesEx is_worn(/*is_worn=*/ false, /*include_body_parts=*/ true); +	LLFindWearables is_wearable;  	gInventory.collectDescendentsIf(outfit_cat_id,  		cats,  		items,  		LLInventoryModel::EXCLUDE_TRASH, -		is_worn); +		is_wearable);  	return items.size() > 0;  } @@ -3969,6 +3969,10 @@ void LLAppearanceMgr::setAttachmentInvLinkEnable(bool val)  	LL_DEBUGS("Avatar") << "setAttachmentInvLinkEnable => " << (int) val << LL_ENDL;  	mAttachmentInvLinkEnabled = val;  } +boost::signals2::connection LLAppearanceMgr::setAttachmentsChangedCallback(attachments_changed_callback_t cb) +{ +	return mAttachmentsChangeSignal.connect(cb); +}  void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)  { @@ -3995,6 +3999,8 @@ void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)  	gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);  	LLAttachmentsMgr::instance().onAttachmentArrived(item_id); + +	mAttachmentsChangeSignal();  }  void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id) @@ -4015,6 +4021,8 @@ void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id)  	{  		//LL_INFOS() << "no link changes, inv link not enabled" << LL_ENDL;  	} + +	mAttachmentsChangeSignal();  }  BOOL LLAppearanceMgr::getIsInCOF(const LLUUID& obj_id) const diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 2e570b9188..f0d3f80f59 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -229,6 +229,10 @@ public:  	void setAppearanceServiceURL(const std::string& url) { mAppearanceServiceURL = url; }  	std::string getAppearanceServiceURL() const; +	typedef boost::function<void ()> attachments_changed_callback_t; +	typedef boost::signals2::signal<void ()> attachments_changed_signal_t; +	boost::signals2::connection setAttachmentsChangedCallback(attachments_changed_callback_t cb); +  private: @@ -272,6 +276,8 @@ private:  	LLTimer mInFlightTimer;  	static bool mActive; +	attachments_changed_signal_t		mAttachmentsChangeSignal; +	  	LLUUID mCOFImageID;  	std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 721a7cc00b..7d1e6393ea 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -588,6 +588,7 @@ static void settings_to_globals()  	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");  	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");  	LLVOVolume::sLODFactor				= gSavedSettings.getF32("RenderVolumeLODFactor"); +	LLVOVolume::sRiggedFactorMultiplier	= gSavedSettings.getF32("RenderRiggedFactorMultiplier");  	LLVOVolume::sDistanceFactor			= 1.f-LLVOVolume::sLODFactor * 0.1f;  	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");  	LLVOTree::sTreeFactor				= gSavedSettings.getF32("RenderTreeLODFactor"); @@ -697,7 +698,8 @@ LLAppViewer::LLAppViewer()  	mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),  	mFastTimerLogThread(NULL),  	mUpdater(new LLUpdaterService()), -	mSettingsLocationList(NULL) +	mSettingsLocationList(NULL), +	mIsFirstRun(false)  {  	if(NULL != sInstance)  	{ @@ -1123,17 +1125,23 @@ bool LLAppViewer::init()  #if LL_WINDOWS  	if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())  	{ +		std::string url;  		if (gGLManager.mIsIntel)  		{ -			LLNotificationsUtil::add("IntelOldDriver"); +			url = LLTrans::getString("IntelDriverPage");  		}  		else if (gGLManager.mIsNVIDIA)  		{ -			LLNotificationsUtil::add("NVIDIAOldDriver"); +			url = LLTrans::getString("NvidiaDriverPage");  		}  		else if (gGLManager.mIsATI)  		{ -			LLNotificationsUtil::add("AMDOldDriver"); +			url = LLTrans::getString("AMDDriverPage"); +		} + +		if (!url.empty()) +		{ +			LLNotificationsUtil::add("OldGPUDriver", LLSD().with("URL", url));  		}  	}  #endif @@ -1221,6 +1229,8 @@ bool LLAppViewer::init()          boost::bind(&LLControlGroup::getU32, boost::ref(gSavedSettings), _1),          boost::bind(&LLControlGroup::declareU32, boost::ref(gSavedSettings), _1, _2, _3, LLControlVariable::PERSIST_ALWAYS)); +	showReleaseNotesIfRequired(); +  	return true;  } @@ -2485,7 +2495,10 @@ bool LLAppViewer::initConfiguration()  	if (gSavedSettings.getBOOL("FirstRunThisInstall"))  	{ -		// Note that the "FirstRunThisInstall" settings is currently unused. +		// Set firstrun flag to indicate that some further init actiona should be taken  +		// like determining screen DPI value and so on +		mIsFirstRun = true; +  		gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);  	} @@ -3142,7 +3155,8 @@ bool LLAppViewer::initWindow()  		.min_width(gSavedSettings.getU32("MinWindowWidth"))  		.min_height(gSavedSettings.getU32("MinWindowHeight"))  		.fullscreen(gSavedSettings.getBOOL("FullScreen")) -		.ignore_pixel_depth(ignorePixelDepth); +		.ignore_pixel_depth(ignorePixelDepth) +		.first_run(mIsFirstRun);  	gViewerWindow = new LLViewerWindow(window_params); @@ -5801,6 +5815,20 @@ void LLAppViewer::launchUpdater()  	// LLAppViewer::instance()->forceQuit();  } +/** +* Check if user is running a new version of the viewer. +* Display the Release Notes if it's not overriden by the "UpdaterShowReleaseNotes" setting. +*/ +void LLAppViewer::showReleaseNotesIfRequired() +{ +	if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion +		&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes") +		&& !gSavedSettings.getBOOL("FirstLoginThisInstall")) +	{ +		LLSD info(getViewerInfo()); +		LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]); +	} +}  //virtual  void LLAppViewer::setMasterSystemAudioMute(bool mute) diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index b5e674bd7b..d4af2440be 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -254,6 +254,8 @@ private:      void sendLogoutRequest();      void disconnectViewer(); + +	void showReleaseNotesIfRequired();  	// *FIX: the app viewer class should be some sort of singleton, no?  	// Perhaps its child class is the singleton and this should be an abstract base. @@ -316,6 +318,7 @@ private:  	// llcorehttp library init/shutdown helper  	LLAppCoreHttp mAppCoreHttp; +	bool mIsFirstRun;  	//---------------------------------------------  	//*NOTE: Mani - legacy updater stuff  	// Still useable? diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 4786f83bfd..febcfe1f61 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -231,6 +231,8 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,  	DWORD heap_enable_lfh_error[MAX_HEAPS];  	S32 num_heaps = 0; +	LLWindowWin32::setDPIAwareness(); +  #if WINDOWS_CRT_MEM_CHECKS && !INCLUDE_VLD  	_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); // dump memory leaks on exit  #elif 0 @@ -569,7 +571,7 @@ bool LLAppViewerWin32::initHardwareTest()  	// Do driver verification and initialization based on DirectX  	// hardware polling and driver versions  	// -	if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe")) +	if (TRUE == gSavedSettings.getBOOL("ProbeHardwareOnStartup") && FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))  	{  		// per DEV-11631 - disable hardware probing for everything  		// but vram. diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index a6e745448a..7b8c630837 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -950,15 +950,22 @@ bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NUL  	const std::set<LLFolderViewItem*> inventory_selected = root_folder->getSelectionList();  	if (inventory_selected.empty()) return false; // nothing selected +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	bool can_share = true;  	std::set<LLFolderViewItem*>::const_iterator it = inventory_selected.begin();  	const std::set<LLFolderViewItem*>::const_iterator it_end = inventory_selected.end();  	for (; it != it_end; ++it)  	{ -		LLViewerInventoryCategory* inv_cat = gInventory.getCategory(static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID()); -		// any category can be offered. +		LLUUID cat_id = static_cast<LLFolderViewModelItemInventory*>((*it)->getViewModelItem())->getUUID(); +		LLViewerInventoryCategory* inv_cat = gInventory.getCategory(cat_id); +		// any category can be offered if it's not in trash.  		if (inv_cat)  		{ +			if ((cat_id == trash_id) || gInventory.isObjectDescendentOf(cat_id, trash_id)) +			{ +				can_share = false; +				break; +			}  			continue;  		} diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp index 24934fdb73..f7a1ef1621 100644 --- a/indra/newview/llavatarrendernotifier.cpp +++ b/indra/newview/llavatarrendernotifier.cpp @@ -51,6 +51,11 @@ static const F32 RENDER_ALLOWED_CHANGE_PCT = 0.1;  // wait seconds before processing over limit updates after last complexity change  static const U32 OVER_LIMIT_UPDATE_DELAY = 70; +static const U32 WARN_HUD_OBJECTS_LIMIT = 1000; +static const U32 WARN_HUD_TEXTURES_LIMIT = 200; +static const U32 WARN_HUD_OVERSIZED_TEXTURES_LIMIT = 6; +static const U32 WARN_HUD_TEXTURE_MEMORY_LIMIT = 10000000; // in pixels +  LLAvatarRenderNotifier::LLAvatarRenderNotifier() :  mAgentsCount(0), @@ -264,3 +269,128 @@ void LLAvatarRenderNotifier::updateNotificationAgent(U32 agentComplexity)      }  } +// LLHUDRenderNotifier + +LLHUDRenderNotifier::LLHUDRenderNotifier() +{ +} + +LLHUDRenderNotifier::~LLHUDRenderNotifier() +{ +} + +void LLHUDRenderNotifier::updateNotificationHUD(LLHUDComplexity new_complexity) +{ +    if (!isAgentAvatarValid()) +    { +        // data not ready. +        return; +    } + +    static const char* hud_memory = "hud_render_memory_warning"; +    static const char* hud_cost = "hud_render_cost_warning"; +    static const char* hud_heavy = "hud_render_heavy_textures_warning"; +    static const char* hud_cramped = "hud_render_cramped_warning"; +    static const char* hud_textures = "hud_render_textures_warning"; + +    static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAvatarMaxComplexity", 0U); // ties max HUD cost to avatar cost +    static LLCachedControl<U32> max_objects_count(gSavedSettings, "RenderHUDObjectsWarning", WARN_HUD_OBJECTS_LIMIT); +    static LLCachedControl<U32> max_textures_count(gSavedSettings, "RenderHUDTexturesWarning", WARN_HUD_TEXTURES_LIMIT); +    static LLCachedControl<U32> max_oversized_count(gSavedSettings, "RenderHUDOversizedTexturesWarning", WARN_HUD_OVERSIZED_TEXTURES_LIMIT); +    static LLCachedControl<U32> max_texture_memory(gSavedSettings, "RenderHUDTexturesVirtualMemoryWarning", WARN_HUD_TEXTURE_MEMORY_LIMIT); + +    if (mHUDPopUpDelayTimer.hasExpired()) +    { +        // Show warning with highest importance (5m delay between warnings by default) +        // TODO: +        // Consider showing message with list of issues. +        // For now shows one after another if update arrives and timer expired, so +        // consider showing only one most important or consider triggering not +        // only in case of update +        if (mReportedHUDComplexity.texturesSizeTotal < new_complexity.texturesSizeTotal +            && new_complexity.texturesSizeTotal > max_texture_memory) +        { +            displayHUDNotification(hud_memory); +            LL_DEBUGS("HUDdetail") << "HUD memory usage over limit," +                                   << " was " << mReportedHUDComplexity.texturesSizeTotal +                                   << " is " << new_complexity.texturesSizeTotal << LL_ENDL; +            mReportedHUDComplexity.texturesSizeTotal = new_complexity.texturesSizeTotal; +        } +        else if ((mReportedHUDComplexity.objectsCost < new_complexity.objectsCost +            || mReportedHUDComplexity.texturesCost < new_complexity.texturesCost) +            && max_render_cost > 0 +            && new_complexity.objectsCost + new_complexity.texturesCost > max_render_cost) +        { +            LL_DEBUGS("HUDdetail") << "HUD complexity over limit," +                                   << " HUD textures cost: " << new_complexity.texturesCost +                                   << " HUD objects cost: " << new_complexity.objectsCost << LL_ENDL; +            displayHUDNotification(hud_cost); +            mReportedHUDComplexity.objectsCost = new_complexity.objectsCost; +            mReportedHUDComplexity.texturesCost = new_complexity.texturesCost; +        } +        else if (mReportedHUDComplexity.largeTexturesCount < new_complexity.largeTexturesCount +            && new_complexity.largeTexturesCount > max_oversized_count) +        { +            LL_DEBUGS("HUDdetail") << "HUD contains to many large textures: " +                                   << new_complexity.largeTexturesCount << LL_ENDL; +            displayHUDNotification(hud_heavy); +            mReportedHUDComplexity.largeTexturesCount = new_complexity.largeTexturesCount; +        } +        else if (mReportedHUDComplexity.texturesCount < new_complexity.texturesCount +            && new_complexity.texturesCount > max_textures_count) +        { +            LL_DEBUGS("HUDdetail") << "HUD contains too many textures: " +                                   << new_complexity.texturesCount << LL_ENDL; +            displayHUDNotification(hud_cramped); +            mReportedHUDComplexity.texturesCount = new_complexity.texturesCount; +        } +        else if (mReportedHUDComplexity.objectsCount < new_complexity.objectsCount +            && new_complexity.objectsCount > max_objects_count) +        { +            LL_DEBUGS("HUDdetail") << "HUD contains too many objects: " +                                   << new_complexity.objectsCount << LL_ENDL; +            displayHUDNotification(hud_textures); +            mReportedHUDComplexity.objectsCount = new_complexity.objectsCount; +        } +        else +        { +            // all warnings displayed, just store everything so that we will +            // be able to reduce values and show warnings again later +            mReportedHUDComplexity = new_complexity; +        } +    } + +    if (mLatestHUDComplexity.objectsCost != new_complexity.objectsCost +        || mLatestHUDComplexity.objectsCount != new_complexity.objectsCount +        || mLatestHUDComplexity.texturesCost != new_complexity.texturesCost +        || mLatestHUDComplexity.texturesCount != new_complexity.texturesCount +        || mLatestHUDComplexity.largeTexturesCount != new_complexity.largeTexturesCount +        || mLatestHUDComplexity.texturesSizeTotal != new_complexity.texturesSizeTotal) +    { +        LL_INFOS("HUDdetail") << "HUD textures count: " << new_complexity.texturesCount +            << " HUD textures cost: " << new_complexity.texturesCost +            << " Large textures: " << new_complexity.largeTexturesCount +            << " HUD objects cost: " << new_complexity.objectsCost +            << " HUD objects count: " << new_complexity.objectsCount << LL_ENDL; + +        mLatestHUDComplexity = new_complexity; +    } +     +} + +void LLHUDRenderNotifier::displayHUDNotification(const char* message) +{ +    static LLCachedControl<U32> pop_up_delay(gSavedSettings, "ComplexityChangesPopUpDelay", 300); +    static LLCachedControl<U32> expire_delay(gSavedSettings, "ShowMyComplexityChanges", 20); +    LLDate expire_date(LLDate::now().secondsSinceEpoch() + expire_delay); + +    LLSD args; +    args["HUD_REASON"] = LLTrans::getString(message); + +    LLNotifications::instance().add(LLNotification::Params() +        .name("HUDComplexityWarning") +        .expiry(expire_date) +        .substitutions(args)); +    mHUDPopUpDelayTimer.resetWithExpiry(pop_up_delay); +} + diff --git a/indra/newview/llavatarrendernotifier.h b/indra/newview/llavatarrendernotifier.h index 2a2704de28..959bebef02 100644 --- a/indra/newview/llavatarrendernotifier.h +++ b/indra/newview/llavatarrendernotifier.h @@ -33,6 +33,25 @@  class LLViewerRegion; +struct LLHUDComplexity +{ +    LLHUDComplexity() +    { +        objectsCost = 0; +        objectsCount = 0; +        texturesCost = 0; +        texturesCount = 0; +        largeTexturesCount = 0; +        texturesSizeTotal = 0; +    } +    U32 objectsCost; +    U32 objectsCount; +    U32 texturesCost; +    U32 texturesCount; +    U32 largeTexturesCount; +    F64 texturesSizeTotal; +}; +  // Class to notify user about drastic changes in agent's render weights or if other agents  // reported that user's agent is too 'heavy' for their settings  class LLAvatarRenderNotifier : public LLSingleton<LLAvatarRenderNotifier> @@ -81,4 +100,21 @@ private:      S32 mLastOutfitRezStatus;  }; +// Class to notify user about heavy set of HUD +class LLHUDRenderNotifier : public LLSingleton<LLHUDRenderNotifier> +{ +public: +    LLHUDRenderNotifier(); +    ~LLHUDRenderNotifier(); + +    void updateNotificationHUD(LLHUDComplexity new_complexity); + +private: +    void displayHUDNotification(const char* message); + +    LLHUDComplexity mReportedHUDComplexity; +    LLHUDComplexity mLatestHUDComplexity; +    LLFrameTimer mHUDPopUpDelayTimer; +}; +  #endif /* ! defined(LL_llavatarrendernotifier_H) */ diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 00fa6dd979..54c6c985d6 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -311,7 +311,8 @@ LLWString LLChatBar::stripChannelNumber(const LLWString &mesg, S32* channel)  	}  	else if (mesg[0] == '/'  			 && mesg[1] -			 && LLStringOps::isDigit(mesg[1])) +			 && (LLStringOps::isDigit(mesg[1]) +				 || (mesg[1] == '-' && mesg[2] && LLStringOps::isDigit(mesg[2]))))  	{  		// This a special "/20" speak on a channel  		S32 pos = 0; @@ -325,7 +326,7 @@ LLWString LLChatBar::stripChannelNumber(const LLWString &mesg, S32* channel)  			channel_string.push_back(c);  			pos++;  		} -		while(c && pos < 64 && LLStringOps::isDigit(c)); +		while(c && pos < 64 && (LLStringOps::isDigit(c) || (pos == 1 && c == '-')));  		// Move the pointer forward to the first non-whitespace char  		// Check isspace before looping, so we can handle "/33foo" diff --git a/indra/newview/llconversationlog.cpp b/indra/newview/llconversationlog.cpp index 05c7e6caa5..4e69896b69 100644 --- a/indra/newview/llconversationlog.cpp +++ b/indra/newview/llconversationlog.cpp @@ -448,7 +448,12 @@ bool LLConversationLog::moveLog(const std::string &originDirectory, const std::s  std::string LLConversationLog::getFileName()  {  	std::string filename = "conversation"; -	return gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS, filename) + ".log"; +	std::string log_address = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS, filename); +	if (!log_address.empty()) +	{ +		log_address += ".log"; +	} +	return log_address;  }  bool LLConversationLog::saveToFile(const std::string& filename) diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index bababca652..c2d0d9f06b 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -108,6 +108,7 @@ private:  	static const std::string sCheckUpdateListenerName;      static void startFetchServerReleaseNotes(); +    static void fetchServerReleaseNotesCoro(const std::string& cap_url);      static void handleServerReleaseNotes(LLSD results);  }; @@ -224,35 +225,62 @@ void LLFloaterAbout::startFetchServerReleaseNotes()      // an URL suitable for external browsers in the "Location:" HTTP header.      std::string cap_url = region->getCapability("ServerReleaseNotes"); -    LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpGet(cap_url, -        &LLFloaterAbout::handleServerReleaseNotes, &LLFloaterAbout::handleServerReleaseNotes); +    LLCoros::instance().launch("fetchServerReleaseNotesCoro", boost::bind(&LLFloaterAbout::fetchServerReleaseNotesCoro, cap_url));  }  /*static*/ +void LLFloaterAbout::fetchServerReleaseNotesCoro(const std::string& cap_url) +{ +    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t +        httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("fetchServerReleaseNotesCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID)); +    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); +    LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + +    httpOpts->setWantHeaders(true); +    httpOpts->setFollowRedirects(false); + +    LLSD result = httpAdapter->getAndSuspend(httpRequest, cap_url, httpOpts); + +    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; +    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + +    if (!status) +    { +        handleServerReleaseNotes(httpResults); +    } +    else +    { +        handleServerReleaseNotes(result); +    } +} + +/*static*/  void LLFloaterAbout::handleServerReleaseNotes(LLSD results)  { -//     LLFloaterAbout* floater_about = LLFloaterReg::getTypedInstance<LLFloaterAbout>("sl_about"); -//     if (floater_about) -//     { -        LLSD http_headers; -        if (results.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS)) -        { -            LLSD http_results = results[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; -            http_headers = http_results[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS]; -        } -        else -        { -            http_headers = results[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS]; -        } -         -        std::string location = http_headers[HTTP_IN_HEADER_LOCATION].asString(); -        if (location.empty()) -        { -            location = LLTrans::getString("ErrorFetchingServerReleaseNotesURL"); -        } -        LLAppViewer::instance()->setServerReleaseNotesURL(location); -//    } +    LLSD http_headers; +    if (results.has(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS)) +    { +        LLSD http_results = results[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; +        http_headers = http_results[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS]; +    } +    else +    { +        http_headers = results[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS_HEADERS]; +    } + +    std::string location = http_headers[HTTP_IN_HEADER_LOCATION].asString(); +    if (location.empty()) +    { +        location = LLTrans::getString("ErrorFetchingServerReleaseNotesURL"); +    } +    LLAppViewer::instance()->setServerReleaseNotesURL(location); + +    LLFloaterAbout* floater_about = LLFloaterReg::findTypedInstance<LLFloaterAbout>("sl_about"); +    if (floater_about) +    { +        floater_about->setSupportText(location); +    }  }  class LLFloaterAboutListener: public LLEventAPI diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 72892b47a4..aa7bfbfdb7 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -55,6 +55,8 @@  //#include "llsdserialize.h" +static const U32 AVATAR_PICKER_SEARCH_TIMEOUT = 180U; +  //put it back as a member once the legacy path is out?  static std::map<LLUUID, LLAvatarName> sAvatarNameMap; @@ -463,10 +465,13 @@ void LLFloaterAvatarPicker::findCoro(std::string url, LLUUID queryID, std::strin      LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t          httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy));      LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); +    LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions);      LL_INFOS("HttpCoroutineAdapter", "genericPostCoro") << "Generic POST for " << url << LL_ENDL; -    LLSD result = httpAdapter->getAndSuspend(httpRequest, url); +    httpOpts->setTimeout(AVATAR_PICKER_SEARCH_TIMEOUT); + +    LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts);      LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];      LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp index e21a8594bc..91436e52fe 100644 --- a/indra/newview/llfloaterbuycurrency.cpp +++ b/indra/newview/llfloaterbuycurrency.cpp @@ -280,7 +280,7 @@ void LLFloaterBuyCurrencyUI::onClickCancel()  void LLFloaterBuyCurrencyUI::onClickErrorWeb()  { -	LLWeb::loadURLExternal(mManager.errorURI()); +	LLWeb::loadURL(mManager.errorURI());  	closeFloater();  	// Update L$ balance  	LLStatusBar::sendMoneyBalanceRequest(); diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index d842106146..b840d37c4d 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -328,7 +328,7 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur  		element["columns"][0]["font"]["name"] = "SANSSERIF";  		element["columns"][0]["font"]["style"] = font_style; -		std::string key_string = LLKeyboard::stringFromKey(gesture->mKey); +		std::string key_string;  		std::string buffer;  		if (gesture->mKey == KEY_NONE) @@ -338,6 +338,7 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur  		}  		else  		{ +			key_string = LLKeyboard::stringFromKey(gesture->mKey);  			buffer = LLKeyboard::stringFromAccelerator(gesture->mMask,  					gesture->mKey);  		} diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 7a989806a1..257b39a7dd 100644 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -798,7 +798,8 @@ LLWString LLFloaterIMNearbyChat::stripChannelNumber(const LLWString &mesg, S32*  	}  	else if (mesg[0] == '/'  			 && mesg[1] -			 && LLStringOps::isDigit(mesg[1])) +			 && (LLStringOps::isDigit(mesg[1]) +				 || (mesg[1] == '-' && mesg[2] && LLStringOps::isDigit(mesg[2]))))  	{  		// This a special "/20" speak on a channel  		S32 pos = 0; @@ -812,7 +813,7 @@ LLWString LLFloaterIMNearbyChat::stripChannelNumber(const LLWString &mesg, S32*  			channel_string.push_back(c);  			pos++;  		} -		while(c && pos < 64 && LLStringOps::isDigit(c)); +		while(c && pos < 64 && (LLStringOps::isDigit(c) || (pos==1 && c =='-')));  		// Move the pointer forward to the first non-whitespace char  		// Check isspace before looping, so we can handle "/33foo" @@ -837,19 +838,36 @@ LLWString LLFloaterIMNearbyChat::stripChannelNumber(const LLWString &mesg, S32*  void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)  { -	LLMessageSystem* msg = gMessageSystem; -	msg->newMessageFast(_PREHASH_ChatFromViewer); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -	msg->nextBlockFast(_PREHASH_ChatData); -	msg->addStringFast(_PREHASH_Message, utf8_out_text); -	msg->addU8Fast(_PREHASH_Type, type); -	msg->addS32("Channel", channel); - -	gAgent.sendReliableMessage(); - -	add(LLStatViewer::CHAT_COUNT, 1); +    LLMessageSystem* msg = gMessageSystem; + +    if (channel >= 0) +    { +        msg->newMessageFast(_PREHASH_ChatFromViewer); +        msg->nextBlockFast(_PREHASH_AgentData); +        msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); +        msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); +        msg->nextBlockFast(_PREHASH_ChatData); +        msg->addStringFast(_PREHASH_Message, utf8_out_text); +        msg->addU8Fast(_PREHASH_Type, type); +        msg->addS32("Channel", channel); + +    } +    else +    { +        // Hack: ChatFromViewer doesn't allow negative channels +        msg->newMessage("ScriptDialogReply"); +        msg->nextBlock("AgentData"); +        msg->addUUID("AgentID", gAgentID); +        msg->addUUID("SessionID", gAgentSessionID); +        msg->nextBlock("Data"); +        msg->addUUID("ObjectID", gAgentID); +        msg->addS32("ChatChannel", channel); +        msg->addS32("ButtonIndex", 0); +        msg->addString("ButtonLabel", utf8_out_text); +    } + +    gAgent.sendReliableMessage(); +    add(LLStatViewer::CHAT_COUNT, 1);  }  class LLChatCommandHandler : public LLCommandHandler diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 31245db344..dfe462c8d1 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -72,6 +72,8 @@ struct LLGiveMoneyInfo  		mFloater(floater), mAmount(amount){}  }; +typedef boost::shared_ptr<LLGiveMoneyInfo> give_money_ptr; +  ///----------------------------------------------------------------------------  /// Class LLFloaterPay  ///---------------------------------------------------------------------------- @@ -94,18 +96,18 @@ public:  							bool is_group);  	static bool payConfirmationCallback(const LLSD& notification,  										const LLSD& response, -										LLGiveMoneyInfo* info); +										give_money_ptr info);  private:  	static void onCancel(void* data);  	static void onKeystroke(LLLineEditor* editor, void* data); -	static void onGive(void* data); +	static void onGive(give_money_ptr info);  	void give(S32 amount);  	static void processPayPriceReply(LLMessageSystem* msg, void **userdata);  	void finishPayUI(const LLUUID& target_id, BOOL is_group);  protected: -	std::vector<LLGiveMoneyInfo*> mCallbackData; +	std::vector<give_money_ptr> mCallbackData;  	money_callback mCallback;  	LLTextBox* mObjectNameText;  	LLUUID mTargetUUID; @@ -113,7 +115,7 @@ protected:  	BOOL mHaveName;  	LLButton* mQuickPayButton[MAX_PAY_BUTTONS]; -	LLGiveMoneyInfo* mQuickPayInfo[MAX_PAY_BUTTONS]; +	give_money_ptr mQuickPayInfo[MAX_PAY_BUTTONS];  	LLSafeHandle<LLObjectSelection> mObjectSelection;  }; @@ -136,7 +138,11 @@ LLFloaterPay::LLFloaterPay(const LLSD& key)  // Destroys the object  LLFloaterPay::~LLFloaterPay()  { -	std::for_each(mCallbackData.begin(), mCallbackData.end(), DeletePointer()); +    std::vector<give_money_ptr>::iterator iter; +    for (iter = mCallbackData.begin(); iter != mCallbackData.end(); ++iter) +    { +        (*iter)->mFloater = NULL; +    }  	mCallbackData.clear();  	// Name callbacks will be automatically disconnected since LLFloater is trackable @@ -148,40 +154,40 @@ BOOL LLFloaterPay::postBuild()  {  	S32 i = 0; -	LLGiveMoneyInfo* info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_0); +	give_money_ptr info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_0));  	mCallbackData.push_back(info); -	childSetAction("fastpay 1",&LLFloaterPay::onGive,info); +	childSetAction("fastpay 1", boost::bind(LLFloaterPay::onGive, info));  	getChildView("fastpay 1")->setVisible(FALSE);  	mQuickPayButton[i] = getChild<LLButton>("fastpay 1");  	mQuickPayInfo[i] = info;  	++i; -	info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_1); +	info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_1));  	mCallbackData.push_back(info); -	childSetAction("fastpay 5",&LLFloaterPay::onGive,info); +	childSetAction("fastpay 5", boost::bind(LLFloaterPay::onGive, info));  	getChildView("fastpay 5")->setVisible(FALSE);  	mQuickPayButton[i] = getChild<LLButton>("fastpay 5");  	mQuickPayInfo[i] = info;  	++i; -	info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_2); +	info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_2));  	mCallbackData.push_back(info); -	childSetAction("fastpay 10",&LLFloaterPay::onGive,info); +	childSetAction("fastpay 10", boost::bind(LLFloaterPay::onGive, info));  	getChildView("fastpay 10")->setVisible(FALSE);  	mQuickPayButton[i] = getChild<LLButton>("fastpay 10");  	mQuickPayInfo[i] = info;  	++i; -	info = new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_3); +	info = give_money_ptr(new LLGiveMoneyInfo(this, PAY_BUTTON_DEFAULT_3));  	mCallbackData.push_back(info); -	childSetAction("fastpay 20",&LLFloaterPay::onGive,info); +	childSetAction("fastpay 20", boost::bind(LLFloaterPay::onGive, info));  	getChildView("fastpay 20")->setVisible(FALSE);  	mQuickPayButton[i] = getChild<LLButton>("fastpay 20"); @@ -195,10 +201,10 @@ BOOL LLFloaterPay::postBuild()  	getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this);  	getChild<LLLineEditor>("amount")->setPrevalidate(LLTextValidate::validateNonNegativeS32); -	info = new LLGiveMoneyInfo(this, 0); +	info = give_money_ptr(new LLGiveMoneyInfo(this, 0));  	mCallbackData.push_back(info); -	childSetAction("pay btn",&LLFloaterPay::onGive,info); +	childSetAction("pay btn", boost::bind(LLFloaterPay::onGive, info));  	setDefaultBtn("pay btn");  	getChildView("pay btn")->setVisible(FALSE);  	getChildView("pay btn")->setEnabled(FALSE); @@ -415,9 +421,9 @@ void LLFloaterPay::payDirectly(money_callback callback,  	floater->finishPayUI(target_id, is_group);  } -bool LLFloaterPay::payConfirmationCallback(const LLSD& notification, const LLSD& response, LLGiveMoneyInfo* info) +bool LLFloaterPay::payConfirmationCallback(const LLSD& notification, const LLSD& response, give_money_ptr info)  { -	if (!info || !info->mFloater) +	if (!info.get() || !info->mFloater)  	{  		return false;  	} @@ -479,54 +485,61 @@ void LLFloaterPay::onKeystroke(LLLineEditor*, void* data)  }  // static -void LLFloaterPay::onGive(void* data) +void LLFloaterPay::onGive(give_money_ptr info)  { -	LLGiveMoneyInfo* info = reinterpret_cast<LLGiveMoneyInfo*>(data); -	LLFloaterPay* floater = info->mFloater; -	if(info && floater) -	{ -		S32 amount = info->mAmount; -		if(amount == 0) -		{ -			amount = atoi(floater->getChild<LLUICtrl>("amount")->getValue().asString().c_str()); -		} -		if (amount > PAY_AMOUNT_NOTIFICATION && gStatusBar && gStatusBar->getBalance() > amount) -		{ -			LLUUID payee_id = LLUUID::null; -			BOOL is_group = false; -			if (floater->mObjectSelection.notNull()) -			{ -				LLSelectNode* node = floater->mObjectSelection->getFirstRootNode(); -				if (node) -				{ -					node->mPermissions->getOwnership(payee_id, is_group); -				} -				else -				{ -					// object no longer exists -					LLNotificationsUtil::add("PayObjectFailed"); -					floater->closeFloater(); -					return; -				} -			} -			else -			{ -				is_group = floater->mTargetIsGroup; -				payee_id = floater->mTargetUUID; -			} - -			LLSD args; -			args["TARGET"] = LLSLURL( is_group ? "group" : "agent", payee_id, "completename").getSLURLString(); -			args["AMOUNT"] = amount; - -			LLNotificationsUtil::add("PayConfirmation", args, LLSD(), boost::bind(&LLFloaterPay::payConfirmationCallback, _1, _2, info)); -		} -		else -		{ -			floater->give(amount); -			floater->closeFloater(); -		} -	} +    if (!info.get() || !info->mFloater) +    { +        return; +    } + +    LLFloaterPay* floater = info->mFloater; +    S32 amount = info->mAmount; +    if (amount == 0) +    { +        LLUICtrl* text_field = floater->getChild<LLUICtrl>("amount"); +        if (!text_field) +        { +            return; +        } +        amount = atoi(text_field->getValue().asString().c_str()); +    } + +    if (amount > PAY_AMOUNT_NOTIFICATION && gStatusBar && gStatusBar->getBalance() > amount) +    { +        LLUUID payee_id = LLUUID::null; +        BOOL is_group = false; +        if (floater->mObjectSelection.notNull()) +        { +            LLSelectNode* node = floater->mObjectSelection->getFirstRootNode(); +            if (node) +            { +                node->mPermissions->getOwnership(payee_id, is_group); +            } +            else +            { +                // object no longer exists +                LLNotificationsUtil::add("PayObjectFailed"); +                floater->closeFloater(); +                return; +            } +        } +        else +        { +            is_group = floater->mTargetIsGroup; +            payee_id = floater->mTargetUUID; +        } + +        LLSD args; +        args["TARGET"] = LLSLURL(is_group ? "group" : "agent", payee_id, "completename").getSLURLString(); +        args["AMOUNT"] = amount; + +        LLNotificationsUtil::add("PayConfirmation", args, LLSD(), boost::bind(&LLFloaterPay::payConfirmationCallback, _1, _2, info)); +    } +    else +    { +        floater->give(amount); +        floater->closeFloater(); +    }  }  void LLFloaterPay::give(S32 amount) diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 36bdcf4d89..75f5e87a2b 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1232,6 +1232,9 @@ void LLFloaterPreference::refreshEnabledState()  						(ctrl_wind_light->get()) ? TRUE : FALSE;  	ctrl_deferred->setEnabled(enabled); + +	// Cannot have floater active until caps have been received +	getChild<LLButton>("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);  }  void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState() @@ -1369,9 +1372,6 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()  	disableUnavailableSettings();  	getChildView("block_list")->setEnabled(LLLoginInstance::getInstance()->authSuccess()); - -	// Cannot have floater active until caps have been received -	getChild<LLButton>("default_creation_permissions")->setEnabled(LLStartUp::getStartupState() < STATE_STARTED ? false : true);  }  // static @@ -1411,7 +1411,7 @@ void LLAvatarComplexityControls::setIndirectMaxArc()  	else  	{  		// This is the inverse of the calculation in updateMaxComplexity -		indirect_max_arc = (U32)((log(max_arc) - MIN_ARC_LOG) / ARC_LIMIT_MAP_SCALE) + MIN_INDIRECT_ARC_LIMIT; +		indirect_max_arc = (U32)ll_round(((log(F32(max_arc)) - MIN_ARC_LOG) / ARC_LIMIT_MAP_SCALE)) + MIN_INDIRECT_ARC_LIMIT;  	}  	gSavedSettings.setU32("IndirectMaxComplexity", indirect_max_arc);  } @@ -1930,7 +1930,7 @@ void LLAvatarComplexityControls::updateMax(LLSliderCtrl* slider, LLTextBox* valu  	{  		// if this is changed, the inverse calculation in setIndirectMaxArc  		// must be changed to match -		max_arc = (U32)exp(MIN_ARC_LOG + (ARC_LIMIT_MAP_SCALE * (indirect_value - MIN_INDIRECT_ARC_LIMIT))); +		max_arc = (U32)ll_round(exp(MIN_ARC_LOG + (ARC_LIMIT_MAP_SCALE * (indirect_value - MIN_INDIRECT_ARC_LIMIT))));  	}  	gSavedSettings.setU32("RenderAvatarMaxComplexity", (U32)max_arc); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index ed6f4ede9f..a6ce0ba678 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -192,7 +192,6 @@ BOOL LLFloaterReporter::postBuild()  	mOwnerName = LLStringUtil::null;  	getChild<LLUICtrl>("summary_edit")->setFocus(TRUE); -	getChild<LLCheckBoxCtrl>("screen_check")->set(TRUE);  	mDefaultSummary = getChild<LLUICtrl>("details_edit")->getValue().asString(); @@ -246,8 +245,6 @@ LLFloaterReporter::~LLFloaterReporter()  // virtual  void LLFloaterReporter::draw()  { -	getChildView("screen_check")->setEnabled(TRUE ); -  	LLFloater::draw();  } @@ -255,7 +252,6 @@ void LLFloaterReporter::enableControls(BOOL enable)  {  	getChildView("category_combo")->setEnabled(enable);  	getChildView("chat_check")->setEnabled(enable); -	getChildView("screen_check")->setEnabled(enable);  	getChildView("screenshot")->setEnabled(FALSE);  	getChildView("pick_btn")->setEnabled(enable);  	getChildView("summary_edit")->setEnabled(enable); @@ -448,23 +444,15 @@ void LLFloaterReporter::onClickSend(void *userdata)  		if(!url.empty() || !sshot_url.empty())  		{  			self->sendReportViaCaps(url, sshot_url, self->gatherReport()); +			LLNotificationsUtil::add("HelpReportAbuseConfirm");  			self->closeFloater();  		}  		else  		{ -			if(self->getChild<LLUICtrl>("screen_check")->getValue()) -			{ -				self->getChildView("send_btn")->setEnabled(FALSE); -				self->getChildView("cancel_btn")->setEnabled(FALSE); -				// the callback from uploading the image calls sendReportViaLegacy() -				self->uploadImage(); -			} -			else -			{ -				self->sendReportViaLegacy(self->gatherReport()); -				LLUploadDialog::modalUploadFinished(); -				self->closeFloater(); -			} +			self->getChildView("send_btn")->setEnabled(FALSE); +			self->getChildView("cancel_btn")->setEnabled(FALSE); +			// the callback from uploading the image calls sendReportViaLegacy() +			self->uploadImage();  		}  	}  } @@ -713,10 +701,7 @@ LLSD LLFloaterReporter::gatherReport()  	// only send a screenshot ID if we're asked to and the email is   	// going to LL - Estate Owners cannot see the screenshot asset  	LLUUID screenshot_id = LLUUID::null; -	if (getChild<LLUICtrl>("screen_check")->getValue()) -	{ -		screenshot_id = getChild<LLUICtrl>("screenshot")->getValue(); -	}; +	screenshot_id = getChild<LLUICtrl>("screenshot")->getValue();  	LLSD report = LLSD::emptyMap();  	report["report-type"] = (U8) mReportType; @@ -770,7 +755,7 @@ void LLFloaterReporter::finishedARPost(const LLSD &)  void LLFloaterReporter::sendReportViaCaps(std::string url, std::string sshot_url, const LLSD& report)  { -	if(getChild<LLUICtrl>("screen_check")->getValue().asBoolean() && !sshot_url.empty()) +	if(!sshot_url.empty())      {  		// try to upload screenshot          LLResourceUploadInfo::ptr_t uploadInfo(new  LLARScreenShotUploader(report, mResourceDatap->mAssetInfo.mUuid, mResourceDatap->mAssetInfo.mType)); @@ -885,6 +870,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,  		self->mScreenID = uuid;  		LL_INFOS() << "Got screen shot " << uuid << LL_ENDL;  		self->sendReportViaLegacy(self->gatherReport()); +		LLNotificationsUtil::add("HelpReportAbuseConfirm");  		self->closeFloater();  	}  } diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 7b8fc5b35b..eae16b9f03 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -660,6 +660,8 @@ BOOL LLPanelScriptLimitsRegionMemory::postBuild()  	{  		return FALSE;  	} +	list->setCommitCallback(boost::bind(&LLPanelScriptLimitsRegionMemory::checkButtonsEnabled, this)); +	checkButtonsEnabled();  	//set all columns to resizable mode even if some columns will be empty  	for(S32 column = 0; column < list->getNumColumns(); column++) @@ -750,6 +752,14 @@ void LLPanelScriptLimitsRegionMemory::clearList()  	getChild<LLUICtrl>("parcels_listed")->setValue(LLSD(msg_empty_string));  	mObjectListItems.clear(); +	checkButtonsEnabled(); +} + +void LLPanelScriptLimitsRegionMemory::checkButtonsEnabled() +{ +	LLScrollListCtrl* list = getChild<LLScrollListCtrl>("scripts_list"); +	getChild<LLButton>("highlight_btn")->setEnabled(list->getNumSelected() > 0); +	getChild<LLButton>("return_btn")->setEnabled(list->getNumSelected() > 0);  }  // static diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index e3cbbd185f..2ac3862b4f 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -113,6 +113,7 @@ public:  	void showBeacon();  	void returnObjectsFromParcel(S32 local_id);  	void returnObjects(); +	void checkButtonsEnabled();  private:  	void onNameCache(const LLUUID& id, diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 0cb37dabe7..b139e5daf5 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -257,7 +257,6 @@ void LLFloaterSellLandUI::setBadge(const char* id, Badge badge)  	static std::string badgeOK("badge_ok.j2c");  	static std::string badgeNote("badge_note.j2c");  	static std::string badgeWarn("badge_warn.j2c"); -	static std::string badgeError("badge_error.j2c");  	std::string badgeName;  	switch (badge) @@ -266,7 +265,7 @@ void LLFloaterSellLandUI::setBadge(const char* id, Badge badge)  		case BADGE_OK:		badgeName = badgeOK;	break;  		case BADGE_NOTE:	badgeName = badgeNote;	break;  		case BADGE_WARN:	badgeName = badgeWarn;	break; -		case BADGE_ERROR:	badgeName = badgeError;	break; +		case BADGE_ERROR:	badgeName = badgeWarn;	break;  	}  	getChild<LLUICtrl>(id)->setValue(badgeName); diff --git a/indra/newview/llgroupiconctrl.cpp b/indra/newview/llgroupiconctrl.cpp index 271dd44c1f..7c2a3cad43 100644 --- a/indra/newview/llgroupiconctrl.cpp +++ b/indra/newview/llgroupiconctrl.cpp @@ -74,9 +74,16 @@ LLGroupIconCtrl::~LLGroupIconCtrl()  	LLGroupMgr::getInstance()->removeObserver(this);  } -void LLGroupIconCtrl::setIconId(const LLSD& value) +void LLGroupIconCtrl::setIconId(const LLUUID& icon_id)  { -    LLIconCtrl::setValue(value); +    if (icon_id.notNull()) +    { +        LLIconCtrl::setValue(icon_id); +    } +    else +    { +        LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI); +    }  }  void LLGroupIconCtrl::setValue(const LLSD& value) @@ -122,14 +129,7 @@ bool LLGroupIconCtrl::updateFromCache()  	LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mGroupId);  	if (!group_data) return false; -	if (group_data->mInsigniaID.notNull()) -	{ -		LLIconCtrl::setValue(group_data->mInsigniaID); -	} -	else -	{ -		LLIconCtrl::setValue(mDefaultIconName, LLViewerFetchedTexture::BOOST_UI); -	} +	setIconId(group_data->mInsigniaID);  	if (mDrawTooltip && !group_data->mName.empty())  	{ diff --git a/indra/newview/llgroupiconctrl.h b/indra/newview/llgroupiconctrl.h index f8b22cf581..43e384d3e2 100644 --- a/indra/newview/llgroupiconctrl.h +++ b/indra/newview/llgroupiconctrl.h @@ -66,7 +66,13 @@ public:  	 */  	virtual void setValue(const LLSD& value); -	void setIconId(const LLSD& value); +	/** +	 * Sets icon_id as icon value directly. Avoids LLGroupMgr cache checks for group id +	 * Uses default icon in case id is null. +	 * +	 * @params icon_id - it is processed as icon id, default image will be used in case id is null. +	 */ +	void setIconId(const LLUUID& icon_id);  	// LLGroupMgrObserver observer trigger  	virtual void changed(LLGroupChange gc); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 6126db2988..62414d3bbb 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -379,10 +379,7 @@ void LLGroupListItem::setGroupID(const LLUUID& group_id)  void LLGroupListItem::setGroupIconID(const LLUUID& group_icon_id)  { -	if (group_icon_id.notNull()) -	{ -		mGroupIcon->setIconId(group_icon_id); -	} +	mGroupIcon->setIconId(group_icon_id);  }  void LLGroupListItem::setGroupIconVisible(bool visible) diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 52e83fe412..6b1e196182 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -53,7 +53,7 @@ const F32 VERTICAL_PADDING = 12.f;  const F32 BUFFER_SIZE = 2.f;  const F32 HUD_TEXT_MAX_WIDTH = 190.f;  const F32 HUD_TEXT_MAX_WIDTH_NO_BUBBLE = 1000.f; -const F32 MAX_DRAW_DISTANCE = 64.f; +const F32 MAX_DRAW_DISTANCE = 300.f;  std::set<LLPointer<LLHUDText> > LLHUDText::sTextObjects;  std::vector<LLPointer<LLHUDText> > LLHUDText::sVisibleTextObjects; @@ -394,7 +394,20 @@ void LLHUDText::updateVisibility()  	LLVector3 pos_agent_center = gAgent.getPosAgentFromGlobal(mPositionGlobal) - dir_from_camera;  	F32 last_distance_center = (pos_agent_center - LLViewerCamera::getInstance()->getOrigin()).magVec(); -	if(last_distance_center > MAX_DRAW_DISTANCE) +	F32 max_draw_distance = gSavedSettings.getF32("PrimTextMaxDrawDistance"); + +	if(max_draw_distance < 0) +	{ +		max_draw_distance = 0; +		gSavedSettings.setF32("PrimTextMaxDrawDistance", max_draw_distance); +	} +	else if(max_draw_distance > MAX_DRAW_DISTANCE) +	{ +		max_draw_distance = MAX_DRAW_DISTANCE; +		gSavedSettings.setF32("PrimTextMaxDrawDistance", MAX_DRAW_DISTANCE); +	} + +	if(last_distance_center > max_draw_distance)  	{  		mVisible = FALSE;  		return; diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp index 8e91af321e..a4fce36783 100644 --- a/indra/newview/llinspectgroup.cpp +++ b/indra/newview/llinspectgroup.cpp @@ -41,6 +41,7 @@  #include "lltooltip.h"	// positionViewNearMouse()  #include "lltrans.h"  #include "lluictrl.h" +#include "llgroupiconctrl.h"  //////////////////////////////////////////////////////////////////////////////  // LLInspectGroup @@ -233,7 +234,7 @@ void LLInspectGroup::processGroupData()  		getChild<LLUICtrl>("group_details")->setValue( LLSD(data->mCharter) ); -		getChild<LLUICtrl>("group_icon")->setValue( LLSD(data->mInsigniaID) ); +		getChild<LLGroupIconCtrl>("group_icon")->setIconId(data->mInsigniaID);  		std::string cost;  		bool is_member = LLGroupActions::isInGroup(mGroupID); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 9f0b35fc8c..eebb6a0384 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -286,6 +286,16 @@ BOOL LLInvFVBridge::cutToClipboard()  	return FALSE;  } +// virtual +bool LLInvFVBridge::isCutToClipboard() +{ +    if (LLClipboard::instance().isCutMode()) +    { +        return LLClipboard::instance().isOnClipboard(mUUID); +    } +    return false; +} +  // Callback for cutToClipboard if DAMA required...  BOOL LLInvFVBridge::callback_cutToClipboard(const LLSD& notification, const LLSD& response)  { @@ -307,9 +317,7 @@ BOOL LLInvFVBridge::perform_cutToClipboard()  	if (obj && isItemMovable() && isItemRemovable())  	{  		LLClipboard::instance().setCutMode(true); -		BOOL added_to_clipboard = LLClipboard::instance().addToClipboard(mUUID); -        removeObject(&gInventory, mUUID);   // Always perform the remove even if the object couldn't make it to the clipboard -        return added_to_clipboard; +		return LLClipboard::instance().addToClipboard(mUUID);  	}  	return FALSE;  } @@ -1390,6 +1398,12 @@ bool LLInvFVBridge::canShare() const  				// Categories can be given.  				can_share = (model->getCategory(mUUID) != NULL);  			} + +			const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); +			if ((mUUID == trash_id) || gInventory.isObjectDescendentOf(mUUID, trash_id)) +			{ +				can_share = false; +			}  		}  	} @@ -1925,13 +1939,15 @@ BOOL LLItemBridge::removeItem()  	}  	// move it to the trash -	LLPreview::hide(mUUID, TRUE);  	LLInventoryModel* model = getInventoryModel();  	if(!model) return FALSE;  	const LLUUID& trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  	LLViewerInventoryItem* item = getItem();  	if (!item) return FALSE; - +	if (item->getType() != LLAssetType::AT_LSL_TEXT) +	{ +		LLPreview::hide(mUUID, TRUE); +	}  	// Already in trash  	if (model->isObjectDescendentOf(mUUID, trash_id)) return FALSE; diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 9053c61171..df25e01688 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -116,6 +116,7 @@ public:  	virtual BOOL isItemCopyable() const { return FALSE; }  	virtual BOOL copyToClipboard() const;  	virtual BOOL cutToClipboard(); +	virtual bool isCutToClipboard();  	virtual BOOL isClipboardPasteable() const;  	virtual BOOL isClipboardPasteableAsLink() const;  	virtual void pasteFromClipboard() {} diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 003bbcafed..e995c138b4 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -84,21 +84,18 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)  bool LLInventoryFilter::check(const LLFolderViewModelItem* item)   {  	const LLFolderViewModelItemInventory* listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item); -	// Clipboard cut items are *always* filtered so we need this value upfront -	const BOOL passed_clipboard = (listener ? checkAgainstClipboard(listener->getUUID()) : TRUE);  	// If it's a folder and we're showing all folders, return automatically.  	const BOOL is_folder = listener->getInventoryType() == LLInventoryType::IT_CATEGORY;  	if (is_folder && (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS))  	{ -		return passed_clipboard; +		return true;  	}  	bool passed = (mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) != std::string::npos : true);  	passed = passed && checkAgainstFilterType(listener);  	passed = passed && checkAgainstPermissions(listener);  	passed = passed && checkAgainstFilterLinks(listener); -	passed = passed && passed_clipboard;  	return passed;  } @@ -108,9 +105,8 @@ bool LLInventoryFilter::check(const LLInventoryItem* item)  	const bool passed_string = (mFilterSubString.size() ? item->getName().find(mFilterSubString) != std::string::npos : true);  	const bool passed_filtertype = checkAgainstFilterType(item);  	const bool passed_permissions = checkAgainstPermissions(item); -	const bool passed_clipboard = checkAgainstClipboard(item->getUUID()); -	return passed_filtertype && passed_permissions && passed_clipboard && passed_string; +	return passed_filtertype && passed_permissions && passed_string;  }  bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const @@ -129,13 +125,10 @@ bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const  bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  { -	// Always check against the clipboard -	const BOOL passed_clipboard = checkAgainstClipboard(folder_id); -	  	// we're showing all folders, overriding filter  	if (mFilterOps.mShowFolderState == LLInventoryFilter::SHOW_ALL_FOLDERS)  	{ -		return passed_clipboard; +		return true;  	}  	// when applying a filter, matching folders get their contents downloaded first @@ -201,7 +194,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  	LLViewerInventoryItem* item = gInventory.getItem(folder_id);  	if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER)  	{ -		return passed_clipboard; +		return true;  	}  	if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY) @@ -216,7 +209,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const  			return false;  	} -	return passed_clipboard; +	return true;  }  bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInventory* listener) const diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 9a33e210ff..503fa28a33 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -582,7 +582,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,  	// Add the category to the internal representation  	LLPointer<LLViewerInventoryCategory> cat =  		new LLViewerInventoryCategory(id, parent_id, preferred_type, name, gAgent.getID()); -	cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL); +	cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1  	cat->setDescendentCount(0);  	LLCategoryUpdate update(cat->getParentUUID(), 1);  	accountForUpdate(update); @@ -640,7 +640,7 @@ void LLInventoryModel::createNewCategoryCoro(std::string url, LLSD postData, inv          result["parent_id"].asUUID(), (LLFolderType::EType)result["type"].asInteger(),          result["name"].asString(), gAgent.getID()); -    cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL); +    cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1      cat->setDescendentCount(0);      LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1); @@ -914,8 +914,11 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask)  			item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, category_id);  			if( item_array )  			{ +				LLInventoryModel::LLCategoryUpdate update(category_id, 1); +				gInventory.accountForUpdate(update); +  				// *FIX: bit of a hack to call update server from here... -				new_item->updateServer(TRUE); +				new_item->updateParentOnServer(FALSE);  				item_array->push_back(new_item);  			}  			else @@ -956,9 +959,11 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item, U32 mask)  				item_array = get_ptr_in_map(mParentChildItemTree, parent_id);  				if(item_array)  				{ +					LLInventoryModel::LLCategoryUpdate update(parent_id, 1); +					gInventory.accountForUpdate(update);  					// *FIX: bit of a hack to call update server from  					// here... -					new_item->updateServer(TRUE); +					new_item->updateParentOnServer(FALSE);  					item_array->push_back(new_item);  				}  				else @@ -1045,7 +1050,6 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32  	if(old_cat)  	{  		// We already have an old category, modify its values -		U32 mask = LLInventoryObserver::NONE;  		LLUUID old_parent_id = old_cat->getParentUUID();  		LLUUID new_parent_id = cat->getParentUUID();  		if(old_parent_id != new_parent_id) @@ -1100,7 +1104,8 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32  		item_array_t* itemsp = new item_array_t;  		mParentChildCategoryTree[new_cat->getUUID()] = catsp;  		mParentChildItemTree[new_cat->getUUID()] = itemsp; -		addChangedMask(LLInventoryObserver::ADD, cat->getUUID()); +		mask |= LLInventoryObserver::ADD; +		addChangedMask(mask, cat->getUUID());  	}  } @@ -1390,7 +1395,11 @@ void LLInventoryModel::onObjectDeletedFromServer(const LLUUID& object_id, bool f  		}  		// From purgeObject() -		LLPreview::hide(object_id); +		LLViewerInventoryItem *item = getItem(object_id); +		if (item && (item->getType() != LLAssetType::AT_LSL_TEXT)) +		{ +			LLPreview::hide(object_id, TRUE); +		}  		deleteObject(object_id, fix_broken_links, do_notify_observers);  	}  } diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index aa934f95a1..a55938f334 100644 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -181,7 +181,12 @@ bool LLLocalBitmap::updateSelf(EUpdateType optional_firstupdate)  		if (gDirUtilp->fileExists(mFilename))  		{  			// verifying that the file has indeed been modified + +#ifndef LL_WINDOWS  			const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(mFilename)); +#else +			const std::time_t temp_time = boost::filesystem::last_write_time(boost::filesystem::path(utf8str_to_utf16str(mFilename))); +#endif  			LLSD new_last_modified = asctime(localtime(&temp_time));  			if (mLastModified.asString() != new_last_modified.asString()) diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 53b2ca2b74..11bc1425f9 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -243,7 +243,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  	params.commit_on_focus_lost(false);  	params.follows.flags(FOLLOWS_ALL);  	mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params); -	mTextEntry->setContextMenu(NULL); +	mTextEntry->resetContextMenu();  	addChild(mTextEntry);  	// LLLineEditor is replaced with LLLocationLineEditor diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 639641d1c2..485d4677b1 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -244,7 +244,10 @@ std::string LLLogChat::makeLogFileName(std::string filename)  	filename = cleanFileName(filename);  	filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS, filename); -	filename += '.' + LL_TRANSCRIPT_FILE_EXTENSION; +	if (!filename.empty()) +	{ +		filename += '.' + LL_TRANSCRIPT_FILE_EXTENSION; +	}  	return filename;  } diff --git a/indra/newview/llmanip.h b/indra/newview/llmanip.h index 1fb05e047a..69881e8589 100644 --- a/indra/newview/llmanip.h +++ b/indra/newview/llmanip.h @@ -1,4 +1,4 @@ -/**  +/**    * @file llmanip.h   * @brief LLManip class definition   * @@ -37,7 +37,7 @@ class LLToolComposite;  class LLVector3;  class LLObjectSelection; -const S32 MIN_DIVISION_PIXEL_WIDTH = 9; +const S32 MIN_DIVISION_PIXEL_WIDTH = 3;  class LLManip : public LLTool  { diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index b4259a456c..3975d3980b 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1,4 +1,4 @@ -/**  +/**    * @file llmaniptranslate.cpp   * @brief LLManipTranslate class implementation   * @@ -548,12 +548,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)  		if (off_axis_magnitude > mSnapOffsetMeters)  		{  			mInSnapRegime = TRUE; -			LLVector3 mouse_down_offset(mDragCursorStartGlobal - mDragSelectionStartGlobal);  			LLVector3 cursor_snap_agent = gAgent.getPosAgentFromGlobal(cursor_point_snap_line); -			if (!gSavedSettings.getBOOL("SnapToMouseCursor")) -			{ -				cursor_snap_agent -= mouse_down_offset; -			}  			F32 cursor_grid_dist = (cursor_snap_agent - mGridOrigin) * axis_f; diff --git a/indra/newview/llmarketplacefunctions.cpp b/indra/newview/llmarketplacefunctions.cpp index 6cc7a0fc99..54f95520db 100644 --- a/indra/newview/llmarketplacefunctions.cpp +++ b/indra/newview/llmarketplacefunctions.cpp @@ -773,7 +773,9 @@ void LLMarketplaceData::getMerchantStatusCoro()      std::string url = getSLMConnectURL("/merchant");      if (url.empty())      { -        LL_INFOS("Marketplace") << "No marketplace capability on Sim" << LL_ENDL; +        LL_WARNS("Marketplace") << "No marketplace capability on Sim" << LL_ENDL; +        setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_CONNECTION_FAILURE); +        return;      }      LLSD result = httpAdapter->getAndSuspend(httpRequest, url, httpOpts); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 9cf3249983..00043d1e72 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -1007,7 +1007,11 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)  			std::string uuid = self->getClickUUID();  			LL_DEBUGS("Media") << "Media event:  MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << target << "\", uri is " << url << LL_ENDL; -			LLWeb::loadURL(url, target, std::string()); +			// try as slurl first +			if (!LLURLDispatcher::dispatch(url, "clicked", NULL, mTrusted)) +			{ +				LLWeb::loadURL(url, target, std::string()); +			}  			// CP: removing this code because we no longer support popups so this breaks the flow.  			//     replaced with a bare call to LLWeb::LoadURL(...) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 54f8fb93d0..e42647739f 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1753,6 +1753,11 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat  bool LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_params, S32 lod, U8* data, S32 data_size)  { +	if (data == NULL || data_size == 0) +	{ +		return false; +	} +  	LLPointer<LLVolume> volume = new LLVolume(mesh_params, LLVolumeLODGroup::getVolumeScaleFromDetail(lod));  	std::string mesh_string((char*) data, data_size);  	std::istringstream stream(mesh_string); @@ -3010,12 +3015,23 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b  	}  	else if (data && data_size > 0)  	{ -		// header was successfully retrieved from sim, cache in vfs -		LLSD header = gMeshRepo.mThread->mMeshHeader[mesh_id]; +		// header was successfully retrieved from sim and parsed, cache in vfs +		S32 header_bytes = 0; +		LLSD header; -		S32 version = header["version"].asInteger(); +		gMeshRepo.mThread->mHeaderMutex->lock(); +		LLMeshRepoThread::mesh_header_map::iterator iter = gMeshRepo.mThread->mMeshHeader.find(mesh_id); +		if (iter != gMeshRepo.mThread->mMeshHeader.end()) +		{ +			header_bytes = (S32)gMeshRepo.mThread->mMeshHeaderSize[mesh_id]; +			header = iter->second; +		} +		gMeshRepo.mThread->mHeaderMutex->unlock(); -		if (version <= MAX_MESH_VERSION) +		if (header_bytes > 0 +			&& !header.has("404") +			&& header.has("version") +			&& header["version"].asInteger() <= MAX_MESH_VERSION)  		{  			std::stringstream str; @@ -3064,6 +3080,17 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b  				}  			}  		} +		else +		{ +			LL_WARNS(LOG_MESH) << "Trying to cache nonexistent mesh, mesh id: " << mesh_id << LL_ENDL; + +			// headerReceived() parsed header, but header's data is invalid so none of the LODs will be available +			LLMutexLock lock(gMeshRepo.mThread->mMutex); +			for (int i(0); i < 4; ++i) +			{ +				gMeshRepo.mThread->mUnavailableQ.push(LLMeshRepoThread::LODRequest(mMeshParams, i)); +			} +		}  	}  } @@ -4115,7 +4142,7 @@ F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32  		}  	} -	F32 max_area = 102932.f; //area of circle that encompasses region +	F32 max_area = 102944.f; //area of circle that encompasses region (see MAINT-6559)  	F32 min_area = 1.f;  	F32 high_area = llmin(F_PI*dmid*dmid, max_area); diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 2657b84ef3..63ab88da42 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -96,17 +96,21 @@ bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)  			LLUUID from_id = notification->getPayload()["from_id"]; -			//Will not play a notification sound for inventory and teleport offer based upon chat preference -			bool playSound = (!notification->isDND() -							  && ((notification->getName() == "UserGiveItem" -			                  && gSavedSettings.getBOOL("PlaySoundInventoryOffer")) -			                  || (notification->getName() == "TeleportOffered" -			                  && gSavedSettings.getBOOL("PlaySoundTeleportOffer")))); - -			            if(playSound) -			            { -			                notification->playSound(); -			            } +			if (!notification->isDND()) +			{ +				//Will not play a notification sound for inventory and teleport offer based upon chat preference +				bool playSound = (notification->getName() == "UserGiveItem" +								  && gSavedSettings.getBOOL("PlaySoundInventoryOffer")) +								 || ((notification->getName() == "TeleportOffered" +								     || notification->getName() == "TeleportOffered_MaturityExceeded" +								     || notification->getName() == "TeleportOffered_MaturityBlocked") +								    && gSavedSettings.getBOOL("PlaySoundTeleportOffer")); + +				if (playSound) +				{ +					notification->playSound(); +				} +			}  			LLHandlerUtil::spawnIMSession(name, from_id);  			LLHandlerUtil::addNotifPanelToIM(notification); diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp index 65fd3f95ab..de6a36ce2f 100644 --- a/indra/newview/lloutfitgallery.cpp +++ b/indra/newview/lloutfitgallery.cpp @@ -999,7 +999,7 @@ void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)          }      } -    if (mGalleryCreated) +    if (mGalleryCreated && !LLApp::isQuitting())      {          reArrangeRows();      } diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index b2164c1f21..d17f5494a0 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -199,7 +199,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)  	mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); -	mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII ); +	mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCIINoLeadingSpace );  } diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 8331c152e2..8b9941c0ca 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -1059,9 +1059,6 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)  		case LLAssetType::AT_BODYPART:  			applyListViewFilter(LVIT_BODYPART);  			break; -		case LLAssetType::AT_GESTURE: -			applyListViewFilter(LVIT_GESTURES); -			break;  		case LLAssetType::AT_CLOTHING:  		default:  			applyListViewFilter(LVIT_CLOTHING); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 841bb4337a..30870daf40 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -80,7 +80,6 @@ public:  	{  		LVIT_ALL = 0,  		LVIT_CLOTHING, -		LVIT_GESTURES,  		LVIT_BODYPART,  		LVIT_ATTACHMENT,  		LVIT_SHAPE, diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 184238c40c..8afa35efa0 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -44,19 +44,11 @@ static const std::string PANEL_PICKS = "panel_picks";  std::string getProfileURL(const std::string& agent_name)  { -	std::string url; - -	if (LLGridManager::getInstance()->isInProductionGrid()) -	{ -		url = gSavedSettings.getString("WebProfileURL"); -	} -	else -	{ -		url = gSavedSettings.getString("WebProfileNonProductionURL"); -	} +	std::string url = "[WEB_PROFILE_URL][AGENT_NAME]";  	LLSD subs; +	subs["WEB_PROFILE_URL"] = LLGridManager::getInstance()->getWebProfileURL();  	subs["AGENT_NAME"] = agent_name; -	url = LLWeb::expandURLSubstitutions(url,subs); +	url = LLWeb::expandURLSubstitutions(url, subs);  	LLStringUtil::toLower(url);  	return url;  } diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index d0353259a5..796372ba04 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -30,13 +30,19 @@  #include "lltoggleablemenu.h" +#include "llagent.h" +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h"  #include "llappearancemgr.h"  #include "llfloatersidepanelcontainer.h"  #include "llinventoryfunctions.h" +#include "llinventoryicon.h"  #include "llinventorymodel.h"  #include "llinventoryobserver.h"  #include "llmenubutton.h" +#include "llscrolllistctrl.h"  #include "llviewermenu.h" +#include "llviewerregion.h"  #include "llwearableitemslist.h"  #include "llsdserialize.h"  #include "llclipboard.h" @@ -146,11 +152,47 @@ protected:  		menu->setItemVisible("detach",		allow_detach);  		menu->setItemVisible("edit_outfit_separator", allow_take_off || allow_detach);  		menu->setItemVisible("show_original", mUUIDs.size() == 1); +		menu->setItemVisible("edit_item", FALSE);  	}  };  ////////////////////////////////////////////////////////////////////////// +class LLTempAttachmentsContextMenu : public LLListContextMenu +{ +public: +	LLTempAttachmentsContextMenu(LLPanelWearing* panel_wearing) +		:	mPanelWearing(panel_wearing) +	{} +protected: +	/* virtual */ LLContextMenu* createMenu() +	{ +		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + +		registrar.add("Wearing.EditItem", boost::bind(&LLPanelWearing::onEditAttachment, mPanelWearing)); +		registrar.add("Wearing.Detach", boost::bind(&LLPanelWearing::onRemoveAttachment, mPanelWearing)); +		LLContextMenu* menu = createFromFile("menu_wearing_tab.xml"); + +		updateMenuItemsVisibility(menu); + +		return menu; +	} + +	void updateMenuItemsVisibility(LLContextMenu* menu) +	{ +		menu->setItemVisible("take_off", FALSE); +		menu->setItemVisible("detach", TRUE); +		menu->setItemVisible("edit_outfit_separator", TRUE); +		menu->setItemVisible("show_original", FALSE); +		menu->setItemVisible("edit_item", TRUE); +		menu->setItemVisible("edit", FALSE); +	} + +	LLPanelWearing* 		mPanelWearing; +}; + +////////////////////////////////////////////////////////////////////////// +  std::string LLPanelAppearanceTab::sFilterSubString = LLStringUtil::null;  static LLPanelInjector<LLPanelWearing> t_panel_wearing("panel_wearing"); @@ -159,30 +201,47 @@ LLPanelWearing::LLPanelWearing()  	:	LLPanelAppearanceTab()  	,	mCOFItemsList(NULL)  	,	mIsInitialized(false) +	,	mAttachmentsChangedConnection()  {  	mCategoriesObserver = new LLInventoryCategoriesObserver();  	mGearMenu = new LLWearingGearMenu(this);  	mContextMenu = new LLWearingContextMenu(); +	mAttachmentsMenu = new LLTempAttachmentsContextMenu(this);  }  LLPanelWearing::~LLPanelWearing()  {  	delete mGearMenu;  	delete mContextMenu; +	delete mAttachmentsMenu;  	if (gInventory.containsObserver(mCategoriesObserver))  	{  		gInventory.removeObserver(mCategoriesObserver);  	}  	delete mCategoriesObserver; + +	if (mAttachmentsChangedConnection.connected()) +	{ +		mAttachmentsChangedConnection.disconnect(); +	}  }  BOOL LLPanelWearing::postBuild()  { +	mAccordionCtrl = getChild<LLAccordionCtrl>("wearables_accordion"); +	mWearablesTab = getChild<LLAccordionCtrlTab>("tab_wearables"); +	mAttachmentsTab = getChild<LLAccordionCtrlTab>("tab_temp_attachments"); +	mAttachmentsTab->setDropDownStateChangedCallback(boost::bind(&LLPanelWearing::onAccordionTabStateChanged, this)); +  	mCOFItemsList = getChild<LLWearableItemsList>("cof_items_list");  	mCOFItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onWearableItemsListRightClick, this, _1, _2, _3)); +	mTempItemsList = getChild<LLScrollListCtrl>("temp_attachments_list"); +	mTempItemsList->setFgUnselectedColor(LLColor4::white); +	mTempItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onTempAttachmentsListRightClick, this, _1, _2, _3)); +  	LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn");  	menu_gear_btn->setMenu(mGearMenu->getMenu()); @@ -223,6 +282,44 @@ void LLPanelWearing::onOpen(const LLSD& /*info*/)  	}  } +void LLPanelWearing::draw() +{ +	if (mUpdateTimer.getStarted() && (mUpdateTimer.getElapsedTimeF32() > 0.1)) +	{ +		mUpdateTimer.stop(); +		updateAttachmentsList(); +	} +	LLPanel::draw(); +} + +void LLPanelWearing::onAccordionTabStateChanged() +{ +	if(mAttachmentsTab->isExpanded()) +	{ +		startUpdateTimer(); +		mAttachmentsChangedConnection = LLAppearanceMgr::instance().setAttachmentsChangedCallback(boost::bind(&LLPanelWearing::startUpdateTimer, this)); +	} +	else +	{ +		if (mAttachmentsChangedConnection.connected()) +		{ +			mAttachmentsChangedConnection.disconnect(); +		} +	} +} + +void LLPanelWearing::startUpdateTimer() +{ +	if (!mUpdateTimer.getStarted()) +	{ +		mUpdateTimer.start(); +	} +	else +	{ +		mUpdateTimer.reset(); +	} +} +  // virtual  void LLPanelWearing::setFilterSubString(const std::string& string)  { @@ -251,6 +348,124 @@ bool LLPanelWearing::isActionEnabled(const LLSD& userdata)  	return false;  } +void LLPanelWearing::updateAttachmentsList() +{ +	std::vector<LLViewerObject*> attachs = LLAgentWearables::getTempAttachments(); +	mTempItemsList->deleteAllItems(); +	mAttachmentsMap.clear(); +	if(!attachs.empty()) +	{ +		if(!populateAttachmentsList()) +		{ +			requestAttachmentDetails(); +		} +	} +	else +	{ +		std::string no_attachments = getString("no_attachments"); +		LLSD row; +		row["columns"][0]["column"] = "text"; +		row["columns"][0]["value"] = no_attachments; +		row["columns"][0]["font"] = "SansSerifBold"; +		mTempItemsList->addElement(row); +	} +} + +bool LLPanelWearing::populateAttachmentsList(bool update) +{ +	bool populated = true; +	if(mTempItemsList) +	{ +		mTempItemsList->deleteAllItems(); +		mAttachmentsMap.clear(); +		std::vector<LLViewerObject*> attachs = LLAgentWearables::getTempAttachments(); + +		std::string icon_name = LLInventoryIcon::getIconName(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT); +		for (std::vector<LLViewerObject*>::iterator iter = attachs.begin(); +				iter != attachs.end(); ++iter) +		{ +			LLViewerObject *attachment = *iter; +			LLSD row; +			row["id"] = attachment->getID(); +			row["columns"][0]["column"] = "icon"; +			row["columns"][0]["type"] = "icon"; +			row["columns"][0]["value"] = icon_name; +			row["columns"][1]["column"] = "text"; +			if(mObjectNames.count(attachment->getID()) && !mObjectNames[attachment->getID()].empty()) +			{ +				row["columns"][1]["value"] = mObjectNames[attachment->getID()]; +			} +			else if(update) +			{ +				row["columns"][1]["value"] = attachment->getID(); +				populated = false; +			} +			else +			{ +				row["columns"][1]["value"] = "Loading..."; +				populated = false; +			} +			mTempItemsList->addElement(row); +			mAttachmentsMap[attachment->getID()] = attachment; +		} +	} +	return populated; +} + +void LLPanelWearing::requestAttachmentDetails() +{ +	LLSD body; +	std::string url = gAgent.getRegion()->getCapability("AttachmentResources"); +	if (!url.empty()) +	{ +		LLCoros::instance().launch("LLPanelWearing::getAttachmentLimitsCoro", +		boost::bind(&LLPanelWearing::getAttachmentLimitsCoro, this, url)); +	} +} + +void LLPanelWearing::getAttachmentLimitsCoro(std::string url) +{ +	LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); +	LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t +	httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("getAttachmentLimitsCoro", httpPolicy)); +	LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + +	LLSD result = httpAdapter->getAndSuspend(httpRequest, url); + +	LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; +	LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + +	if (!status) +	{ +		LL_WARNS() << "Unable to retrieve attachment limits." << LL_ENDL; +		return; +	} + +	result.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS); +	setAttachmentDetails(result); +} + + +void LLPanelWearing::setAttachmentDetails(LLSD content) +{ +	mObjectNames.clear(); +	S32 number_attachments = content["attachments"].size(); +	for(int i = 0; i < number_attachments; i++) +	{ +		S32 number_objects = content["attachments"][i]["objects"].size(); +		for(int j = 0; j < number_objects; j++) +		{ +			LLUUID task_id = content["attachments"][i]["objects"][j]["id"].asUUID(); +			std::string name = content["attachments"][i]["objects"][j]["name"].asString(); +			mObjectNames[task_id] = name; +		} +	} +	if(!mObjectNames.empty()) +	{ +		populateAttachmentsList(true); +	} +} +  boost::signals2::connection LLPanelWearing::setSelectionChangeCallback(commit_callback_t cb)  {  	if (!mCOFItemsList) return boost::signals2::connection(); @@ -270,6 +485,20 @@ void LLPanelWearing::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)  	mContextMenu->show(ctrl, selected_uuids, x, y);  } +void LLPanelWearing::onTempAttachmentsListRightClick(LLUICtrl* ctrl, S32 x, S32 y) +{ +	LLScrollListCtrl* list = dynamic_cast<LLScrollListCtrl*>(ctrl); +	if (!list) return; +	list->selectItemAt(x, y, MASK_NONE); +	uuid_vec_t selected_uuids; + +	if(list->getCurrentID().notNull()) +	{ +		selected_uuids.push_back(list->getCurrentID()); +		mAttachmentsMenu->show(ctrl, selected_uuids, x, y); +	} +} +  bool LLPanelWearing::hasItemSelected()  {  	return mCOFItemsList->getSelectedItem() != NULL; @@ -280,6 +509,28 @@ void LLPanelWearing::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const  	mCOFItemsList->getSelectedUUIDs(selected_uuids);  } +void LLPanelWearing::onEditAttachment() +{ +	LLScrollListItem* item = mTempItemsList->getFirstSelected(); +	if (item) +	{ +		LLSelectMgr::getInstance()->deselectAll(); +		LLSelectMgr::getInstance()->selectObjectAndFamily(mAttachmentsMap[item->getUUID()]); +		handle_object_edit(); +	} +} + +void LLPanelWearing::onRemoveAttachment() +{ +	LLScrollListItem* item = mTempItemsList->getFirstSelected(); +	if (item) +	{ +		LLSelectMgr::getInstance()->deselectAll(); +		LLSelectMgr::getInstance()->selectObjectAndFamily(mAttachmentsMap[item->getUUID()]); +		LLSelectMgr::getInstance()->sendDropAttachment(); +	} +} +  void LLPanelWearing::copyToClipboard()  {  	std::string text; diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h index 9a212b3cca..c5cb79092a 100644 --- a/indra/newview/llpanelwearing.h +++ b/indra/newview/llpanelwearing.h @@ -31,9 +31,14 @@  // newview  #include "llpanelappearancetab.h" +#include "llselectmgr.h" +#include "lltimer.h" +class LLAccordionCtrl; +class LLAccordionCtrlTab;  class LLInventoryCategoriesObserver;  class LLListContextMenu; +class LLScrollListCtrl;  class LLWearableItemsList;  class LLWearingGearMenu; @@ -52,6 +57,8 @@ public:  	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void draw(); +  	/*virtual*/ void onOpen(const LLSD& info);  	/*virtual*/ void setFilterSubString(const std::string& string); @@ -62,17 +69,43 @@ public:  	/*virtual*/ void copyToClipboard(); +	void startUpdateTimer(); +	void updateAttachmentsList(); +  	boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb);  	bool hasItemSelected(); +	bool populateAttachmentsList(bool update = false); +	void onAccordionTabStateChanged(); +	void setAttachmentDetails(LLSD content); +	void requestAttachmentDetails(); +	void onEditAttachment(); +	void onRemoveAttachment(); +  private:  	void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); +	void onTempAttachmentsListRightClick(LLUICtrl* ctrl, S32 x, S32 y); + +	void getAttachmentLimitsCoro(std::string url);  	LLInventoryCategoriesObserver* 	mCategoriesObserver;  	LLWearableItemsList* 			mCOFItemsList; +	LLScrollListCtrl*				mTempItemsList;  	LLWearingGearMenu*				mGearMenu;  	LLListContextMenu*				mContextMenu; +	LLListContextMenu*				mAttachmentsMenu; + +	LLAccordionCtrlTab* 			mWearablesTab; +	LLAccordionCtrlTab* 			mAttachmentsTab; +	LLAccordionCtrl*				mAccordionCtrl; + +	std::map<LLUUID, LLViewerObject*> mAttachmentsMap; + +	std::map<LLUUID, std::string> 	mObjectNames; + +	boost::signals2::connection 	mAttachmentsChangedConnection; +	LLFrameTimer					mUpdateTimer;  	bool							mIsInitialized;  }; diff --git a/indra/newview/llpathfindinglinksetlist.cpp b/indra/newview/llpathfindinglinksetlist.cpp index b886e46765..eb7b95552e 100644 --- a/indra/newview/llpathfindinglinksetlist.cpp +++ b/indra/newview/llpathfindinglinksetlist.cpp @@ -204,7 +204,10 @@ void LLPathfindingLinksetList::parseLinksetListData(const LLSD& pLinksetListData  	{  		const std::string& uuid(linksetDataIter->first);  		const LLSD& linksetData = linksetDataIter->second; -		LLPathfindingObjectPtr linksetPtr(new LLPathfindingLinkset(uuid, linksetData)); -		objectMap.insert(std::pair<std::string, LLPathfindingObjectPtr>(uuid, linksetPtr)); +		if(linksetData.size() != 0) +		{ +			LLPathfindingObjectPtr linksetPtr(new LLPathfindingLinkset(uuid, linksetData)); +			objectMap.insert(std::pair<std::string, LLPathfindingObjectPtr>(uuid, linksetPtr)); +		}  	}  } diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp index 9957039f72..836f63bffa 100644 --- a/indra/newview/llpresetsmanager.cpp +++ b/indra/newview/llpresetsmanager.cpp @@ -104,8 +104,7 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_nam  		if (found)  		{  			std::string path = gDirUtilp->add(dir, file); -			std::string name = gDirUtilp->getBaseFileName(LLURI::unescape(path), /*strip_exten = */ true); - +			std::string name = LLURI::unescape(gDirUtilp->getBaseFileName(path, /*strip_exten = */ true));              LL_DEBUGS() << "  Found preset '" << name << "'" << LL_ENDL;  			if (PRESETS_DEFAULT != name) diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index ba9845ef04..510d91839d 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -437,6 +437,23 @@ void LLPreviewNotecard::finishInventoryUpload(LLUUID itemId, LLUUID newAssetId,      }  } +void LLPreviewNotecard::finishTaskUpload(LLUUID itemId, LLUUID newAssetId, LLUUID taskId) +{ + +    LLSD floater_key; +    floater_key["taskid"] = taskId; +    floater_key["itemid"] = itemId; +    LLPreviewNotecard* nc = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", floater_key); +    if (nc) +    { +        if (nc->hasEmbeddedInventory()) +        { +            gVFS->removeFile(newAssetId, LLAssetType::AT_NOTECARD); +        } +        nc->setAssetId(newAssetId); +        nc->refreshFromInventory(); +    } +}  bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)  { @@ -485,7 +502,7 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)                  else if (!mObjectUUID.isNull() && !task_url.empty())                  {                      uploadInfo = LLResourceUploadInfo::ptr_t(new LLBufferedAssetUploadInfo(mObjectUUID, mItemUUID, LLAssetType::AT_NOTECARD, buffer,  -                        boost::bind(&LLPreviewNotecard::finishInventoryUpload, _1, _3, LLUUID::null))); +                        boost::bind(&LLPreviewNotecard::finishTaskUpload, _1, _3, mObjectUUID)));                      url = task_url;                  } diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index ba571995f6..017c4485ba 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -96,6 +96,7 @@ protected:  	bool handleConfirmDeleteDialog(const LLSD& notification, const LLSD& response);      static void finishInventoryUpload(LLUUID itemId, LLUUID newAssetId, LLUUID newItemId); +    static void finishTaskUpload(LLUUID itemId, LLUUID newAssetId, LLUUID taskId);  protected:  	LLViewerTextEditor* mEditor; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 5b1b356597..f28ffce602 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -375,7 +375,8 @@ LLScriptEdCore::LLScriptEdCore(  	mLiveFile(NULL),  	mLive(live),  	mContainer(container), -	mHasScriptData(FALSE) +	mHasScriptData(FALSE), +	mScriptRemoved(FALSE)  {  	setFollowsAll();  	setBorderVisible(FALSE); @@ -666,7 +667,7 @@ bool LLScriptEdCore::hasChanged()  void LLScriptEdCore::draw()  {  	BOOL script_changed	= hasChanged(); -	getChildView("Save_btn")->setEnabled(script_changed); +	getChildView("Save_btn")->setEnabled(script_changed && !mScriptRemoved);  	if( mEditor->hasFocus() )  	{ @@ -840,7 +841,7 @@ void LLScriptEdCore::addHelpItemToHistory(const std::string& help_string)  BOOL LLScriptEdCore::canClose()  { -	if(mForceClose || !hasChanged()) +	if(mForceClose || !hasChanged() || mScriptRemoved)  	{  		return TRUE;  	} @@ -1511,6 +1512,17 @@ BOOL LLPreviewLSL::postBuild()  	return LLPreview::postBuild();  } +void LLPreviewLSL::draw() +{ +	const LLInventoryItem* item = getItem(); +	if(!item) +	{ +		setTitle(LLTrans::getString("ScriptWasDeleted")); +		mScriptEd->setItemRemoved(TRUE); +	} + +	LLPreview::draw(); +}  // virtual  void LLPreviewLSL::callbackLSLCompileSucceeded()  { diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index a8c6a6eeeb..6b31125641 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -119,6 +119,8 @@ public:  	void 			setScriptName(const std::string& name){mScriptName = name;}; +	void 			setItemRemoved(bool script_removed){mScriptRemoved = script_removed;}; +  private:  	void		onBtnHelp();  	void		onBtnDynamicHelp(); @@ -163,6 +165,7 @@ private:  	BOOL			mHasScriptData;  	LLLiveLSLFile*	mLiveFile;  	LLUUID			mAssociatedExperience; +	BOOL			mScriptRemoved;  	LLScriptEdContainer* mContainer; // parent view @@ -198,6 +201,7 @@ public:  	/*virtual*/ BOOL postBuild();  protected: +	virtual void draw();  	virtual BOOL canClose();  	void closeIfNeeded(); diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 86135ee6e8..f07f0ed86c 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -383,7 +383,7 @@ void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_cam  void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLViewerWearable *wearable, BOOL disable_camera_switch)  { -	if (!mEditWearable || mEditWearable->getVisible() == visible) +	if (!mEditWearable || ((mEditWearable->getWearable() == wearable) && mEditWearable->getVisible() == visible))  	{  		// visibility isn't changing, hence nothing to do  		return; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index a2c8e7772e..4e81d78455 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -771,7 +771,11 @@ bool idle_startup()  					LL_DEBUGS("AppInit") << "FirstLoginThisInstall off" << LL_ENDL;  				}  			} - +			display_startup(); +			if (gViewerWindow->getSystemUIScaleFactorChanged()) +			{ +				LLViewerWindow::showSystemUIScaleFactorChanged(); +			}  			LLStartUp::setStartupState( STATE_LOGIN_WAIT );		// Wait for user input  		}  		else diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index ad4f903dff..24bc55c998 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -1327,7 +1327,7 @@ void LLTextureCtrl::setOnTextureSelectedCallback(texture_selected_callback cb)  void	LLTextureCtrl::setImageAssetName(const std::string& name)  { -	LLPointer<LLUIImage> imagep = LLUI::getUIImage(name, LLGLTexture::BOOST_PREVIEW); +	LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);  	if(imagep)  	{  		LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get()); diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index 5e703933ca..4aad650b68 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -38,7 +38,6 @@  #include "lltoolfocus.h"  #include "llfocusmgr.h"  #include "llagent.h" -#include "llagentcamera.h"  #include "llviewerjoystick.h"  extern BOOL gDebugClicks; @@ -85,14 +84,7 @@ BOOL LLTool::handleMouseDown(S32 x, S32 y, MASK mask)  	}  	// by default, didn't handle it  	// LL_INFOS() << "LLTool::handleMouseDown" << LL_ENDL; -    if (gAgentCamera.cameraMouselook()) -    { -        gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN); -    } -    else -    { -        gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN); -    } +	gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_DOWN);  	return TRUE;  } @@ -103,15 +95,8 @@ BOOL LLTool::handleMouseUp(S32 x, S32 y, MASK mask)  		LL_INFOS() << "LLTool left mouse up" << LL_ENDL;  	}  	// by default, didn't handle it -    // LL_INFOS() << "LLTool::handleMouseUp" << LL_ENDL; -    if (gAgentCamera.cameraMouselook()) -    { -        gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_UP); -    } -    else -    { -        gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP); -    } +	// LL_INFOS() << "LLTool::handleMouseUp" << LL_ENDL; +	gAgent.setControlFlags(AGENT_CONTROL_LBUTTON_UP);  	return TRUE;  } diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 2b4fa757f6..76a791c6e9 100644 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -742,13 +742,12 @@ BOOL LLToolCompGun::handleHover(S32 x, S32 y, MASK mask)  BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)  {  -    // if the left button is blocked, don't put up the pie menu -    if (gAgent.leftButtonBlocked()) -    { -        // in case of "grabbed" control flag will be set later -        gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN); -        return FALSE; -    } +	// if the left button is grabbed, don't put up the pie menu +	if (gAgent.leftButtonGrabbed()) +	{ +		gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN); +		return FALSE; +	}  	// On mousedown, start grabbing  	gGrabTransientTool = this; @@ -760,13 +759,12 @@ BOOL LLToolCompGun::handleMouseDown(S32 x, S32 y, MASK mask)  BOOL LLToolCompGun::handleDoubleClick(S32 x, S32 y, MASK mask)  { -    // if the left button is blocked, don't put up the pie menu -    if (gAgent.leftButtonBlocked()) -    { -        // in case of "grabbed" control flag will be set later -        gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN); -        return FALSE; -    } +	// if the left button is grabbed, don't put up the pie menu +	if (gAgent.leftButtonGrabbed()) +	{ +		gAgent.setControlFlags(AGENT_CONTROL_ML_LBUTTON_DOWN); +		return FALSE; +	}  	// On mousedown, start grabbing  	gGrabTransientTool = this; diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index c4696c3a01..caa055e5e0 100644 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -223,6 +223,7 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)  		}  		if (!(pick_info.mKeyMask & MASK_ALT) && +			!LLFloaterCamera::inFreeCameraMode() &&  			gAgentCamera.cameraThirdPerson() &&  			gViewerWindow->getLeftMouseDown() &&   			!gSavedSettings.getBOOL("FreezeTime") && diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index c0ca4d7a9a..92e8af985b 100644 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -143,7 +143,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)  	// call the base class to propogate info to sim  	LLTool::handleMouseDown(x, y, mask); -	if (!gAgent.leftButtonBlocked()) +	if (!gAgent.leftButtonGrabbed())  	{  		// can grab transparent objects (how touch event propagates, scripters rely on this)  		gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ TRUE); diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index b0e3b5bf89..f6eb290bc3 100644 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -267,7 +267,7 @@ bool LLToolMgr::canEdit()  bool LLToolMgr::buildEnabledOrActive()  { -	return inEdit() || canEdit(); +	return LLFloaterReg::instanceVisible("build") || canEdit();  }  void LLToolMgr::toggleBuildMode(const LLSD& sdname) diff --git a/indra/newview/llviewchildren.cpp b/indra/newview/llviewchildren.cpp index 5c5bbdc8f5..32b2f7e9f5 100644 --- a/indra/newview/llviewchildren.cpp +++ b/indra/newview/llviewchildren.cpp @@ -79,8 +79,9 @@ void LLViewChildren::setBadge(const std::string& id, Badge badge, bool visible)  			default:  			case BADGE_OK:		child->setValue(std::string("badge_ok.j2c"));	break;  			case BADGE_NOTE:	child->setValue(std::string("badge_note.j2c"));	break; -			case BADGE_WARN:	child->setValue(std::string("badge_warn.j2c"));	break; -			case BADGE_ERROR:	child->setValue(std::string("badge_error.j2c"));	break; +			case BADGE_WARN: +			case BADGE_ERROR: +				child->setValue(std::string("badge_warn.j2c"));	break;  		}  	}  } diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 16f40fb747..5e74e9f019 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -207,6 +207,12 @@ static bool handleVolumeLODChanged(const LLSD& newvalue)  	return true;  } +static bool handleRiggedLODChanged(const LLSD& newvalue) +{ +    LLVOVolume::sRiggedFactorMultiplier = (F32)newvalue.asReal(); +    return true; +} +  static bool handleAvatarLODChanged(const LLSD& newvalue)  {  	LLVOAvatar::sLODFactor = (F32) newvalue.asReal(); @@ -619,6 +625,7 @@ void settings_setup_listeners()  	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2)); +	gSavedSettings.getControl("RenderRiggedFactorMultiplier")->getSignal()->connect(boost::bind(&handleRiggedLODChanged, _2));  	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));  	gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));  	gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2)); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index d0813544f8..0bbe9fa2c2 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1007,6 +1007,22 @@ void activate_gesture_cb(const LLUUID& inv_item)  	LLGestureMgr::instance().activateGesture(inv_item);  } +void set_default_permissions(LLViewerInventoryItem* item, std::string perm_type) +{ +	llassert(item); +	LLPermissions perm = item->getPermissions(); +	if (perm.getMaskEveryone() != LLFloaterPerms::getEveryonePerms(perm_type) +		|| perm.getMaskGroup() != LLFloaterPerms::getGroupPerms(perm_type)) +	{ +		perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms(perm_type)); +		perm.setMaskGroup(LLFloaterPerms::getGroupPerms(perm_type)); + +		item->setPermissions(perm); + +		item->updateServer(FALSE); +	} +} +  void create_script_cb(const LLUUID& inv_item)  {  	if (!inv_item.isNull()) @@ -1014,13 +1030,9 @@ void create_script_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Scripts")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Scripts")); - -			item->setPermissions(perm); +			set_default_permissions(item, "Scripts"); -			item->updateServer(FALSE); +			// item was just created, update even if permissions did not changed  			gInventory.updateItem(item);  			gInventory.notifyObservers();  		} @@ -1036,13 +1048,8 @@ void create_gesture_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures")); +			set_default_permissions(item, "Gestures"); -			item->setPermissions(perm); - -			item->updateServer(FALSE);  			gInventory.updateItem(item);  			gInventory.notifyObservers(); @@ -1061,13 +1068,8 @@ void create_notecard_cb(const LLUUID& inv_item)  		LLViewerInventoryItem* item = gInventory.getItem(inv_item);  		if (item)  		{ -			LLPermissions perm = item->getPermissions(); -			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Notecards")); -			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Notecards")); - -			item->setPermissions(perm); +			set_default_permissions(item, "Notecards"); -			item->updateServer(FALSE);  			gInventory.updateItem(item);  			gInventory.notifyObservers();  		} diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f5b06fbd19..46f03f9971 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -397,13 +397,15 @@ void set_merchant_SLM_menu()  	gToolBarView->enableCommand(command->id(), true);  } -void check_merchant_status() +void check_merchant_status(bool force)  {      if (!gSavedSettings.getBOOL("InventoryOutboxDisplayBoth"))      { -        // Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status() -        LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED); -         +        if (force) +        { +            // Reset the SLM status: we actually want to check again, that's the point of calling check_merchant_status() +            LLMarketplaceData::instance().setSLMStatus(MarketplaceStatusCodes::MARKET_PLACE_NOT_INITIALIZED); +        }          // Hide SLM related menu item          gMenuHolder->getChild<LLView>("MarketplaceListings")->setVisible(FALSE); diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h index b7bdf00157..a553bb79a2 100644 --- a/indra/newview/llviewermenu.h +++ b/indra/newview/llviewermenu.h @@ -83,7 +83,7 @@ BOOL enable_god_full(void* user_data);  BOOL enable_god_liaison(void* user_data);  BOOL enable_god_basic(void* user_data);  void set_underclothes_menu_options(); -void check_merchant_status(); +void check_merchant_status(bool force = false);  void exchange_callingcard(const LLUUID& dest_id); @@ -108,6 +108,7 @@ void handle_look_at_selection(const LLSD& param);  void handle_zoom_to_object(LLUUID object_id);  void handle_object_return();  void handle_object_delete(); +void handle_object_edit();  void handle_buy_land(); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 058477876b..f472db080f 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1639,7 +1639,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  			LLDiscardAgentOffer* discard_agent_offer = new LLDiscardAgentOffer(mFolderID, mObjectID);  			discard_agent_offer->startFetch(); -			if (catp || (itemp && itemp->isFinished())) +			if ((catp && gInventory.isCategoryComplete(mObjectID)) || (itemp && itemp->isFinished()))  			{  				discard_agent_offer->done();  			} @@ -4719,7 +4719,9 @@ void process_sound_trigger(LLMessageSystem *msg, void **)  {  	if (!gAudiop)  	{ +#if !LL_LINUX  		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +#endif  		return;  	} @@ -4781,7 +4783,9 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)  {  	if (!gAudiop)  	{ +#if !LL_LINUX  		LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL; +#endif  		return;  	} diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index 6666aecca2..2525886222 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -49,6 +49,8 @@ const std::string  GRID_UPDATE_SERVICE_URL = "update_query_url_base";  const std::string  GRID_HELPER_URI_VALUE = "helper_uri";  /// the splash page url  const std::string  GRID_LOGIN_PAGE_VALUE = "login_page"; +/// url for the web profile site +const std::string  GRID_WEB_PROFILE_VALUE = "web_profile_url";  /// internal data on system grids  const std::string  GRID_IS_SYSTEM_GRID_VALUE = "system_grid";  /// whether this is single or double names @@ -70,6 +72,8 @@ const std::string SL_UPDATE_QUERY_URL = "https://update.secondlife.com/update";  const std::string MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";  const std::string SYSTEM_GRID_APP_SLURL_BASE = "secondlife:///app"; +const std::string MAIN_GRID_WEB_PROFILE_URL = "https://my.secondlife.com/"; +  const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";  const char* DEFAULT_SLURL_BASE = "https://%s/region/";  const char* DEFAULT_APP_SLURL_BASE = "x-grid-location-info://%s/app"; @@ -125,6 +129,7 @@ void LLGridManager::initialize(const std::string& grid_file)  				  "https://secondlife.com/helpers/",  				  DEFAULT_LOGIN_PAGE,  				  SL_UPDATE_QUERY_URL, +				  MAIN_GRID_WEB_PROFILE_URL,  				  "Agni");  	addSystemGrid(LLTrans::getString("AditiGridLabel"),  				  "util.aditi.lindenlab.com", @@ -132,6 +137,7 @@ void LLGridManager::initialize(const std::string& grid_file)  				  "http://aditi-secondlife.webdev.lindenlab.com/helpers/",  				  DEFAULT_LOGIN_PAGE,  				  SL_UPDATE_QUERY_URL, +				  "https://my.aditi.lindenlab.com/",  				  "Aditi");  	LLSD other_grids; @@ -288,6 +294,10 @@ bool LLGridManager::addGrid(LLSD& grid_data)  				{  					grid_data[GRID_HELPER_URI_VALUE] = std::string("https://") + grid + "/helpers/";  				} +				if (!grid_data.has(GRID_WEB_PROFILE_VALUE)) +				{ +					grid_data[GRID_WEB_PROFILE_VALUE] = std::string("https://") + grid + "/"; +				}  				if (!grid_data.has(GRID_LOGIN_IDENTIFIER_TYPES))  				{ @@ -302,7 +312,8 @@ bool LLGridManager::addGrid(LLSD& grid_data)  										 <<"  id:          "<<grid_data[GRID_ID_VALUE].asString()<<"\n"  										 <<"  label:       "<<grid_data[GRID_LABEL_VALUE].asString()<<"\n"  										 <<"  login page:  "<<grid_data[GRID_LOGIN_PAGE_VALUE].asString()<<"\n" -										 <<"  helper page: "<<grid_data[GRID_HELPER_URI_VALUE].asString()<<"\n"; +										 <<"  helper page: "<<grid_data[GRID_HELPER_URI_VALUE].asString()<<"\n" +										 <<"  web profile: "<<grid_data[GRID_WEB_PROFILE_VALUE].asString()<<"\n";  				/* still in LL_DEBUGS */   				for (LLSD::array_const_iterator login_uris = grid_data[GRID_LOGIN_URI_VALUE].beginArray();  					 login_uris != grid_data[GRID_LOGIN_URI_VALUE].endArray(); @@ -339,6 +350,7 @@ void LLGridManager::addSystemGrid(const std::string& label,  								  const std::string& helper,  								  const std::string& login_page,  								  const std::string& update_url_base, +								  const std::string& web_profile_url,  								  const std::string& login_id)  {  	LLSD grid = LLSD::emptyMap(); @@ -349,6 +361,7 @@ void LLGridManager::addSystemGrid(const std::string& label,  	grid[GRID_LOGIN_URI_VALUE].append(login_uri);  	grid[GRID_LOGIN_PAGE_VALUE] = login_page;  	grid[GRID_UPDATE_SERVICE_URL] = update_url_base; +	grid[GRID_WEB_PROFILE_VALUE] = web_profile_url;  	grid[GRID_IS_SYSTEM_GRID_VALUE] = true;  	grid[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();  	grid[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT); @@ -535,6 +548,21 @@ std::string LLGridManager::getLoginPage()  	return login_page;  } +std::string LLGridManager::getWebProfileURL(const std::string& grid) +{ +	std::string web_profile_url; +	std::string grid_name = getGrid(grid); +	if (!grid_name.empty()) +	{ +		web_profile_url = mGridList[grid_name][GRID_WEB_PROFILE_VALUE].asString(); +	} +	else +	{ +		LL_WARNS("GridManager")<<"invalid grid '"<<grid<<"'"<<LL_ENDL; +	} +	return web_profile_url; +} +  void LLGridManager::getLoginIdentifierTypes(LLSD& idTypes)  {  	idTypes = mGridList[mGrid][GRID_LOGIN_IDENTIFIER_TYPES]; diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h index 8526c0ba7f..228303d8e2 100644 --- a/indra/newview/llviewernetwork.h +++ b/indra/newview/llviewernetwork.h @@ -166,6 +166,13 @@ class LLGridManager : public LLSingleton<LLGridManager>  	/// Return the application URL prefix for the selected grid  	std::string getAppSLURLBase() { return getAppSLURLBase(mGrid); }	 +	/// Return the url of the resident profile web site for the given grid +	std::string getWebProfileURL(const std::string& grid); + +	/// Return the url of the resident profile web site for the selected grid +	std::string getWebProfileURL() { return getWebProfileURL(mGrid); } + +  	//@}  	/* ================================================================ @@ -216,6 +223,7 @@ class LLGridManager : public LLSingleton<LLGridManager>  					   const std::string& helper,  					   const std::string& login_page,  					   const std::string& update_url_base, +					   const std::string& web_profile_url,  					   const std::string& login_id = "");	 diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 5edc3c9745..72a8595845 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -133,6 +133,7 @@ std::map<std::string, U32> LLViewerObject::sObjectDataMap;  // JC 3/18/2003  const F32 PHYSICS_TIMESTEP = 1.f / 45.f; +const F64 INV_REQUEST_EXPIRE_TIME_SEC = 60.f;  static LLTrace::BlockTimerStatHandle FTM_CREATE_OBJECT("Create Object"); @@ -245,7 +246,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe  	mInventory(NULL),  	mInventorySerialNum(0),  	mRegionp( regionp ), -	mInventoryPending(FALSE), +	mInvRequestExpireTime(0.f),  	mInventoryDirty(FALSE),  	mDead(FALSE),  	mOrphaned(FALSE), @@ -1434,10 +1435,14 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  					setChanged(MOVED | SILHOUETTE);  				} -				else if (mText.notNull()) +				else  				{ -					mText->markDead(); -					mText = NULL; +					if (mText.notNull()) +					{ +						mText->markDead(); +						mText = NULL; +					} +					mHudText.clear();  				}  				std::string media_url; @@ -1812,10 +1817,14 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  					setChanged(TEXTURE);  				} -				else if(mText.notNull()) +				else  				{ -					mText->markDead(); -					mText = NULL; +					if (mText.notNull()) +					{ +						mText->markDead(); +						mText = NULL; +					} +					mHudText.clear();  				}                  std::string media_url; @@ -2832,6 +2841,15 @@ void LLViewerObject::removeInventoryListener(LLVOInventoryListener* listener)  	}  } +BOOL LLViewerObject::isInventoryPending() +{ +    if (mInvRequestExpireTime == 0.f || mInvRequestExpireTime < LLFrameTimer::getTotalSeconds()) +    { +        return FALSE; +    } +    return TRUE; +} +  void LLViewerObject::clearInventoryListeners()  {  	for_each(mInventoryCallbacks.begin(), mInventoryCallbacks.end(), DeletePointer()); @@ -2870,7 +2888,7 @@ void LLViewerObject::requestInventory()  void LLViewerObject::fetchInventoryFromServer()  { -	if (!mInventoryPending) +	if (mInvRequestExpireTime == 0.f || mInvRequestExpireTime < LLFrameTimer::getTotalSeconds())  	{  		delete mInventory;  		LLMessageSystem* msg = gMessageSystem; @@ -2883,7 +2901,7 @@ void LLViewerObject::fetchInventoryFromServer()  		msg->sendReliable(mRegionp->getHost());  		// this will get reset by dirtyInventory or doInventoryCallback -		mInventoryPending = TRUE; +		mInvRequestExpireTime = LLFrameTimer::getTotalSeconds() + INV_REQUEST_EXPIRE_TIME_SEC;  	}  } @@ -3099,7 +3117,7 @@ void LLViewerObject::doInventoryCallback()  			mInventoryCallbacks.erase(curiter);  		}  	} -	mInventoryPending = FALSE; +	mInvRequestExpireTime = 0.f;  }  void LLViewerObject::removeInventory(const LLUUID& item_id) @@ -4990,8 +5008,26 @@ void LLViewerObject::initHudText()  void LLViewerObject::restoreHudText()  { -    if(mText) +    if (mHudText.empty()) +    { +        if (mText) +        { +            mText->markDead(); +            mText = NULL; +        } +    } +    else      { +        if (!mText) +        { +            initHudText(); +        } +        else +        { +            // Restore default values +            mText->setZCompare(TRUE); +            mText->setDoFade(TRUE); +        }          mText->setColor(mHudTextColor);          mText->setString(mHudText);      } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index cb8acfdcf8..b95190c554 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -437,7 +437,7 @@ public:  	// viewer object has the inventory stored locally.  	void registerInventoryListener(LLVOInventoryListener* listener, void* user_data);  	void removeInventoryListener(LLVOInventoryListener* listener); -	BOOL isInventoryPending() { return mInventoryPending; } +	BOOL isInventoryPending();  	void clearInventoryListeners();  	bool hasInventoryListeners();  	void requestInventory(); @@ -757,7 +757,7 @@ protected:  	S16 mInventorySerialNum;  	LLViewerRegion	*mRegionp;					// Region that this object belongs to. -	BOOL			mInventoryPending; +	F64				mInvRequestExpireTime;  	BOOL			mInventoryDirty;  	BOOL			mDead;  	BOOL			mOrphaned;					// This is an orphaned child diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp index 023f1b92ba..86591ff4df 100644 --- a/indra/newview/llvieweroctree.cpp +++ b/indra/newview/llvieweroctree.cpp @@ -465,7 +465,7 @@ LLViewerOctreeGroup::LLViewerOctreeGroup(OctreeNode* node)  {  	LLVector4a tmp;  	tmp.splat(0.f); -	mExtents[0] = mExtents[1] = mObjectBounds[0] = mObjectBounds[0] = mObjectBounds[1] =  +	mExtents[0] = mExtents[1] = mObjectBounds[0] = mObjectBounds[1] =   		mObjectExtents[0] = mObjectExtents[1] = tmp;  	mBounds[0] = node->getCenter(); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index ed719ae418..178aa1e646 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1200,7 +1200,7 @@ void LLViewerFetchedTexture::loadFromFastCache()              {                  S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS;                  S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; -                if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +                if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height))                  {                      // scale oversized icon, no need to give more work to gl                      mRawImage->scale(expected_width, expected_height); @@ -1981,7 +1981,7 @@ bool LLViewerFetchedTexture::updateFetch()                  {                      S32 expected_width = mKnownDrawWidth > 0 ? mKnownDrawWidth : DEFAULT_ICON_DIMENTIONS;                      S32 expected_height = mKnownDrawHeight > 0 ? mKnownDrawHeight : DEFAULT_ICON_DIMENTIONS; -                    if (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height) +                    if (mRawImage && (mRawImage->getWidth() > expected_width || mRawImage->getHeight() > expected_height))                      {                          // scale oversized icon, no need to give more work to gl                          mRawImage->scale(expected_width, expected_height); diff --git a/indra/newview/llviewerwearable.cpp b/indra/newview/llviewerwearable.cpp index 0f73515b5d..88eb13e7cd 100644 --- a/indra/newview/llviewerwearable.cpp +++ b/indra/newview/llviewerwearable.cpp @@ -451,7 +451,7 @@ void LLViewerWearable::copyDataFrom(const LLViewerWearable* src)  	// Probably reduntant, but ensure that the newly created wearable is not dirty by setting current value of params in new wearable  	// to be the same as the saved values (which were loaded from src at param->cloneParam(this)) -	revertValues(); +	revertValuesWithoutUpdate();  }  void LLViewerWearable::setItemID(const LLUUID& item_id) @@ -471,6 +471,11 @@ void LLViewerWearable::revertValues()  	}  } +void LLViewerWearable::revertValuesWithoutUpdate() +{ +	LLWearable::revertValues(); +} +  void LLViewerWearable::saveValues()  {  	LLWearable::saveValues(); diff --git a/indra/newview/llviewerwearable.h b/indra/newview/llviewerwearable.h index 62cd5e21ad..cc99f6af2f 100644 --- a/indra/newview/llviewerwearable.h +++ b/indra/newview/llviewerwearable.h @@ -85,6 +85,8 @@ public:  	/*virtual*/ void	revertValues();  	/*virtual*/ void	saveValues(); +	void 				revertValuesWithoutUpdate(); +  	// Something happened that requires the wearable's label to be updated (e.g. worn/unworn).  	/*virtual*/void		setUpdated() const; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index cd9ab3e672..4f4b33fa8c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -251,6 +251,11 @@ BOOL				gDisplayBadge = FALSE;  static const U8 NO_FACE = 255;  BOOL gQuietSnapshot = FALSE; +// Minimum value for UIScaleFactor, also defined in preferences, ui_scale_slider +static const F32 MIN_UI_SCALE = 0.75f; +// 2.0 in preferences, but win10 supports larger scaling and value is used more as +// sanity check, so leaving space for larger values from DPI updates. +static const F32 MAX_UI_SCALE = 7.0f;  static const F32 MIN_DISPLAY_SCALE = 0.75f;  std::string	LLViewerWindow::sSnapshotBaseName; @@ -1593,6 +1598,20 @@ BOOL LLViewerWindow::handleDeviceChange(LLWindow *window)  	return FALSE;  } +void LLViewerWindow::handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height) +{ +    if (ui_scale_factor >= MIN_UI_SCALE && ui_scale_factor <= MAX_UI_SCALE) +    { +        gSavedSettings.setF32("UIScaleFactor", ui_scale_factor); +        LLViewerWindow::reshape(window_width, window_height); +        mResDirty = true; +    } +    else +    { +        LL_WARNS() << "DPI change caused UI scale to go out of bounds: " << ui_scale_factor << LL_ENDL; +    } +} +  void LLViewerWindow::handlePingWatchdog(LLWindow *window, const char * msg)  {  	LLAppViewer::instance()->pingMainloopTimeout(msg); @@ -1655,7 +1674,8 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	mResDirty(false),  	mStatesDirty(false),  	mCurrResolutionIndex(0), -	mProgressView(NULL) +	mProgressView(NULL), +	mSystemUIScaleFactorChanged(false)  {  	// gKeyboard is still NULL, so it doesn't do LLWindowListener any good to  	// pass its value right now. Instead, pass it a nullary function that @@ -1743,9 +1763,24 @@ LLViewerWindow::LLViewerWindow(const Params& p)  		gSavedSettings.setS32("FullScreenHeight",scr.mY);      } + +	F32 system_scale_factor = mWindow->getSystemUISize(); +	if (system_scale_factor < MIN_UI_SCALE || system_scale_factor > MAX_UI_SCALE) +	{ +		// reset to default; +		system_scale_factor = 1.f; +	} +	if (p.first_run || gSavedSettings.getF32("LastSystemUIScaleFactor") != system_scale_factor) +	{ +		mSystemUIScaleFactorChanged = !p.first_run; +		gSavedSettings.setF32("LastSystemUIScaleFactor", system_scale_factor); +		gSavedSettings.setF32("UIScaleFactor", system_scale_factor); +	} + +  	// Get the real window rect the window was created with (since there are various OS-dependent reasons why  	// the size of a window or fullscreen context may have been adjusted slightly...) -	F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); +	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);  	mDisplayScale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));  	mDisplayScale *= ui_scale_factor; @@ -1838,6 +1873,28 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);  } +//static +void LLViewerWindow::showSystemUIScaleFactorChanged() +{ +	LLNotificationsUtil::add("SystemUIScaleFactorChanged", LLSD(), LLSD(), onSystemUIScaleFactorChanged); +} + +//static +bool LLViewerWindow::onSystemUIScaleFactorChanged(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if(option == 0) +	{ +		LLFloaterReg::toggleInstanceOrBringToFront("preferences"); +		LLFloater* pref_floater = LLFloaterReg::getInstance("preferences"); +		LLTabContainer* tab_container = pref_floater->getChild<LLTabContainer>("pref core"); +		tab_container->selectTabByName("advanced1"); + +	} +	return false;  +} + +  void LLViewerWindow::initGLDefaults()  {  	gGL.setSceneBlendType(LLRender::BT_ALPHA); @@ -5211,7 +5268,7 @@ F32	LLViewerWindow::getWorldViewAspectRatio() const  void LLViewerWindow::calcDisplayScale()  { -	F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); +	F32 ui_scale_factor = llclamp(gSavedSettings.getF32("UIScaleFactor"), MIN_UI_SCALE, MAX_UI_SCALE);  	LLVector2 display_scale;  	display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));  	display_scale *= ui_scale_factor; @@ -5224,7 +5281,7 @@ void LLViewerWindow::calcDisplayScale()  	if (display_scale != mDisplayScale)  	{ -		LL_INFOS() << "Setting display scale to " << display_scale << LL_ENDL; +		LL_INFOS() << "Setting display scale to " << display_scale << " for ui scale: " << ui_scale_factor << LL_ENDL;  		mDisplayScale = display_scale;  		// Init default fonts diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index cdf5b686a7..72b7370621 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -156,7 +156,8 @@ public:  									min_width,  									min_height;  		Optional<bool>				fullscreen, -									ignore_pixel_depth; +									ignore_pixel_depth, +									first_run;  		Params();  	}; @@ -210,6 +211,7 @@ public:  	/*virtual*/ void handleDataCopy(LLWindow *window, S32 data_type, void *data);  	/*virtual*/ BOOL handleTimerEvent(LLWindow *window);  	/*virtual*/ BOOL handleDeviceChange(LLWindow *window); +	/*virtual*/ void handleDPIChanged(LLWindow *window, F32 ui_scale_factor, S32 window_width, S32 window_height);  	/*virtual*/ void handlePingWatchdog(LLWindow *window, const char * msg);  	/*virtual*/ void handlePauseWatchdog(LLWindow *window); @@ -415,6 +417,9 @@ public:  	void			calcDisplayScale();  	static LLRect 	calcScaledRect(const LLRect & rect, const LLVector2& display_scale); +	bool getSystemUIScaleFactorChanged() { return mSystemUIScaleFactorChanged; } +	static void showSystemUIScaleFactorChanged(); +  private:  	bool                    shouldShowToolTipFor(LLMouseHandler *mh); @@ -428,6 +433,7 @@ private:  	S32				getChatConsoleBottomPad(); // Vertical padding for child console rect, varied by bottom clutter  	LLRect			getChatConsoleRect(); // Get optimal cosole rect. +	static bool onSystemUIScaleFactorChanged(const LLSD& notification, const LLSD& response);  private:  	LLWindow*		mWindow;						// graphical window object  	bool			mActive; @@ -506,6 +512,7 @@ private:  	LLPointer<LLViewerObject>	mDragHoveredObject;  	static LLTrace::SampleStatHandle<>	sMouseVelocityStat; +	bool mSystemUIScaleFactorChanged; // system UI scale factor changed from last run  };  // diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index cdc7e20c2c..f79249d6fa 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -186,6 +186,7 @@ const F32 NAMETAG_VERTICAL_SCREEN_OFFSET = 25.f;  const F32 NAMETAG_VERT_OFFSET_WEIGHT = 0.17f;  const U32 LLVOAvatar::VISUAL_COMPLEXITY_UNKNOWN = 0; +const F64 HUD_OVERSIZED_TEXTURE_DATA_SIZE = 1024 * 1024;  enum ERenderName  { @@ -7391,16 +7392,13 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	// No backsies zone - if we get here, the message should be valid and usable, will be processed.      LL_INFOS("Avatar") << "Processing appearance message version " << thisAppearanceVersion << LL_ENDL; -    if (isSelf()) -    { -        // Note: -        // locally the COF is maintained via LLInventoryModel::accountForUpdate -        // which is called from various places.  This should match the simhost's  -        // idea of what the COF version is.  AIS however maintains its own version -        // of the COF that should be considered canonical.  -        mLastUpdateReceivedCOFVersion = thisAppearanceVersion; -    } -		 +    // Note: +    // locally the COF is maintained via LLInventoryModel::accountForUpdate +    // which is called from various places.  This should match the simhost's  +    // idea of what the COF version is.  AIS however maintains its own version +    // of the COF that should be considered canonical.  +    mLastUpdateReceivedCOFVersion = thisAppearanceVersion; +      if (applyParsedTEMessage(contents.mTEContents) > 0 && isChanged(TEXTURE))      {          updateVisualComplexity(); @@ -8356,6 +8354,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()  	{  		U32 cost = VISUAL_COMPLEXITY_UNKNOWN;  		LLVOVolume::texture_cost_t textures; +		LLHUDComplexity hud_complexity;  		for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)  		{ @@ -8432,6 +8431,55 @@ void LLVOAvatar::calculateUpdateRenderComplexity()  						}  					}  				} +                if (isSelf() +                    && attached_object +                    && attached_object->isHUDAttachment() +                    && attached_object->mDrawable) +                { +                    textures.clear(); + +                    const LLVOVolume* volume = attached_object->mDrawable->getVOVolume(); +                    if (volume) +                    { +                        // get cost and individual textures +                        hud_complexity.objectsCost += volume->getRenderCost(textures); +                        hud_complexity.objectsCount++; + +                        LLViewerObject::const_child_list_t& child_list = attached_object->getChildren(); +                        for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); +                            iter != child_list.end(); ++iter) +                        { +                            LLViewerObject* childp = *iter; +                            const LLVOVolume* chld_volume = dynamic_cast<LLVOVolume*>(childp); +                            if (chld_volume) +                            { +                                // get cost and individual textures +                                hud_complexity.objectsCost += chld_volume->getRenderCost(textures); +                                hud_complexity.objectsCount++; +                            } +                        } + +                        hud_complexity.texturesCount += textures.size(); + +                        for (LLVOVolume::texture_cost_t::iterator volume_texture = textures.begin(); +                            volume_texture != textures.end(); +                            ++volume_texture) +                        { +                            // add the cost of each individual texture (ignores duplicates) +                            hud_complexity.texturesCost += volume_texture->second; +                            LLViewerFetchedTexture *tex = LLViewerTextureManager::getFetchedTexture(volume_texture->first); +                            if (tex) +                            { +                                F64 size = tex->getMaxVirtualSize(); // in pixels +                                hud_complexity.texturesSizeTotal += size; +                                if (size >= HUD_OVERSIZED_TEXTURE_DATA_SIZE) +                                { +                                    hud_complexity.largeTexturesCount++; +                                } +                            } +                        } +                    } +                }  			}  		} @@ -8493,11 +8541,15 @@ void LLVOAvatar::calculateUpdateRenderComplexity()          static LLCachedControl<U32> show_my_complexity_changes(gSavedSettings, "ShowMyComplexityChanges", 20); -		if (isSelf() && show_my_complexity_changes) -		{ -			LLAvatarRenderNotifier::getInstance()->updateNotificationAgent(mVisualComplexity); -		} -	} +        if (isSelf() && show_my_complexity_changes) +        { +            // Avatar complexity +            LLAvatarRenderNotifier::getInstance()->updateNotificationAgent(mVisualComplexity); + +            // HUD complexity +            LLHUDRenderNotifier::getInstance()->updateNotificationHUD(hud_complexity); +        } +    }  }  void LLVOAvatar::setVisualMuteSettings(VisualMuteSettings set) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index e69a8d1d1d..4aef6480cb 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -86,6 +86,7 @@ BOOL gAnimateTextures = TRUE;  //extern BOOL gHideSelectedObjects;  F32 LLVOVolume::sLODFactor = 1.f; +F32 LLVOVolume::sRiggedFactorMultiplier = 6.f;  F32	LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop   F32 LLVOVolume::sDistanceFactor = 1.0f;  S32 LLVOVolume::sNumLODChanges = 0; @@ -1213,18 +1214,18 @@ void LLVOVolume::sculpt()  	}  } -S32	LLVOVolume::computeLODDetail(F32 distance, F32 radius) +S32	LLVOVolume::computeLODDetail(F32 distance, F32 radius, F32 lod_factor)  {  	S32	cur_detail;  	if (LLPipeline::sDynamicLOD)  	{  		// We've got LOD in the profile, and in the twist.  Use radius. -		F32 tan_angle = (LLVOVolume::sLODFactor*radius)/distance; +		F32 tan_angle = (lod_factor*radius) / distance;  		cur_detail = LLVolumeLODGroup::getDetailFromTan(ll_round(tan_angle, 0.01f));  	}  	else  	{ -		cur_detail = llclamp((S32) (sqrtf(radius)*LLVOVolume::sLODFactor*4.f), 0, 3);		 +		cur_detail = llclamp((S32)(sqrtf(radius)*lod_factor*4.f), 0, 3);  	}  	return cur_detail;  } @@ -1240,6 +1241,7 @@ BOOL LLVOVolume::calcLOD()  	F32 radius;  	F32 distance; +	F32 lod_factor = LLVOVolume::sLODFactor;  	if (mDrawable->isState(LLDrawable::RIGGED))  	{ @@ -1251,22 +1253,38 @@ BOOL LLVOVolume::calcLOD()  			return FALSE;  		} +		// Note: when changing, take note that a lot of rigged meshes have only one LOD. +		lod_factor *= LLVOVolume::sRiggedFactorMultiplier;  		distance = avatar->mDrawable->mDistanceWRTCamera; -		radius = avatar->getBinRadius(); +		F32 avatar_radius = avatar->getBinRadius(); +		F32 object_radius; +		if (mDrawable.notNull() && !mDrawable->isDead()) +		{ +			const LLVector4a* ext = mDrawable->getSpatialExtents(); +			LLVector4a diff; +			diff.setSub(ext[1], ext[0]); +			object_radius = diff.getLength3().getF32(); +		} +		else +		{ +			object_radius = getVolume() ? getVolume()->mLODScaleBias.scaledVec(getScale()).length() : getScale().length(); +		} +		radius = object_radius * LLVOVolume::sRiggedFactorMultiplier; +		radius = llmin(radius, avatar_radius);  	}  	else  	{  		distance = mDrawable->mDistanceWRTCamera;  		radius = getVolume() ? getVolume()->mLODScaleBias.scaledVec(getScale()).length() : getScale().length();  	} -	 +  	//hold onto unmodified distance for debugging  	//F32 debug_distance = distance; -	 +  	distance *= sDistanceFactor; -	F32 rampDist = LLVOVolume::sLODFactor * 2; -	 +	F32 rampDist = lod_factor * 2; +  	if (distance < rampDist)  	{  		// Boost LOD when you're REALLY close @@ -1279,7 +1297,8 @@ BOOL LLVOVolume::calcLOD()  	distance *= F_PI/3.f;  	cur_detail = computeLODDetail(ll_round(distance, 0.01f),  -									ll_round(radius, 0.01f)); +									ll_round(radius, 0.01f), +									lod_factor);  	if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_LOD_INFO) && @@ -1753,7 +1772,10 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)  		dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1));  		compiled = TRUE;  		lodOrSculptChanged(drawable, compiled); -		genBBoxes(FALSE); +		if (!mLODChanged) +		{ +			genBBoxes(FALSE); +		}  	}  	// it has its own drawable (it's moved) or it has changed UVs or it has changed xforms from global<->local  	else @@ -4429,7 +4451,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,  	LL_RECORD_BLOCK_TIME(FTM_REGISTER_FACE);  	if (type == LLRenderPass::PASS_ALPHA && facep->getTextureEntry()->getMaterialParams().notNull() && !facep->getVertexBuffer()->hasDataType(LLVertexBuffer::TYPE_TANGENT))  	{ -		LL_WARNS("RenderMaterials") << "Oh no! No binormals for this alpha blended face!" << LL_ENDL; +		LL_WARNS_ONCE("RenderMaterials") << "Oh no! No binormals for this alpha blended face!" << LL_ENDL;  	}  	if (facep->getViewerObject()->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects) diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index a331908320..ca9917069b 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -327,7 +327,7 @@ public:  	void clearRiggedVolume();  protected: -	S32	computeLODDetail(F32	distance, F32 radius); +	S32	computeLODDetail(F32	distance, F32 radius, F32 lod_factor);  	BOOL calcLOD();  	LLFace* addFace(S32 face_index);  	void updateTEData(); @@ -379,6 +379,7 @@ private:  public:  	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop  	static F32 sLODFactor;				// LOD scale factor +	static F32 sRiggedFactorMultiplier;	// Worn rigged LOD scale factor multiplier  	static F32 sDistanceFactor;			// LOD distance factor  	static LLPointer<LLObjectMediaDataClient> sObjectMediaClient; diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp index 066cb9a0ac..482a2a61e2 100644 --- a/indra/newview/llwlparamset.cpp +++ b/indra/newview/llwlparamset.cpp @@ -288,14 +288,6 @@ void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)  {  	// set up the iterators -	// keep cloud positions and coverage the same -	/// TODO masking will do this later -	F32 cloudPos1X = (F32) mParamValues["cloud_pos_density1"][0].asReal(); -	F32 cloudPos1Y = (F32) mParamValues["cloud_pos_density1"][1].asReal(); -	F32 cloudPos2X = (F32) mParamValues["cloud_pos_density2"][0].asReal(); -	F32 cloudPos2Y = (F32) mParamValues["cloud_pos_density2"][1].asReal(); -	F32 cloudCover = (F32) mParamValues["cloud_shadow"][0].asReal(); -  	LLSD srcVal;  	LLSD destVal; @@ -379,15 +371,6 @@ void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)  	setSunAngle((1 - weight) * srcSunAngle + weight * destSunAngle);  	setEastAngle((1 - weight) * srcEastAngle + weight * destEastAngle); -	 -	// now setup the sun properly - -	// reset those cloud positions -	mParamValues["cloud_pos_density1"][0] = cloudPos1X; -	mParamValues["cloud_pos_density1"][1] = cloudPos1Y; -	mParamValues["cloud_pos_density2"][0] = cloudPos2X; -	mParamValues["cloud_pos_density2"][1] = cloudPos2Y; -	mParamValues["cloud_shadow"][0] = cloudCover;  }  void LLWLParamSet::updateCloudScrolling(void)  diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index 97a9eb7f5f..cc3645131d 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -322,7 +322,7 @@ public:          mBoundListener =              LLEventPumps::instance().              obtain("mainloop"). -            listen(LLEventPump::inventName(), boost::bind(&Poller::poll, this, _1)); +            listen(LLEventPump::ANONYMOUS, boost::bind(&Poller::poll, this, _1));          LL_INFOS("LLXMLRPCListener") << mMethod << " request sent to " << mUri << LL_ENDL;      } diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index a9a4913b21..30ad0a0288 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -774,6 +774,9 @@ with the same filename but different name    <texture name="default_land_picture.j2c" />    <texture name="default_profile_picture.j2c" />    <texture name="locked_image.j2c" /> +  <texture name="badge_note.j2c" /> +  <texture name="badge_warn.j2c" /> +  <texture name="badge_ok.j2c" />    <texture name="materials_ui_x_24.png" />    <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml index d3d85de3c3..b0cb1e0592 100644 --- a/indra/newview/skins/default/xui/de/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>  	<panel.string name="buycurrencylabel">[AMT] L$</panel.string> -	<panel left="-415" name="balance_bg" width="205"> +	<panel left="-436" name="balance_bg" width="205">  		<text name="balance" tool_tip="Klicken, um L$-Guthaben zu aktualisieren" value="L$ ??"/>  		<button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>  		<button label="Einkaufen" name="goShop" tool_tip="Second Life-Marktplatz öffnen" width="85"/> diff --git a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml index 2bd3aa8bcc..c6b91a8b2f 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences_graphics_advanced.xml @@ -117,7 +117,7 @@    <slider      control_name="IndirectMaxComplexity" -    tool_tip="Controls at what point a visually complex avatar is drawn as a jelly doll" +    tool_tip="Controls at what point a visually complex avatar is drawn as a JellyDoll"      follows="left|top"      height="16"      initial_value="101" diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index af62c7a9bc..225266af86 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -21,14 +21,6 @@       name="screenshot"       top="15"       width="220" /> -    <check_box -     height="15" -     label="Use this screenshot" -     layout="topleft" -     left="8" -     name="screen_check" -     top_pad="-12" -     width="116" />      <text       type="string"       length="1" @@ -39,7 +31,7 @@       layout="topleft"       left="10"       name="reporter_title" -     top_pad="0" +     top_pad="-2"       width="100">          Reporter:      </text> diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 5d05ecf127..550af03683 100644 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -10,6 +10,7 @@        <file>ArialUni.ttf</file>      </os>      <os name="Mac"> +      <file>ヒラギノ角ゴシック W3.ttc</file>          <file>ヒラギノ角ゴ Pro W3.otf</file>        <file>ヒラギノ角ゴ ProN W3.otf</file>        <file>ヒラギノ明朝 ProN W3.ttc</file> diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml index 324ff3eabd..a69585074c 100644 --- a/indra/newview/skins/default/xui/en/inspect_group.xml +++ b/indra/newview/skins/default/xui/en/inspect_group.xml @@ -66,7 +66,7 @@ Fear the moose!  Fear it!  And the mongoose too!     width="220">  L$123 to join    </text> -  <icon +  <group_icon       follows="all"       height="38"       right="-10" diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml index 44b2727671..75c1de24aa 100644 --- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml @@ -28,6 +28,13 @@           function="Wearing.Edit" />      </menu_item_call>      <menu_item_call +     label="Edit" +     layout="topleft" +     name="edit_item"> +        <on_click +         function="Wearing.EditItem" /> +    </menu_item_call> +    <menu_item_call       label="Show Original"       layout="topleft"       name="show_original"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index b2425649a4..79ee35fe3e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -832,6 +832,13 @@ If you no longer wish to have these abilities granted to this role, disable them    </notification>    <notification +    icon="notify.tga" +    name="GroupBanUserOnBanlist" +    type="notify"> +Some residents have not been sent an invite due to being banned from the group. +  </notification> + +  <notification     icon="alertmodal.tga"     name="AttachmentDrop"     type="alertmodal"> @@ -1476,6 +1483,7 @@ Save Changes?     icon="alertmodal.tga"     name="DeleteNotecard"     type="alertmodal"> +   <unique/>  Delete Notecard?      <tag>confirm</tag>      <usetemplate @@ -1631,52 +1639,14 @@ Visit [_URL] for more information?    <notification     icon="alertmodal.tga" -   name="IntelOldDriver" +   name="OldGPUDriver"     type="alertmodal">       There is likely a newer driver for your graphics chip.  Updating graphics drivers can substantially improve performance. -    Visit [_URL] to check for driver updates? -    <tag>confirm</tag> -    <url option="0" name="url"> -      http://www.intel.com/p/en_US/support/detect/graphics -    </url> -    <usetemplate -     ignoretext="My graphics driver is out of date" -     name="okcancelignore" -     notext="No" -     yestext="Yes"/> -    <tag>fail</tag> -  </notification> - -  <notification -   icon="alertmodal.tga" -   name="AMDOldDriver" -   type="alertmodal"> -    There is likely a newer driver for your graphics chip.  Updating graphics drivers can substantially improve performance. - -    Visit [_URL] to check for driver updates? -    <tag>confirm</tag> -    <url option="0" name="url"> -      http://support.amd.com/us/Pages/AMDSupportHub.aspx -    </url> -    <usetemplate -     ignoretext="My graphics driver is out of date" -     name="okcancelignore" -     notext="No" -     yestext="Yes"/> -    <tag>fail</tag> -  </notification> - -  <notification - icon="alertmodal.tga" - name="NVIDIAOldDriver" - type="alertmodal"> -    There is likely a newer driver for your graphics chip.  Updating graphics drivers can substantially improve performance. - -    Visit [_URL] to check for driver updates? +    Visit [URL] to check for driver updates?      <tag>confirm</tag>      <url option="0" name="url"> -      http://www.nvidia.com/Download/index.aspx?lang=en-us +    [URL]      </url>      <usetemplate       ignoretext="My graphics driver is out of date" @@ -1686,7 +1656,6 @@ Visit [_URL] for more information?      <tag>fail</tag>    </notification> -    <notification     icon="alertmodal.tga"     name="UnknownGPU" @@ -3349,6 +3318,23 @@ Your [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Renderin       <context>AgentComplexityNotice</context>     </unique>  Your [https://community.secondlife.com/t5/English-Knowledge-Base/Avatar-Rendering-Complexity/ta-p/2967838 avatar complexity] is [AGENT_COMPLEXITY]. +    <usetemplate +     ignoretext="Warn me about my avatar complexity changes" +     name="notifyignore"/> +  </notification> + +  <notification +   icon = "notifytip.tga" +   name = "HUDComplexityWarning" +   type = "notifytip" +   log_to_chat = "false"> +    <unique combine = "cancel_old"> +      <context>HUDComplexityWarning</context> +    </unique> +    [HUD_REASON], it is likely to negatively affect your performance. +    <usetemplate +     ignoretext="Warn me when my HUD complexity is too high" +     name="notifyignore"/>    </notification>    <notification @@ -3665,6 +3651,13 @@ Can't add estate owner to estate 'Banned Resident' list.    <notification     icon="alertmodal.tga" +   name="ProblemAddingEstateManagerBanned" +   type="alertmodal"> +Unable to add banned resident to estate manager list. +  </notification> + +  <notification +   icon="alertmodal.tga"     name="CanNotChangeAppearanceUntilLoaded"     type="alertmodal">  Can't change appearance until clothing and shape are loaded. @@ -4059,6 +4052,18 @@ Do you want to open your Web browser to view this content?    <notification     icon="alertmodal.tga" +   name="SystemUIScaleFactorChanged" +   type="alertmodal"> +System UI size factor has changed since last run. Do you want to open UI size adjustment settings page? +    <tag>confirm</tag> +    <usetemplate +     name="okcancelbuttons" +     notext="Cancel" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="WebLaunchJoinNow"     type="alertmodal">  Go to your [http://secondlife.com/account/ Dashboard] to manage your account? @@ -4178,6 +4183,14 @@ Leave Group?    </notification>    <notification +   icon="notify.tga" +   name="GroupDepart" +   type="notify"> +You have left the group '[group_name]'. +    <tag>group</tag> +  </notification> + +  <notification     icon="alertmodal.tga"     name="OwnerCannotLeaveGroup"     type="alertmodal"> @@ -4189,6 +4202,17 @@ Leave Group?    </notification>    <notification +   icon="alertmodal.tga" +   name="GroupDepartError" +   type="alertmodal"> +    Unable to leave group. +    <tag>group</tag> +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification     icon="alert.tga"     name="ConfirmKick"     type="alert"> @@ -5310,6 +5334,17 @@ There are too many prims selected.  Please select [MAX_PRIM_COUNT] or fewer prim  	</notification>  	<notification +	  icon="alertmodal.tga" +	  name="TooManyScriptsSelected" +	  type="alertmodal"> +Too many scripts in the objects selected.  Please select fewer objects and try again +  <tag>fail</tag> +		<usetemplate +		 name="okbutton" +		 yestext="OK"/> +	</notification> + +	<notification     icon="alertmodal.tga"     name="ProblemImportingEstateCovenant"     type="alertmodal"> @@ -5728,6 +5763,17 @@ Warning: The 'Pay object' click action has been set, but it will only    <notification     icon="alertmodal.tga" +   name="PaymentBlockedButtonMismatch" +   type="alertmodal"> +    Payment stopped:  the price paid does not match any of the pay buttons set for this object. +    <tag>fail</tag> +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="OpenObjectCannotCopy"     type="alertmodal">  There are no items in this object that you are allowed to copy. @@ -5830,7 +5876,20 @@ You cannot undo this action.       notext="Cancel"       yestext="Unlink"/>    </notification> - +   +  <notification +   icon="alertmodal.tga" +   name="HelpReportAbuseConfirm" +   type="alertmodal"> +   <unique/> +Thank you for taking the time to inform us of this issue.  +We will review your report for possible violations and take +the appropriate action. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> +      <notification     icon="alertmodal.tga"     name="HelpReportAbuseSelectCategory" @@ -6901,6 +6960,15 @@ This area has building disabled. You can't build or rez objects here.    </notification>    <notification +   icon="notify.tga" +   name="AutopilotCanceled" +   persist="true" +   type="notify"> +    <unique/> +Autopilot canceled +  </notification> + +  <notification       icon="notify.tga"       name="PathfindingDirty"       persist="true" @@ -7339,7 +7407,8 @@ Your object named <nolink>[OBJECTFROMNAME]</nolink> has given you th     name="TeleportOffered_MaturityExceeded"     log_to_im="true"     log_to_chat="false" -   type="offer"> +   type="offer" +   sound="UISndNewIncomingIMSession">  [NAME_SLURL] has offered to teleport you to their location:  “[MESSAGE]” @@ -7364,7 +7433,8 @@ This region contains [REGION_CONTENT_MATURITY] content, but your current prefere     name="TeleportOffered_MaturityBlocked"     log_to_im="true"     log_to_chat="false" -   type="notifytip"> +   type="notifytip" +   sound="UISndNewIncomingIMSession">  [NAME_SLURL] has offered to teleport you to their location:  “[MESSAGE]” @@ -8804,23 +8874,6 @@ Click and drag anywhere on the world to rotate your view    </notification>    <notification -  name="PopupAttempt" -  icon="Popup_Caution" -  type="browser"> -    A pop-up was prevented from opening. -    <form name="form"> -      <ignore name="ignore" -              control="MediaEnablePopups" -              invert_control="true" -              text="Enable all pop-ups"/> -      <button default="true" -              index="0" -              name="open" -              text="Open pop-up window"/> -    </form> -  </notification> - -  <notification     icon="alertmodal.tga"     name="SOCKS_NOT_PERMITTED"     type="alertmodal"> @@ -9802,6 +9855,14 @@ Can't move object '[OBJECT_NAME]' to    <notification     icon="alertmodal.tga" +   name="NoParcelPermsNoObject" +   type="notify"> +   <tag>fail</tag> +Copy failed because you lack access to that parcel. +  </notification> + +  <notification +   icon="alertmodal.tga"     name="CantMoveObjectRegionVersion"     type="notify">     <tag>fail</tag> @@ -9837,6 +9898,17 @@ You don't have permission to modify that object    <notification     icon="alertmodal.tga" +   name="TooMuchObjectInventorySelected" +   type="alertmodal"> +    <tag>fail</tag> +    Too many objects with large inventory are selected. Please select fewer objects and try again. +    <usetemplate +     name="okbutton" +     yestext="OK"/> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="CantEnablePhysObjContributesToNav"     type="notify">     <tag>fail</tag> @@ -9934,6 +10006,22 @@ Cannot save to object contents: This would modify the attachment permissions.    <notification     icon="alertmodal.tga" +   name="AttachmentHasTooMuchInventory" +   type="notify"> +   <tag>fail</tag> +Your attachments contain too much inventory to add more. +  </notification> + +  <notification +   icon="alertmodal.tga" +   name="IllegalAttachment" +   type="notify"> +   <tag>fail</tag> +The attachment has requested a nonexistent point on the avatar. It has been attached to the chest instead. +  </notification> + +  <notification +   icon="alertmodal.tga"     name="TooManyScripts"     type="notify">     <tag>fail</tag> @@ -10972,6 +11060,14 @@ Money transfers to objects are currently disabled in this region.    <notification     icon="alertmodal.tga" +   name="DroppedMoneyTransferRequest" +   type="notify"> +   <tag>fail</tag> +Unable to make payment due to system load. +  </notification> + +  <notification +   icon="alertmodal.tga"     name="CantPayNoAgent"     type="notify">     <tag>fail</tag> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml index d85b778db2..42a7974316 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml @@ -9,6 +9,26 @@   name="Wearing"   top="0"   width="312"> +<panel.string +    name="no_attachments"> +    No attachments worn. +   </panel.string> +     <accordion +     fit_parent="true" +     follows="all" +     height="400" +     layout="topleft" +     left="0" +     single_expansion="true" +     top="0" +     name="wearables_accordion" +     background_visible="true" +     bg_alpha_color="DkGray2" +     width="309"> +     <accordion_tab +     layout="topleft" +     name="tab_wearables" +     title="Wearables">      <wearable_items_list       follows="all"       height="400" @@ -20,6 +40,27 @@       top="0"       width="309"       worn_indication_enabled="false" /> +     </accordion_tab> +     <accordion_tab +     layout="topleft" +     name="tab_temp_attachments" +     title="Temporary attachments"> +    <scroll_list +     draw_heading="false" +     left="3" +     width="309" +     height="400" +     follows="all" +     name="temp_attachments_list"> +        <scroll_list.columns +         name="icon" +         width="15" /> +        <scroll_list.columns +         name="text" +         width="210" /> +  </scroll_list> +     </accordion_tab> +     </accordion>      <panel       background_visible="true"       follows="bottom|left|right" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index a9b8e197bc..e002d9dee1 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -233,7 +233,7 @@    <slider      control_name="IndirectMaxComplexity" -    tool_tip="Controls at what point a visually complex avatar is drawn as a jelly doll" +    tool_tip="Controls at what point a visually complex avatar is drawn as a JellyDoll"      follows="left|top"      height="16"      initial_value="101" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 0b605cf6f7..c20f9b2c51 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -273,6 +273,18 @@      name="update_willing_to_test"      width="400"                 top_pad="5"/> +  <check_box +    top_delta="4" +    enabled="true" +    follows="left|top" +    height="14" +    control_name="UpdaterShowReleaseNotes" +    label="Show Release Notes after update" +    left_delta="0" +    mouse_opaque="true" +    name="update_show_release_notes" +    width="400" +    top_pad="5"/>    <text       type="string"       length="1" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index cae76ac345..6bcf5c791f 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2500,6 +2500,13 @@ This feature is currently in Beta. Please add your name to this [http://goo.gl/f    <string name="av_render_most_of">You may not be rendered by most of those around you.</string>    <string name="av_render_anyone">You may not be rendered by anyone around you.</string> +  <!-- HUD complexity rendering messages, see llavatarrendernotifier. --> +  <string name="hud_render_memory_warning">Your HUD uses a lot of texture memory</string> +  <string name="hud_render_cost_warning">Your HUD contains a lot of expensive objects and textures</string> +  <string name="hud_render_heavy_textures_warning">Your HUD contains a lot of large textures</string> +  <string name="hud_render_cramped_warning">Your HUD contains too many objects</string> +  <string name="hud_render_textures_warning">Your HUD contains too many textures</string> +    <!-- AgeYearsA = singular,         AgeYearsB = plural,         AgeYearsC = plural for non-English languages like Russian @@ -2567,7 +2574,8 @@ This feature is currently in Beta. Please add your name to this [http://goo.gl/f  	<string name="SaveComplete">Save complete.</string>  	<string name="UploadFailed">File upload failed: </string>  	<string name="ObjectOutOfRange">Script (object out of range)</string> - +	<string name="ScriptWasDeleted">Script (deleted from inventory)</string> +	  	<!-- god tools -->  	<string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string> @@ -2835,6 +2843,12 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh  	<string name="Multiple Media">Multiple Media</string>  	<string name="Play Media">Play/Pause Media</string> +	<!-- Drivers support/update pages --> +	<string name="IntelDriverPage">http://www.intel.com/p/en_US/support/detect/graphics</string> +	<string name="NvidiaDriverPage">http://www.nvidia.com/Download/index.aspx?lang=en-us</string> +	<string name="AMDDriverPage">http://support.amd.com/us/Pages/AMDSupportHub.aspx</string> + +  	<!-- OSMessageBox messages -->  	<string name="MBCmdLineError">  		An error was found parsing the command line. diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml index 8ea56c5262..8aaa236475 100644 --- a/indra/newview/skins/default/xui/es/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>  	<panel.string name="buycurrencylabel">[AMT] L$</panel.string> -	<panel left="-410" name="balance_bg" width="200"> +	<panel left="-431" name="balance_bg" width="200">  		<text name="balance" tool_tip="Haz clic para actualizar tu saldo en L$" value="L$??"/>  		<button label="Comprar L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>  		<button label="Comprar" name="goShop" tool_tip="Abrir el mercado de Second Life" width="80"/> diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml index e2f05a525e..fef0379c2c 100644 --- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[weekday, datetime, slt] [sday, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>  	<panel.string name="buycurrencylabel">[AMT] L$</panel.string> -	<panel left="-405" name="balance_bg" width="195"> +	<panel left="-426" name="balance_bg" width="195">  		<text name="balance" tool_tip="Cliquer sur ce bouton pour actualiser votre solde en L$." value="L$ ??"/>  		<button label="Acheter L$" name="buyL" tool_tip="Cliquer pour acheter plus de L$."/>  		<button label="Achats" name="goShop" tool_tip="Ouvrir la Place du marché Second Life." width="75"/> diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml index 83d2ae5bab..295ca8d9f2 100644 --- a/indra/newview/skins/default/xui/it/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>  	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string> -	<panel left="-405" name="balance_bg" width="195"> +	<panel left="-426" name="balance_bg" width="195">  		<text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ ??"/>  		<button label="Acquista L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>  		<button label="Acquisti" name="goShop" tool_tip="Apri Mercato Second Life" width="75"/> diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml index 2e1446d450..3f3845e491 100644 --- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[year, datetime, slt] [month, datetime, slt] [day, datetime, slt] ([weekday, datetime, slt])</panel.string>  	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string> -	<panel left="-370" name="balance_bg" width="160"> +	<panel left="-391" name="balance_bg" width="160">  		<text name="balance" tool_tip="クリックして L$ 残高を更新" value="L$??"/>  		<button label="L$ の購入" name="buyL" tool_tip="クリックして L$ を購入します"/>  		<button label="店" name="goShop" tool_tip="Second Life マーケットプレイスを開く" width="40"/> diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml index cfe52ff404..c35863734f 100644 --- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>  	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string> -	<panel left="-410" name="balance_bg" width="200"> +	<panel left="-431" name="balance_bg" width="200">  		<text name="balance" tool_tip="Atualizar saldo de L$" value="L$??"/>  		<button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>  		<button label="Comprar" name="goShop" tool_tip="Abrir Mercado do Second Life" width="80"/> diff --git a/indra/newview/skins/default/xui/ru/panel_status_bar.xml b/indra/newview/skins/default/xui/ru/panel_status_bar.xml index 630925fa60..49c48ae654 100644 --- a/indra/newview/skins/default/xui/ru/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/ru/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour, datetime, slt]:[min, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>  	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string> -	<panel left="-450" name="balance_bg" width="240"> +	<panel left="-471" name="balance_bg" width="240">  		<text name="balance" tool_tip="Щелкните для обновления вашего баланса L$" value="L$??"/>  		<button label="Купить L$" name="buyL" tool_tip="Щелкните для покупки L$"/>  		<button label="Торговый центр" name="goShop" tool_tip="Открыть торговый центр Second Life" width="121"/> diff --git a/indra/newview/skins/default/xui/tr/panel_status_bar.xml b/indra/newview/skins/default/xui/tr/panel_status_bar.xml index 9e2669ec2b..7c7bfc7e14 100644 --- a/indra/newview/skins/default/xui/tr/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/tr/panel_status_bar.xml @@ -5,7 +5,7 @@  	<panel.string name="time">[hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]</panel.string>  	<panel.string name="timeTooltip">[weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]</panel.string>  	<panel.string name="buycurrencylabel">L$ [AMT]</panel.string> -	<panel left="-425" name="balance_bg" width="215"> +	<panel left="-446" name="balance_bg" width="215">  		<text name="balance" tool_tip="L$ bakiyenizi yenilemek için buraya tıklayın" value="L$??"/>  		<button label="L$ Satın Al" name="buyL" tool_tip="Daha fazla L$ satın almak için tıklayın"/>  		<button label="Alışveriş yap" name="goShop" tool_tip="Second Life Pazaryeri Aç" width="95"/> diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index 1b0334498e..b603157ca7 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -136,6 +136,7 @@ void LLGridManager::addSystemGrid(const std::string& label,  								  const std::string& helper,  								  const std::string& login_page,  								  const std::string& update_url_base, +								  const std::string& web_profile_url,  								  const std::string& login_id)  {  } | 
