[Libreoffice-commits] core.git: 3 commits - sd/source vcl/inc vcl/source

David Tardon dtardon at redhat.com
Thu May 5 16:54:58 UTC 2016


 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 <dtardon at redhat.com>
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 <dtardon at redhat.com>
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 <dtardon at redhat.com>
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


More information about the Libreoffice-commits mailing list