[libreoffice/f17] Resolves: rhbz#842292 crash in scrolling multiselection in draw
Caolán McNamara
caolanm at fedoraproject.org
Wed Aug 22 13:26:47 UTC 2012
commit 1d7b9560dd5117d80a66fe9055f9457f8c1d07fc
Author: Caolán McNamara <caolanm at redhat.com>
Date: Wed Aug 22 14:26:38 2012 +0100
Resolves: rhbz#842292 crash in scrolling multiselection in draw
...bz-842292-crash-in-calling-callback-whose.patch | 144 ++++++++++++++++++++
libreoffice.spec | 3 +
2 files changed, 147 insertions(+), 0 deletions(-)
---
diff --git a/0001-Resolves-rhbz-842292-crash-in-calling-callback-whose.patch b/0001-Resolves-rhbz-842292-crash-in-calling-callback-whose.patch
new file mode 100644
index 0000000..c9a4527
--- /dev/null
+++ b/0001-Resolves-rhbz-842292-crash-in-calling-callback-whose.patch
@@ -0,0 +1,144 @@
+From c29af1572ad15ac5199a09e5812fb8354c165329 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm at redhat.com>
+Date: Wed, 22 Aug 2012 14:20:32 +0100
+Subject: [PATCH] Resolves: rhbz#842292 crash in calling callback whose
+ instance was deleted
+
+Change-Id: I4cc04d59f48b42cc105703daa9983dd7c9f7af62
+---
+ .../controller/SlsDragAndDropContext.cxx | 6 +++--
+ .../slidesorter/controller/SlsScrollBarManager.cxx | 8 ++++---
+ .../controller/SlsSelectionFunction.cxx | 26 ++++++++++++++++++----
+ .../inc/controller/SlsScrollBarManager.hxx | 2 ++
+ 4 files changed, 33 insertions(+), 9 deletions(-)
+
+diff --git a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
+index b8234b5..c1bf497 100644
+--- a/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
++++ b/sd/source/ui/slidesorter/controller/SlsDragAndDropContext.cxx
+@@ -100,11 +100,13 @@ void DragAndDropContext::UpdatePosition (
+ ::boost::shared_ptr<InsertionIndicatorHandler> pInsertionIndicatorHandler (
+ mpTargetSlideSorter->GetController().GetInsertionIndicatorHandler());
+
+- if ( ! (bAllowAutoScroll
++ bool bDoAutoScroll = bAllowAutoScroll
+ && mpTargetSlideSorter->GetController().GetScrollBarManager().AutoScroll(
+ rMousePosition,
+ ::boost::bind(
+- &DragAndDropContext::UpdatePosition, this, rMousePosition, eMode, false))))
++ &DragAndDropContext::UpdatePosition, this, rMousePosition, eMode, false));
++
++ if (!bDoAutoScroll)
+ {
+ pInsertionIndicatorHandler->UpdatePosition(aMouseModelPosition, eMode);
+
+diff --git a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
+index a45f640..4a2d808 100644
+--- a/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
++++ b/sd/source/ui/slidesorter/controller/SlsScrollBarManager.cxx
+@@ -617,13 +617,15 @@ bool ScrollBarManager::RepeatAutoScroll (void)
+ }
+ }
+
+- maAutoScrollFunctor = ::boost::function<void(void)>();
++ clearAutoScrollFunctor();
+ mbIsAutoScrollActive = false;
+ return false;
+ }
+
+-
+-
++void ScrollBarManager::clearAutoScrollFunctor()
++{
++ maAutoScrollFunctor = ::boost::function<void(void)>();
++}
+
+ IMPL_LINK_NOARG(ScrollBarManager, AutoScrollTimeoutHandler)
+ {
+diff --git a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
+index 6217c07..16c23ad 100644
+--- a/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
++++ b/sd/source/ui/slidesorter/controller/SlsSelectionFunction.cxx
+@@ -273,6 +273,7 @@ private:
+ SelectionMode meSelectionMode;
+ Point maSecondCorner;
+ Pointer maSavedPointer;
++ bool mbAutoScrollInstalled;
+ sal_Int32 mnAnchorIndex;
+ sal_Int32 mnSecondIndex;
+ view::ButtonBar::Lock maButtonBarLock;
+@@ -1503,6 +1504,7 @@ MultiSelectionModeHandler::MultiSelectionModeHandler (
+ meSelectionMode(SM_Normal),
+ maSecondCorner(rMouseModelPosition),
+ maSavedPointer(mrSlideSorter.GetContentWindow()->GetPointer()),
++ mbAutoScrollInstalled(false),
+ mnAnchorIndex(-1),
+ mnSecondIndex(-1),
+ maButtonBarLock(rSlideSorter)
+@@ -1523,6 +1525,12 @@ void MultiSelectionModeHandler::Initialize(const sal_uInt32 nEventCode)
+
+ MultiSelectionModeHandler::~MultiSelectionModeHandler (void)
+ {
++ if (mbAutoScrollInstalled)
++ {
++ //a call to this handler's MultiSelectionModeHandler::UpdatePosition
++ //may be still waiting to be called back
++ mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor();
++ }
+ mrSlideSorter.GetContentWindow()->SetPointer(maSavedPointer);
+ }
+
+@@ -1564,6 +1572,14 @@ void MultiSelectionModeHandler::ProcessEvent (
+ bool MultiSelectionModeHandler::ProcessButtonUpEvent (
+ SelectionFunction::EventDescriptor& rDescriptor)
+ {
++ if (mbAutoScrollInstalled)
++ {
++ //a call to this handler's MultiSelectionModeHandler::UpdatePosition
++ //may be still waiting to be called back
++ mrSlideSorter.GetController().GetScrollBarManager().clearAutoScrollFunctor();
++ mbAutoScrollInstalled = false;
++ }
++
+ if (Match(rDescriptor.mnEventCode, BUTTON_UP | LEFT_BUTTON | SINGLE_CLICK))
+ {
+ mrSelectionFunction.SwitchToNormalMode();
+@@ -1620,16 +1636,18 @@ void MultiSelectionModeHandler::UpdatePosition (
+ SharedSdWindow pWindow (mrSlideSorter.GetContentWindow());
+ const Point aMouseModelPosition (pWindow->PixelToLogic(rMousePosition));
+
+- if ( ! (bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll(
++ bool bDoAutoScroll = bAllowAutoScroll && mrSlideSorter.GetController().GetScrollBarManager().AutoScroll(
+ rMousePosition,
+ ::boost::bind(
+ &MultiSelectionModeHandler::UpdatePosition,
+ this,
+ rMousePosition,
+- false))))
+- {
++ false));
++
++ if (!bDoAutoScroll)
+ UpdateModelPosition(aMouseModelPosition);
+- }
++
++ mbAutoScrollInstalled |= bDoAutoScroll;
+ }
+
+
+diff --git a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
+index 18807c1..41f3bde 100644
+--- a/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
++++ b/sd/source/ui/slidesorter/inc/controller/SlsScrollBarManager.hxx
+@@ -172,6 +172,8 @@ public:
+
+ void StopAutoScroll (void);
+
++ void clearAutoScrollFunctor();
++
+ enum Orientation { Orientation_Horizontal, Orientation_Vertical };
+ enum Unit { Unit_Pixel, Unit_Slide };
+ /** Scroll the slide sorter by setting the thumbs of the scroll bars and
+--
+1.7.11.2
+
diff --git a/libreoffice.spec b/libreoffice.spec
index eb77f27..ac0ebea 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -150,6 +150,7 @@ Patch32: 0001-use-ure-instead-of-ure-link.patch
Patch33: 0001-Resolves-rhbz-838368-view-ignored-while-view-accepte.patch
Patch34: 0001-Resolves-rhbz-836937-insanely-slow-with-Zemberek-ins.patch
Patch35: 0001-Resolves-rhbz-846775-Clipboard-must-be-disposed-befo.patch
+Patch36: 0001-Resolves-rhbz-842292-crash-in-calling-callback-whose.patch
%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
%define instdir %{_libdir}
@@ -1015,6 +1016,7 @@ mv -f redhat.soc extras/source/palettes/standard.soc
%patch33 -p1 -b .rhbz-838368-view-ignored-while-view-accepte.patch
%patch34 -p1 -b .rhbz-836937-insanely-slow-with-Zemberek-ins.patch
%patch35 -p1 -b .rhbz-846775-Clipboard-must-be-disposed-befo.patch
+%patch36 -p1 -b .rhbz-842292-crash-in-calling-callback-whose.patch
# TODO: check this
# these are horribly incomplete--empty translations and copied english
@@ -2303,6 +2305,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
%changelog
* Wed Aug 22 2012 Caolán McNamara <caolanm at redhat.com> - 1:3.5.6.2-2
- Resolves: rhbz#846775 Clipboard must be disposed before Selection
+- Resolves: rhbz#842292 crash in scrolling multiselection in draw
* Wed Aug 08 2012 David Tardon <dtardon at redhat.com> - 1:3.5.6.2-1
- 3.5.6 rc2
More information about the scm-commits
mailing list