diff options
| author | Ychebotarev ProductEngine <ychebotarev@productengine.com> | 2010-02-02 11:15:56 +0200 | 
|---|---|---|
| committer | Ychebotarev ProductEngine <ychebotarev@productengine.com> | 2010-02-02 11:15:56 +0200 | 
| commit | 7f83000ea13bac5b4cccb9a6f12e764ac8d69b2a (patch) | |
| tree | 9ca8e77a8b67f85a959a867ea9f400c7c11746a2 | |
| parent | ff4b80f27126adfc11e6facfa53aa1fafd3d19ec (diff) | |
| parent | a359db96eb0273bf67fe48bae2665ea65831cf67 (diff) | |
merge
--HG--
branch : product-engine
| -rw-r--r-- | indra/llui/lldockablefloater.cpp | 2 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 1 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/lllocationinputctrl.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/lloutputmonitorctrl.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llpanelplaceprofile.cpp | 40 | ||||
| -rw-r--r-- | indra/newview/llspeakingindicatormanager.cpp | 41 | ||||
| -rw-r--r-- | indra/newview/llviewerparcelmgr.cpp | 36 | ||||
| -rw-r--r-- | indra/newview/llviewerparcelmgr.h | 12 | 
9 files changed, 103 insertions, 55 deletions
| diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp index 74438b184a..57baf28dab 100644 --- a/indra/llui/lldockablefloater.cpp +++ b/indra/llui/lldockablefloater.cpp @@ -146,7 +146,7 @@ void LLDockableFloater::setVisible(BOOL visible)  	if (visible)  	{ -		LLFloater::setFrontmost(TRUE); +		LLFloater::setFrontmost(getAutoFocus());  	}  	LLFloater::setVisible(visible);  } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 8c9dacbd20..2166d8db8a 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -301,6 +301,7 @@ protected:  	const LLRect&	getExpandedRect() const { return mExpandedRect; }  	void			setAutoFocus(BOOL focus) { mAutoFocus = focus; } // whether to automatically take focus when opened +	BOOL			getAutoFocus() const { return mAutoFocus; }  	LLDragHandle*	getDragHandle() const { return mDragHandle; }  	void			destroy() { die(); } // Don't call this directly.  You probably want to call closeFloater() diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index b7d4db853e..db6b2041f8 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1467,6 +1467,7 @@ LLCallDialog::LLCallDialog(const LLSD& payload)  	  mPayload(payload),  	  mLifetime(DEFAULT_LIFETIME)  { +	setAutoFocus(FALSE);  }  void LLCallDialog::getAllowedRect(LLRect& rect) @@ -1794,7 +1795,7 @@ BOOL LLIncomingCallDialog::postBuild()  	childSetAction("Accept", onAccept, this);  	childSetAction("Reject", onReject, this);  	childSetAction("Start IM", onStartIM, this); -	childSetFocus("Accept"); +	setDefaultBtn("Accept");  	std::string notify_box_type = mPayload["notify_box_type"].asString();  	if(notify_box_type != "VoiceInviteGroup" && notify_box_type != "VoiceInviteAdHoc") @@ -2424,7 +2425,7 @@ void LLIMMgr::inviteToSession(  		}  		else  		{ -			LLFloaterReg::showInstance("incoming_call", payload, TRUE); +			LLFloaterReg::showInstance("incoming_call", payload, FALSE);  		}  		mPendingInvitations[session_id.asString()] = LLSD();  	} @@ -2437,7 +2438,7 @@ void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::stri  	std::string notify_box_type = payload["notify_box_type"].asString(); -	LLFloaterReg::showInstance("incoming_call", payload, TRUE); +	LLFloaterReg::showInstance("incoming_call", payload, FALSE);  }  //*TODO disconnects all sessions diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 0e93e28f2d..4f40a0a532 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -722,14 +722,12 @@ void LLLocationInputCtrl::refreshParcelIcons()  		}  		bool allow_buy      = vpm->canAgentBuyParcel(current_parcel, false); -		bool allow_voice	= agent_region->isVoiceEnabled() && current_parcel->getParcelFlagAllowVoice(); -		bool allow_fly		= !agent_region->getBlockFly() && current_parcel->getAllowFly(); -		bool allow_push		= !agent_region->getRestrictPushObject() && !current_parcel->getRestrictPushObject(); -		bool allow_build	= current_parcel->getAllowModify(); // true when anyone is allowed to build. See EXT-4610. -		bool allow_scripts	= !(agent_region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) && -							  !(agent_region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) && -							  current_parcel->getAllowOtherScripts(); -		bool allow_damage	= agent_region->getAllowDamage() || current_parcel->getAllowDamage(); +		bool allow_voice	= vpm->allowAgentVoice(agent_region, current_parcel); +		bool allow_fly		= vpm->allowAgentFly(agent_region, current_parcel); +		bool allow_push		= vpm->allowAgentPush(agent_region, current_parcel); +		bool allow_build	= vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610. +		bool allow_scripts	= vpm->allowAgentScripts(agent_region, current_parcel); +		bool allow_damage	= vpm->allowAgentDamage(agent_region, current_parcel);  		// Most icons are "block this ability"  		mForSaleBtn->setVisible(allow_buy); diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index f816dc589d..388fdeea7a 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -251,6 +251,11 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)  {  	if (speaker_id.isNull() || speaker_id == mSpeakerId) return; +	if (mSpeakerId.notNull()) +	{ +		// Unregister previous registration to avoid crash. EXT-4782. +		LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this); +	}  	mSpeakerId = speaker_id;  	LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this); diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 9b31ef23a2..9e5f9da0ea 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -340,8 +340,10 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  	std::string on = getString("on");  	std::string off = getString("off"); +	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance(); +  	// Processing parcel characteristics -	if (region->isVoiceEnabled() && parcel->getParcelFlagAllowVoice()) +	if (vpm->allowAgentVoice(region, parcel))  	{  		mVoiceIcon->setValue(icon_voice);  		mVoiceText->setText(on); @@ -352,7 +354,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mVoiceText->setText(off);  	} -	if (!region->getBlockFly() && parcel->getAllowFly()) +	if (vpm->allowAgentFly(region, parcel))  	{  		mFlyIcon->setValue(icon_fly);  		mFlyText->setText(on); @@ -363,18 +365,18 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mFlyText->setText(off);  	} -	if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) +	if (vpm->allowAgentPush(region, parcel))  	{ -		mPushIcon->setValue(icon_push_no); -		mPushText->setText(off); +		mPushIcon->setValue(icon_push); +		mPushText->setText(on);  	}  	else  	{ -		mPushIcon->setValue(icon_push); -		mPushText->setText(on); +		mPushIcon->setValue(icon_push_no); +		mPushText->setText(off);  	} -	if (parcel->getAllowModify()) +	if (vpm->allowAgentBuild(parcel))  	{  		mBuildIcon->setValue(icon_build);  		mBuildText->setText(on); @@ -385,20 +387,18 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  		mBuildText->setText(off);  	} -	if ((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) || -	    (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || -	    !parcel->getAllowOtherScripts()) +	if (vpm->allowAgentScripts(region, parcel))  	{ -		mScriptsIcon->setValue(icon_scripts_no); -		mScriptsText->setText(off); +		mScriptsIcon->setValue(icon_scripts); +		mScriptsText->setText(on);  	}  	else  	{ -		mScriptsIcon->setValue(icon_scripts); -		mScriptsText->setText(on); +		mScriptsIcon->setValue(icon_scripts_no); +		mScriptsText->setText(off);  	} -	if (region->getAllowDamage() || parcel->getAllowDamage()) +	if (vpm->allowAgentDamage(region, parcel))  	{  		mDamageIcon->setValue(icon_damage);  		mDamageText->setText(on); @@ -461,12 +461,8 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,  	S32 claim_price;  	S32 rent_price;  	F32 dwell; -	BOOL for_sale = parcel->getForSale(); -	LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, -													 &claim_price, -													 &rent_price, -													 &for_sale, -													 &dwell); +	BOOL for_sale; +	vpm->getDisplayInfo(&area, &claim_price, &rent_price, &for_sale, &dwell);  	if (for_sale)  	{  		const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index 5e1d408e8d..d33c050ee4 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -114,6 +114,13 @@ private:  	void switchSpeakerIndicators(const speaker_ids_t& speakers_uuids, BOOL switch_on);  	/** +	 * Ensures that passed instance of Speaking Indicator does not exist among registered ones. +	 * If yes, it will be removed. +	 */ +	void ensureInstanceDoesNotExist(LLSpeakingIndicator* const speaking_indicator); + + +	/**  	 * Multimap with all registered speaking indicators  	 */  	speaking_indicators_mmap_t mSpeakingIndicators; @@ -135,7 +142,11 @@ void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_i  {  	// do not exclude agent's indicators. They should be processed in the same way as others. See EXT-3889. -	LL_DEBUGS("SpeakingIndicator") << "Registering indicator: " << speaker_id << LL_ENDL; +	LL_DEBUGS("SpeakingIndicator") << "Registering indicator: " << speaker_id << "|"<< speaking_indicator << LL_ENDL; + + +	ensureInstanceDoesNotExist(speaking_indicator); +  	speaking_indicator_value_t value_type(speaker_id, speaking_indicator);  	mSpeakingIndicators.insert(value_type); @@ -148,12 +159,14 @@ void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_i  void SpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator)  { +	LL_DEBUGS("SpeakingIndicator") << "Unregistering indicator: " << speaker_id << "|"<< speaking_indicator << LL_ENDL;  	speaking_indicators_mmap_t::iterator it;  	it = mSpeakingIndicators.find(speaker_id);  	for (;it != mSpeakingIndicators.end(); ++it)  	{  		if (it->second == speaking_indicator)  		{ +			LL_DEBUGS("SpeakingIndicator") << "Unregistered." << LL_ENDL;  			mSpeakingIndicators.erase(it);  			break;  		} @@ -231,6 +244,32 @@ void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& spea  	}  } +void SpeakingIndicatorManager::ensureInstanceDoesNotExist(LLSpeakingIndicator* const speaking_indicator) +{ +	LL_DEBUGS("SpeakingIndicator") << "Searching for an registered indicator instance: " << speaking_indicator << LL_ENDL; +	speaking_indicators_mmap_t::iterator it = mSpeakingIndicators.begin(); +	for (;it != mSpeakingIndicators.end(); ++it) +	{ +		if (it->second == speaking_indicator) +		{ +			LL_DEBUGS("SpeakingIndicator") << "Found" << LL_ENDL; +			break; +		} +	} + +	// It is possible with LLOutputMonitorCtrl the same instance of indicator is registered several +	// times with different UUIDs. This leads to crash after instance is destroyed because the +	// only one (specified by UUID in unregisterSpeakingIndicator()) is removed from the map. +	// So, using stored deleted pointer leads to crash. See EXT-4782. +	if (it != mSpeakingIndicators.end()) +	{ +		llwarns << "The same instance of indicator has already been registered, removing it: " << it->first << "|"<< speaking_indicator << llendl; +		llassert(it == mSpeakingIndicators.end()); +		mSpeakingIndicators.erase(it); +	} +} + +  /************************************************************************/  /*         LLSpeakingIndicatorManager namespace implementation          */  /************************************************************************/ diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index b85b42c710..7ec650629d 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -666,31 +666,38 @@ bool LLViewerParcelMgr::allowAgentBuild() const  	}  } +// Return whether anyone can build on the given parcel +bool LLViewerParcelMgr::allowAgentBuild(const LLParcel* parcel) const +{ +	return parcel->getAllowModify(); +} +  bool LLViewerParcelMgr::allowAgentVoice() const  { -	LLViewerRegion* region = gAgent.getRegion(); +	return allowAgentVoice(gAgent.getRegion(), mAgentParcel); +} + +bool LLViewerParcelMgr::allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const +{  	return region && region->isVoiceEnabled() -		&& mAgentParcel	&& mAgentParcel->getParcelFlagAllowVoice(); +		&& parcel	&& parcel->getParcelFlagAllowVoice();  } -bool LLViewerParcelMgr::allowAgentFly() const +bool LLViewerParcelMgr::allowAgentFly(const LLViewerRegion* region, const LLParcel* parcel) const  { -	LLViewerRegion* region = gAgent.getRegion();  	return region && !region->getBlockFly() -		&& mAgentParcel && mAgentParcel->getAllowFly(); +		&& parcel && parcel->getAllowFly();  }  // Can the agent be pushed around by LLPushObject? -bool LLViewerParcelMgr::allowAgentPush() const +bool LLViewerParcelMgr::allowAgentPush(const LLViewerRegion* region, const LLParcel* parcel) const  { -	LLViewerRegion* region = gAgent.getRegion();  	return region && !region->getRestrictPushObject() -		&& mAgentParcel && !mAgentParcel->getRestrictPushObject(); +		&& parcel && !parcel->getRestrictPushObject();  } -bool LLViewerParcelMgr::allowAgentScripts() const +bool LLViewerParcelMgr::allowAgentScripts(const LLViewerRegion* region, const LLParcel* parcel) const  { -	LLViewerRegion* region = gAgent.getRegion();  	// *NOTE: This code does not take into account group-owned parcels  	// and the flag to allow group-owned scripted objects to run.  	// This mirrors the traditional menu bar parcel icon code, but is not @@ -698,15 +705,14 @@ bool LLViewerParcelMgr::allowAgentScripts() const  	return region  		&& !(region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)  		&& !(region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) -		&& mAgentParcel -		&& mAgentParcel->getAllowOtherScripts(); +		&& parcel +		&& parcel->getAllowOtherScripts();  } -bool LLViewerParcelMgr::allowAgentDamage() const +bool LLViewerParcelMgr::allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const  { -	LLViewerRegion* region = gAgent.getRegion();  	return (region && region->getAllowDamage()) -		|| (mAgentParcel && mAgentParcel->getAllowDamage()); +		|| (parcel && parcel->getAllowDamage());  }  BOOL LLViewerParcelMgr::isOwnedAt(const LLVector3d& pos_global) const diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 379190789b..98be8e2c7b 100644 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -171,26 +171,28 @@ public:  	// Can this agent build on the parcel he is on?  	// Used for parcel property icons in nav bar.  	bool	allowAgentBuild() const; +	bool	allowAgentBuild(const LLParcel* parcel) const;  	// Can this agent speak on the parcel he is on?  	// Used for parcel property icons in nav bar.  	bool	allowAgentVoice() const; -	 +	bool	allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const; +  	// Can this agent start flying on this parcel?  	// Used for parcel property icons in nav bar. -	bool	allowAgentFly() const; +	bool	allowAgentFly(const LLViewerRegion* region, const LLParcel* parcel) const;  	// Can this agent be pushed by llPushObject() on this parcel?  	// Used for parcel property icons in nav bar. -	bool	allowAgentPush() const; +	bool	allowAgentPush(const LLViewerRegion* region, const LLParcel* parcel) const;  	// Can scripts written by non-parcel-owners run on the agent's current  	// parcel?  Used for parcel property icons in nav bar. -	bool	allowAgentScripts() const; +	bool	allowAgentScripts(const LLViewerRegion* region, const LLParcel* parcel) const;  	// Can the agent be damaged here?  	// Used for parcel property icons in nav bar. -	bool	allowAgentDamage() const; +	bool	allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const;  	F32		getHoverParcelWidth() const		  				{ return F32(mHoverEastNorth.mdV[VX] - mHoverWestSouth.mdV[VX]); } | 
