sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx | 16 ++++++++++++ vcl/inc/window.h | 2 + vcl/source/window/event.cxx | 16 +++++++++--- vcl/source/window/window.cxx | 1 4 files changed, 31 insertions(+), 4 deletions(-)
New commits: commit fd99dc83659b8c9e4dff9c55ed43c936f9a5b7fd Author: David Tardon <[email protected]> Date: Thu May 5 17:47:03 2016 +0200 only set cur. page once when removing mult. pages Change-Id: Id9da135a91d9591eed04fb25d2891169c45ecaaf diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx index a954aed..c861fbf 100644 --- a/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx +++ b/sd/source/ui/slidesorter/controller/SlsSelectionManager.cxx @@ -36,6 +36,9 @@ #include "view/SlideSorterView.hxx" #include "view/SlsLayouter.hxx" #include "drawdoc.hxx" +#include "drawview.hxx" +#include "DrawViewShell.hxx" +#include "ViewShellBase.hxx" #include "Window.hxx" #include <svx/svxids.hrc> #include <com/sun/star/drawing/XMasterPagesSupplier.hpp> @@ -108,6 +111,13 @@ void SelectionManager::DeleteSelectedPages (const bool bSelectFollowingPage) else --nNewCurrentSlide; + const auto pViewShell = mrSlideSorter.GetViewShell(); + const auto pDrawViewShell = pViewShell ? std::dynamic_pointer_cast<sd::DrawViewShell>(pViewShell->GetViewShellBase().GetMainViewShell()) : nullptr; + const auto pDrawView = pDrawViewShell ? dynamic_cast<sd::DrawView*>(pDrawViewShell->GetDrawView()) : nullptr; + + if (pDrawView) + pDrawView->BlockPageOrderChangedHint(true); + // The actual deletion of the selected pages is done in one of two // helper functions. They are specialized for normal respectively for // master pages. @@ -120,6 +130,12 @@ void SelectionManager::DeleteSelectedPages (const bool bSelectFollowingPage) mrController.HandleModelChange(); aLock.Release(); + if (pDrawView) + { + assert(pDrawViewShell); + pDrawView->BlockPageOrderChangedHint(false); + pDrawViewShell->ResetActualPage(); + } // Show focus and move it to next valid location. if (bIsFocusShowing) commit 56f87839b572e7e6da534ccd4ed962005bc4add2 Author: David Tardon <[email protected]> Date: Thu May 5 16:05:44 2016 +0200 remove superfluous check Change-Id: If5c522a58bfced722e3b423c867911d3dc6cec48 diff --git a/vcl/source/window/event.cxx b/vcl/source/window/event.cxx index 68e822b..0a7f04c 100644 --- a/vcl/source/window/event.cxx +++ b/vcl/source/window/event.cxx @@ -236,9 +236,6 @@ void Window::CallEventListeners( sal_uLong nEvent, void* pData ) } } - if ( xWindow->IsDisposed() ) - return; - while ( xWindow ) { commit 9ff1d7f8140de1224bb37fba0cb266a58f37e66d Author: David Tardon <[email protected]> Date: Thu May 5 15:53:06 2016 +0200 improve perf. of VCL event dispatch Anectodal evidence: for removal of 32 slides from 64 slide presentation, time spent in Window::CallEventListeners has been cut down from 70% to 19% of the total time. Change-Id: Ic8fbb44fa935f068e1b18235592dec0d7e71aec7 diff --git a/vcl/inc/window.h b/vcl/inc/window.h index e06a6b1..302e9d0 100644 --- a/vcl/inc/window.h +++ b/vcl/inc/window.h @@ -201,6 +201,8 @@ public: VclPtr<vcl::Window> mpLastFocusWindow; VclPtr<vcl::Window> mpDlgCtrlDownWindow; std::vector<Link<VclWindowEvent&,void>> maEventListeners; + int mnEventListenersIteratingCount; + std::set<Link<VclWindowEvent&,void>> maEventListenersDeleted; std::vector<Link<VclWindowEvent&,void>> maChildEventListeners; int mnChildEventListenersIteratingCount; std::set<Link<VclWindowEvent&,void>> maChildEventListenersDeleted; diff --git a/vcl/source/window/event.cxx b/vcl/source/window/event.cxx index cb39104..68e822b 100644 --- a/vcl/source/window/event.cxx +++ b/vcl/source/window/event.cxx @@ -216,11 +216,22 @@ void Window::CallEventListeners( sal_uLong nEvent, void* pData ) { // Copy the list, because this can be destroyed when calling a Link... std::vector<Link<VclWindowEvent&,void>> aCopy( mpWindowImpl->maEventListeners ); + // we use an iterating counter/flag and a set of deleted Link's to avoid O(n^2) behaviour + mpWindowImpl->mnEventListenersIteratingCount++; + auto& rWindowImpl = *mpWindowImpl; + comphelper::ScopeGuard aGuard( + [&rWindowImpl]() + { + rWindowImpl.mnEventListenersIteratingCount--; + if (rWindowImpl.mnEventListenersIteratingCount == 0) + rWindowImpl.maEventListenersDeleted.clear(); + } + ); for ( Link<VclWindowEvent&,void>& rLink : aCopy ) { if (xWindow->IsDisposed()) break; // check this hasn't been removed in some re-enterancy scenario fdo#47368 - if( std::find(mpWindowImpl->maEventListeners.begin(), mpWindowImpl->maEventListeners.end(), rLink) != mpWindowImpl->maEventListeners.end() ) + if( rWindowImpl.maEventListenersDeleted.find(rLink) == rWindowImpl.maEventListenersDeleted.end() ) rLink.Call( aEvent ); } } diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index f245c47..d1c1ffe 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -615,6 +615,7 @@ WindowImpl::WindowImpl( WindowType nType ) mpNextOverlap = nullptr; // next overlap window of frame mpLastFocusWindow = nullptr; // window for focus restore mpDlgCtrlDownWindow = nullptr; // window for dialog control + mnEventListenersIteratingCount = 0; mnChildEventListenersIteratingCount = 0; mpUserData = nullptr; // user data mpCursor = nullptr; // cursor _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
