diff options
author | Michael Meeks <michael.meeks@collabora.com> | 2019-12-12 01:44:23 +0000 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2019-12-18 15:10:24 +0100 |
commit | 280f54a942ce9fe0177100312fc45a398955bd8a (patch) | |
tree | 544c22f9a250164b24afa521a8c4731bcb908011 /vcl/source/window | |
parent | 189d498f5c0c633f8cd87b3f1b6d57020371a952 (diff) |
lok: vcl: fix multiple floatwin removal case more robustly.
Instead of this over-clever approach of recursively removing items
which can easily fail, build a list, then iterate it in-line while
disabling recursion.
also includes:
lok: vcl: fix multiple floatwin removal case.
We need to progress in our while loop to remove children, even if
they are currently not in popup-mode; fixes infinite loop with two
popups present concurrently.
Change-Id: Ic7b7f8e13a466d254abe53b77bc166c6a89fa8c3
Reviewed-on: https://gerrit.libreoffice.org/85368
Tested-by: Jenkins
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Diffstat (limited to 'vcl/source/window')
-rw-r--r-- | vcl/source/window/floatwin.cxx | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx index dc834d9f9acd..d846cba8ddd4 100644 --- a/vcl/source/window/floatwin.cxx +++ b/vcl/source/window/floatwin.cxx @@ -825,9 +825,18 @@ void FloatingWindow::ImplEndPopupMode( FloatWinPopupEndFlags nFlags, const VclPt mbInCleanUp = true; // prevent killing this window due to focus change while working with it - // stop the PopupMode also for all following PopupMode windows - while (pSVData->mpWinData->mpFirstFloat && pSVData->mpWinData->mpFirstFloat.get() != this) - pSVData->mpWinData->mpFirstFloat->EndPopupMode(FloatWinPopupEndFlags::Cancel); + if (!(nFlags & FloatWinPopupEndFlags::NoCloseChildren)) + { + // stop the PopupMode also for all PopupMode windows created after us + std::vector<VclPtr<FloatingWindow>> aCancelFloats; + // stop the PopupMode also for all following PopupMode windows + for (auto pFloat = pSVData->mpWinData->mpFirstFloat; + pFloat != nullptr && pFloat != this; + pFloat = pFloat->mpNextFloat) + aCancelFloats.push_back(pFloat); + for (auto & it : aCancelFloats) + it->EndPopupMode(FloatWinPopupEndFlags::Cancel | FloatWinPopupEndFlags::NoCloseChildren); + } // delete window from the list pSVData->mpWinData->mpFirstFloat = mpNextFloat; |