diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llnearbychathandler.cpp | 75 | 
1 files changed, 67 insertions, 8 deletions
| diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index a747c228a6..b6d2e02eef 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -64,7 +64,7 @@ public:  	typedef boost::function<LLToastPanelBase* (void )> create_toast_panel_callback_t;  	void setCreatePanelCallback(create_toast_panel_callback_t value) { m_create_toast_panel_callback_t = value;} -	void onToastDestroyed	(LLToast* toast); +	void onToastDestroyed	(LLToast* toast, bool app_quitting);  	void onToastFade		(LLToast* toast);  	void reshape			(S32 width, S32 height, BOOL called_from_parent); @@ -96,6 +96,7 @@ public:  	}  protected: +	void	deactivateToast(LLToast* toast);  	void	addToToastPool(LLToast* toast)  	{  		toast->setVisible(FALSE); @@ -116,14 +117,65 @@ protected:  	bool	mStopProcessing;  }; +//----------------------------------------------------------------------------------------------- +// LLNearbyChatToast +//----------------------------------------------------------------------------------------------- + +// We're deriving from LLToast to be able to override onClose() +// in order to handle closing nearby chat toasts properly. +class LLNearbyChatToast : public LLToast +{ +	LOG_CLASS(LLNearbyChatToast); +public: +	LLNearbyChatToast(const LLToast::Params& p, LLNearbyChatScreenChannel* nc_channelp) +	:	LLToast(p), +	 	mNearbyChatScreenChannelp(nc_channelp) +	{ +	} + +	/*virtual*/ void onClose(bool app_quitting); + +private: +	LLNearbyChatScreenChannel*	mNearbyChatScreenChannelp; +}; + +//----------------------------------------------------------------------------------------------- +// LLNearbyChatScreenChannel +//----------------------------------------------------------------------------------------------- + +void LLNearbyChatScreenChannel::deactivateToast(LLToast* toast) +{ +	std::vector<LLToast*>::iterator pos = std::find(m_active_toasts.begin(), m_active_toasts.end(), toast); + +	if (pos == m_active_toasts.end()) +	{ +		llassert(pos == m_active_toasts.end()); +		return; +	} + +	m_active_toasts.erase(pos); +} +  void	LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)  {  	//we don't need overflow toast in nearby chat  } -void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast) +void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitting)  {	 -	mStopProcessing = true; +	if (app_quitting) +	{ +		// Viewer is quitting. +		// Immediately stop processing chat messages (EXT-1419). +		mStopProcessing = true; +	} +	else +	{ +		// The toast is being closed by user (STORM-192). +		// Remove it from the list of active toasts to prevent +		// further references to the invalid pointer. +		deactivateToast(toast); +	}  }  void LLNearbyChatScreenChannel::onToastFade(LLToast* toast) @@ -132,9 +184,7 @@ void LLNearbyChatScreenChannel::onToastFade(LLToast* toast)  	if(!toast)  		return; -	std::vector<LLToast*>::iterator pos = std::find(m_active_toasts.begin(),m_active_toasts.end(),toast); -	if(pos!=m_active_toasts.end()) -		m_active_toasts.erase(pos); +	deactivateToast(toast);  	addToToastPool(toast); @@ -153,11 +203,10 @@ bool	LLNearbyChatScreenChannel::createPoolToast()  	p.lifetime_secs = gSavedSettings.getS32("NearbyToastLifeTime");  	p.fading_time_secs = gSavedSettings.getS32("NearbyToastFadingTime"); -	LLToast* toast = new LLToast(p);  +	LLToast* toast = new LLNearbyChatToast(p, this);  	toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1)); -	toast->setOnToastDestroyedCallback(boost::bind(&LLNearbyChatScreenChannel::onToastDestroyed, this, _1));  	m_toast_pool.push_back(toast);  	return true; @@ -452,4 +501,14 @@ void LLNearbyChatHandler::onDeleteToast(LLToast* toast)  } +//----------------------------------------------------------------------------------------------- +// LLNearbyChatToast +//----------------------------------------------------------------------------------------------- + +// virtual +void LLNearbyChatToast::onClose(bool app_quitting) +{ +	mNearbyChatScreenChannelp->onToastDestroyed(this, app_quitting); +} +// EOF | 
