Skip to content
Snippets Groups Projects
Commit 5fac8e4f authored by Vadim Savchuk's avatar Vadim Savchuk
Browse files

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.
parent 27bbf79c
No related branches found
No related tags found
No related merge requests found
......@@ -64,7 +64,7 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
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 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
}
protected:
void deactivateToast(LLToast* toast);
void addToToastPool(LLToast* toast)
{
toast->setVisible(FALSE);
......@@ -116,14 +117,65 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment