summaryrefslogtreecommitdiff
path: root/vcl/unx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-07-17 21:29:46 +0100
committerCaolán McNamara <caolanm@redhat.com>2018-07-18 09:25:54 +0200
commitc92dd5a2ba5fd07a32d1671bb8dfcb03bfb95e10 (patch)
treebc516272296203d0ba7cda3d0caa4b8ecfe6c3e9 /vcl/unx
parent4edb7599d83c897cc7e800b916dcedf07b645cba (diff)
Resolves: tdf#118302 drag n drop to same tab should cancel dnd
dropComplete is used to do this, follow the mac pattern here to propogate this in the drag and drop from self to self case. Maybe this also affects tdf#105320 ? Change-Id: I2b8f8b0e0486f6ee45a65918fae2537750a75f2d Reviewed-on: https://gerrit.libreoffice.org/57589 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx')
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx18
1 files changed, 17 insertions, 1 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 6a443526e8db..c1c560b3f9ce 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -3422,6 +3422,9 @@ namespace
}
}
+static bool g_DropSuccessSet = false;
+static bool g_DropSuccess = false;
+
class GtkDropTargetDropContext : public cppu::WeakImplHelper<css::datatransfer::dnd::XDropTargetDropContext>
{
GdkDragContext *m_pContext;
@@ -3447,6 +3450,11 @@ public:
virtual void SAL_CALL dropComplete(sal_Bool bSuccess) override
{
gtk_drag_finish(m_pContext, bSuccess, false, m_nTime);
+ if (GtkDragSource::g_ActiveDragSource)
+ {
+ g_DropSuccessSet = true;
+ g_DropSuccess = bSuccess;
+ }
}
};
@@ -4341,9 +4349,12 @@ void GtkDragSource::startDrag(const datatransfer::dnd::DragGestureEvent& rEvent,
// For LibreOffice internal D&D we provide the Transferable without Gtk
// intermediaries as a shortcut, see tdf#100097 for how dbaccess depends on this
g_ActiveDragSource = this;
+ g_DropSuccessSet = false;
+ g_DropSuccess = false;
m_pFrame->startDrag(nDragButton, rEvent.DragOriginX, rEvent.DragOriginY,
VclToGdk(sourceActions), pTargetList);
+
gtk_target_list_unref(pTargetList);
for (auto &a : aGtkTargets)
g_free(a.target);
@@ -4428,7 +4439,12 @@ void GtkDragSource::dragEnd(GdkDragContext* context)
{
datatransfer::dnd::DragSourceDropEvent aEv;
aEv.DropAction = GdkToVcl(gdk_drag_context_get_selected_action(context));
- aEv.DropSuccess = true;
+ // an internal drop can accept the drop but fail with dropComplete( false )
+ // this is different than the GTK API
+ if (g_DropSuccessSet)
+ aEv.DropSuccess = g_DropSuccess;
+ else
+ aEv.DropSuccess = true;
auto xListener = m_xListener;
m_xListener.clear();
xListener->dragDropEnd(aEv);