diff options
| author | Vadim Savchuk <vsavchuk@productengine.com> | 2010-09-17 22:21:00 +0300 | 
|---|---|---|
| committer | Vadim Savchuk <vsavchuk@productengine.com> | 2010-09-17 22:21:00 +0300 | 
| commit | 5fac8e4fd0fdb6ee136bbafa8263d234766da7e2 (patch) | |
| tree | d0994c8c3209886798a8a1d5a23f7a9ae88a20da /indra/newview | |
| parent | 27bbf79c89fb8c737b88d769b2056304aef69dc3 (diff) | |
STORM-192 FIXED Ctrl-Shift-W not to disable nearby chat toasts.
Bug reason: The fix of EXT-1419 disables showing nearby chat showing toasts at all whenever you close one.
That was done to prevent a crash when viewer is exiting, but closing a toast manually should be handled differently.
Fix: If a toast is being closed (destroyed) manually, just remove it from the toast pool
(to prevent further references to the invalid pointer), but keep on showing new toasts.
I've overriden LLFloater::onClose() to differentiate the two cases.
Diffstat (limited to 'indra/newview')
| -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 | 
