vcl/source/window/winproc.cxx |   48 +++++++++++++++++++++++-------------------
 1 file changed, 27 insertions(+), 21 deletions(-)

New commits:
commit f0117eefa7d1b35e747546fd7d7a28126ebff0b7
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Wed Jun 23 08:18:08 2021 -0400
Commit:     Henry Castro <hcas...@collabora.com>
CommitDate: Fri Feb 18 16:11:42 2022 +0100

    lok: reset and cancel properly Drag & Drop action
    
    used patch from Henry as a template:
    https://gerrit.libreoffice.org/c/core/+/118844/17
    
    but without custom actions invocation
    
    Change-Id: I8bce66deffee0de16f3c24f009cfee077eb26e82
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123243
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129469
    Tested-by: Jenkins
    Reviewed-by: Henry Castro <hcas...@collabora.com>

diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx
index ebd1fa43c0a5..1e6d42ddcbff 100644
--- a/vcl/source/window/winproc.cxx
+++ b/vcl/source/window/winproc.cxx
@@ -840,18 +840,12 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& 
xWindow, MouseNotifyEven
         css::uno::Reference<css::datatransfer::dnd::XDropTarget> xDropTarget(
             pDragWin->ImplGetWindowImpl()->mxDNDListenerContainer, 
css::uno::UNO_QUERY);
 
-        if ((nCode & (MOUSE_LEFT | MOUSE_RIGHT | MOUSE_MIDDLE)) !=
+        if (!xDropTarget.is() ||
+            !xDropTargetDragContext.is() ||
+            (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()->mbDragging = false;
+            pFrameData->mbStartDragCalled = pFrameData->mbDragging = false;
             return false;
         }
 
@@ -871,28 +865,40 @@ bool ImplLOKHandleMouseEvent(const VclPtr<vcl::Window>& 
xWindow, MouseNotifyEven
         nEvent == MouseNotifyEvent::MOUSEBUTTONUP &&
         pFrameData->mbDragging)
     {
+        css::uno::Reference<css::datatransfer::XTransferable> xTransfer;
         css::uno::Reference<css::datatransfer::dnd::XDropTargetDropContext> 
xDropTargetDropContext =
             new GenericDropTargetDropContext();
         css::uno::Reference<css::datatransfer::dnd::XDropTarget> xDropTarget(
             pDragWin->ImplGetWindowImpl()->mxDNDListenerContainer, 
css::uno::UNO_QUERY);
 
-        if (xDropTargetDropContext.is() && xDropTarget.is())
+        if (!xDropTarget.is() || !xDropTargetDropContext.is())
         {
-            static_cast<DNDListenerContainer 
*>(xDropTarget.get())->fireDropEvent(
-                xDropTargetDropContext,
-                css::datatransfer::dnd::DNDConstants::ACTION_MOVE,
-                aWinPos.X(),
-                aWinPos.Y(),
-                (css::datatransfer::dnd::DNDConstants::ACTION_COPY |
-                 css::datatransfer::dnd::DNDConstants::ACTION_MOVE |
-                 css::datatransfer::dnd::DNDConstants::ACTION_LINK),
-                css::uno::Reference<css::datatransfer::XTransferable>());
+            pFrameData->mbStartDragCalled = pFrameData->mbDragging = false;
+            return false;
         }
 
-        pDragWin->ImplGetFrameData()->mbDragging = false;
+        Point dragOverPos = pDragWin->ImplFrameToOutput(aMousePos);
+        static_cast<DNDListenerContainer *>(xDropTarget.get())->fireDropEvent(
+            xDropTargetDropContext,
+            css::datatransfer::dnd::DNDConstants::ACTION_MOVE,
+            dragOverPos.X(),
+            dragOverPos.Y(),
+            (css::datatransfer::dnd::DNDConstants::ACTION_COPY |
+             css::datatransfer::dnd::DNDConstants::ACTION_MOVE |
+             css::datatransfer::dnd::DNDConstants::ACTION_LINK),
+            xTransfer);
+
+        pFrameData->mbStartDragCalled = pFrameData->mbDragging = false;
         return true;
     }
 
+    if (pFrameData->mbDragging)
+    {
+        // wrong status, reset
+        pFrameData->mbStartDragCalled = pFrameData->mbDragging = false;
+        return false;
+    }
+
     vcl::Window* pDownWin = pFrameData->mpMouseDownWin;
     if (pDownWin && nEvent == MouseNotifyEvent::MOUSEMOVE)
     {

Reply via email to