include/vcl/window.hxx        |    1 +
 sc/source/ui/view/select.cxx  |    4 ++++
 vcl/inc/window.h              |    1 +
 vcl/source/window/mouse.cxx   |    5 +++++
 vcl/source/window/window.cxx  |    1 +
 vcl/source/window/winproc.cxx |   26 +++++++++++++++++---------
 6 files changed, 29 insertions(+), 9 deletions(-)

New commits:
commit f45e4008cb21832fd7922dad3e014d66b15f9a4a
Author:     Henry Castro <hcas...@collabora.com>
AuthorDate: Wed Jun 30 18:45:38 2021 -0400
Commit:     Henry Castro <hcas...@collabora.com>
CommitDate: Tue Feb 15 13:58:23 2022 +0100

    lok: sc: introduce LocalStartDrag method
    
    Update the mouse mode to start drag,
    otherwise it will conflict with normal cell selection.
    
    Change-Id: I6d4939b704114e7de1c9c051459fd02100a7536c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118874
    Tested-by: Szymon Kłos <szymon.k...@collabora.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118203
    Tested-by: Jenkins
    Reviewed-by: Henry Castro <hcas...@collabora.com>

diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index ac0bfa54ad0a..08c87993b65e 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1012,6 +1012,7 @@ public:
     static VclPtr<vcl::Window>          SaveFocus();
     static void                         EndSaveFocus(const 
VclPtr<vcl::Window>& xFocusWin);
 
+    void                                LocalStartDrag();
     void                                CaptureMouse();
     void                                ReleaseMouse();
     bool                                IsMouseCaptured() const;
diff --git a/sc/source/ui/view/select.cxx b/sc/source/ui/view/select.cxx
index 18ac99b0ccd9..3dbe74373237 100644
--- a/sc/source/ui/view/select.cxx
+++ b/sc/source/ui/view/select.cxx
@@ -31,6 +31,7 @@
 #include <markdata.hxx>
 #include <gridwin.hxx>
 #include <sfx2/lokhelper.hxx>
+#include <comphelper/lok.hxx>
 
 #if defined(_WIN32)
 #define SC_SELENG_REFMODE_UPDATE_INTERVAL_MIN 65
@@ -205,6 +206,9 @@ void ScViewFunctionSet::BeginDrag()
     if ( pWindow->IsTracking() )
         pWindow->EndTracking( TrackingEventFlags::Cancel );    // abort 
selecting
 
+    if (comphelper::LibreOfficeKit::isActive())
+        pWindow->LocalStartDrag();
+
     SC_MOD()->SetDragObject( pTransferObj.get(), nullptr );      // for 
internal D&D
     pTransferObj->StartDrag( pWindow, nDragActions );
 
diff --git a/vcl/inc/window.h b/vcl/inc/window.h
index c932a4d09d51..b5ef63ab327c 100644
--- a/vcl/inc/window.h
+++ b/vcl/inc/window.h
@@ -176,6 +176,7 @@ struct ImplFrameData
     css::uno::Reference< css::datatransfer::clipboard::XClipboard > 
mxClipboard;
 
     bool                mbInternalDragGestureRecognizer;
+    bool                mbDragging;
     VclPtr<VirtualDevice> mpBuffer; ///< Buffer for the double-buffering
     bool mbInBufferedPaint; ///< PaintHelper is in the process of painting 
into this buffer.
     tools::Rectangle maBufferedRect; ///< Rectangle in the buffer that has to 
be painted to the screen.
diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx
index 02f6c8a484b1..7566cae5ddd9 100644
--- a/vcl/source/window/mouse.cxx
+++ b/vcl/source/window/mouse.cxx
@@ -443,6 +443,11 @@ void Window::SetMouseTransparent( bool bTransparent )
     mpWindowImpl->mbMouseTransparent = bTransparent;
 }
 
+void Window::LocalStartDrag()
+{
+    ImplGetFrameData()->mbDragging = true;
+}
+
 void Window::CaptureMouse()
 {
     ImplSVData* pSVData = ImplGetSVData();
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 2072de7e0ed0..152d163f3399 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -807,6 +807,7 @@ ImplFrameData::ImplFrameData( vcl::Window *pWindow )
     maResizeIdle.SetPriority( TaskPriority::RESIZE );
     maResizeIdle.SetInvokeHandler( LINK( pWindow, vcl::Window, 
ImplHandleResizeTimerHdl ) );
     mbInternalDragGestureRecognizer = false;
+    mbDragging = false;
     mbInBufferedPaint = false;
     mnDPIX = 96;
     mnDPIY = 96;
diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx
index 83f45b640ea6..ebd1fa43c0a5 100644
--- a/vcl/source/window/winproc.cxx
+++ b/vcl/source/window/winproc.cxx
@@ -831,21 +831,27 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& 
xWindow, MouseNotifyEven
     pFrameData->mbMouseIn = false;
 
     vcl::Window* pDragWin = pFrameData->mpMouseDownWin;
-    if (pDragWin && pFrameData->mbStartDragCalled &&
-        nEvent == MouseNotifyEvent::MOUSEMOVE)
+    if (pDragWin &&
+        nEvent == MouseNotifyEvent::MOUSEMOVE &&
+        pFrameData->mbDragging)
     {
         css::uno::Reference<css::datatransfer::dnd::XDropTargetDragContext> 
xDropTargetDragContext =
             new GenericDropTargetDragContext();
         css::uno::Reference<css::datatransfer::dnd::XDropTarget> xDropTarget(
             pDragWin->ImplGetWindowImpl()->mxDNDListenerContainer, 
css::uno::UNO_QUERY);
 
-        if (!xDropTargetDragContext.is() ||
-            !xDropTarget.is() ||
-            (nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) ==
+        if ((nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) !=
             (MouseSettings::GetStartDragCode() & (MOUSE_LEFT | MOUSE_RIGHT | 
MOUSE_MIDDLE)))
+        {
+            pDragWin->ImplGetFrameData()->mbDragging = false;
+            return false;
+        }
+
+        if (!xDropTargetDragContext.is() ||
+            !xDropTarget.is())
         {
             // cancel dragdrop
-            pDragWin->ImplGetFrameData()->mbStartDragCalled = false;
+            pDragWin->ImplGetFrameData()->mbDragging = false;
             return false;
         }
 
@@ -861,8 +867,9 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& 
xWindow, MouseNotifyEven
         return true;
     }
 
-    if (pDragWin && pFrameData->mbStartDragCalled &&
-        nEvent == MouseNotifyEvent::MOUSEBUTTONUP)
+    if (pDragWin &&
+        nEvent == MouseNotifyEvent::MOUSEBUTTONUP &&
+        pFrameData->mbDragging)
     {
         css::uno::Reference<css::datatransfer::dnd::XDropTargetDropContext> 
xDropTargetDropContext =
             new GenericDropTargetDropContext();
@@ -882,7 +889,8 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& 
xWindow, MouseNotifyEven
                 css::uno::Reference<css::datatransfer::XTransferable>());
         }
 
-        pDragWin->ImplGetFrameData()->mbStartDragCalled = false;
+        pDragWin->ImplGetFrameData()->mbDragging = false;
+        return true;
     }
 
     vcl::Window* pDownWin = pFrameData->mpMouseDownWin;

Reply via email to