diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 65bf1176ffaba8ade06dc35e0fd5fb8146ec7a3c..954da8abd7657dfe1bc2429467c99b4287c8c42b 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -2232,9 +2232,22 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id) } //static -BOOL LLIMFloater::toggle(const LLUUID& session_id) +bool LLIMFloater::toggle(const LLUUID& session_id) { - return LLFloaterReg::toggleInstance("impanel", session_id); + LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id); + if (floater && floater->getVisible()) + { + // clicking on chiclet to close floater just hides it to maintain existing + // scroll/text entry state + floater->setVisible(false); + return false; + } + else + { + // ensure the list of messages is updated when floater is made visible + show(session_id); + return true; + } } void LLIMFloater::updateMessages() diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h index 52f67df4b7a98a1b32355a15b7c08e277711d98c..284a486b0fb71af400397728518095d93a6e8933 100644 --- a/indra/newview/llimpanel.h +++ b/indra/newview/llimpanel.h @@ -384,10 +384,12 @@ class LLIMFloater : public LLFloater // LLFloater overrides /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true); + // Make IM conversion visible and update the message history static LLIMFloater* show(const LLUUID& session_id); // Toggle panel specified by session_id - static BOOL toggle(const LLUUID& session_id); + // Returns true iff panel became visible + static bool toggle(const LLUUID& session_id); // get new messages from LLIMModel void updateMessages();