From fc466df54e6dfc3a9ce80c665321bcb338714534 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Mon, 4 Sep 2023 23:52:01 +0200 Subject: [PATCH] Fix crash when selecting emoji after closing the IM floater the picker belongs to --- indra/newview/fsfloaterim.cpp | 21 +++++++++++++++++++-- indra/newview/fsfloaternearbychat.cpp | 21 +++++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/indra/newview/fsfloaterim.cpp b/indra/newview/fsfloaterim.cpp index 0d5e4be16e..2f49229559 100644 --- a/indra/newview/fsfloaterim.cpp +++ b/indra/newview/fsfloaterim.cpp @@ -2527,9 +2527,26 @@ void FSFloaterIM::onEmojiPickerToggleBtnClicked(FSFloaterIM* self) picker->show( [self](llwchar emoji) { self->onEmojiPicked(emoji); }, [self]() { self->onEmojiPickerClosed(); }); - if (LLFloater* root_floater = gFloaterView->getParentFloater(self)) + self->addDependentFloater(picker, TRUE, TRUE); + + // Adjust size and position to the conversations floater the IM floater is hosted in + if (self->getHost()) { - root_floater->addDependentFloater(picker, TRUE, TRUE); + LLRect rect = gFloaterView->findNeighboringPosition(self->getHost(), picker); + const LLRect& base = self->getHost()->getRect(); + if (rect.mTop == base.mTop) + rect.mBottom = base.mBottom; + else if (rect.mLeft == base.mLeft) + rect.mRight = base.mRight; + picker->reshape(rect.getWidth(), rect.getHeight(), FALSE); + picker->setRect(rect); + picker->setSnapTarget(self->getHost()->getHandle()); + gFloaterView->adjustToFitScreen(picker, FALSE, TRUE); + if (picker->isFrontmost()) + { + // make sure to bring self and sibling floaters to front + gFloaterView->bringToFront(picker); + } } } else diff --git a/indra/newview/fsfloaternearbychat.cpp b/indra/newview/fsfloaternearbychat.cpp index 09b3ed96ad..7f1a26eae9 100644 --- a/indra/newview/fsfloaternearbychat.cpp +++ b/indra/newview/fsfloaternearbychat.cpp @@ -1025,9 +1025,26 @@ void FSFloaterNearbyChat::onEmojiPickerToggleBtnClicked(FSFloaterNearbyChat* sel picker->show( [self](llwchar emoji) { self->onEmojiPicked(emoji); }, [self]() { self->onEmojiPickerClosed(); }); - if (LLFloater* root_floater = gFloaterView->getParentFloater(self)) + self->addDependentFloater(picker, TRUE, TRUE); + + // Adjust size and position to the conversations floater the nearby chat floater is hosted in + if (self->getHost()) { - root_floater->addDependentFloater(picker, TRUE, TRUE); + LLRect rect = gFloaterView->findNeighboringPosition(self->getHost(), picker); + const LLRect& base = self->getHost()->getRect(); + if (rect.mTop == base.mTop) + rect.mBottom = base.mBottom; + else if (rect.mLeft == base.mLeft) + rect.mRight = base.mRight; + picker->reshape(rect.getWidth(), rect.getHeight(), FALSE); + picker->setRect(rect); + picker->setSnapTarget(self->getHost()->getHandle()); + gFloaterView->adjustToFitScreen(picker, FALSE, TRUE); + if (picker->isFrontmost()) + { + // make sure to bring self and sibling floaters to front + gFloaterView->bringToFront(picker); + } } } else