summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-10-25 09:38:36 +0100
committerDavid Tardon <dtardon@redhat.com>2016-11-14 09:25:29 +0000
commit015061495373d7c09362b175dc1f6be3f2a37a1a (patch)
tree351b087cc84d54fcd0ba0c8f3f93cb31dfe50d73
parent489914a676ae5aadc68063d6d41de111728f2eb4 (diff)
Resolves: tdf#103472 gtk3 dnd must clear listener after dragDropEnd dispatch
like the generic dnd impl does Change-Id: Ie860c43329ee2f9332d12a53cd691ac7fcbb5eac (cherry picked from commit 461e9cc64b5a6e9943db397d27c6415327386494) Reviewed-on: https://gerrit.libreoffice.org/30260 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: David Tardon <dtardon@redhat.com>
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx39
1 files changed, 27 insertions, 12 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 931ed03febb7..812e4b84dc13 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -4195,10 +4195,15 @@ void GtkSalFrame::startDrag(gint nButton, gint nDragOriginX, gint nDragOriginY,
void GtkDragSource::dragFailed()
{
- datatransfer::dnd::DragSourceDropEvent aEv;
- aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_NONE;
- aEv.DropSuccess = false;
- m_xListener->dragDropEnd(aEv);
+ if (m_xListener.is())
+ {
+ datatransfer::dnd::DragSourceDropEvent aEv;
+ aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_NONE;
+ aEv.DropSuccess = false;
+ auto xListener = m_xListener;
+ m_xListener.clear();
+ xListener->dragDropEnd(aEv);
+ }
}
gboolean GtkSalFrame::signalDragFailed(GtkWidget* /*widget*/, GdkDragContext* /*context*/, GtkDragResult /*result*/, gpointer frame)
@@ -4212,10 +4217,15 @@ gboolean GtkSalFrame::signalDragFailed(GtkWidget* /*widget*/, GdkDragContext* /*
void GtkDragSource::dragDelete()
{
- datatransfer::dnd::DragSourceDropEvent aEv;
- aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_MOVE;
- aEv.DropSuccess = true;
- m_xListener->dragDropEnd(aEv);
+ if (m_xListener.is())
+ {
+ datatransfer::dnd::DragSourceDropEvent aEv;
+ aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_MOVE;
+ aEv.DropSuccess = true;
+ auto xListener = m_xListener;
+ m_xListener.clear();
+ xListener->dragDropEnd(aEv);
+ }
}
void GtkSalFrame::signalDragDelete(GtkWidget* /*widget*/, GdkDragContext* /*context*/, gpointer frame)
@@ -4228,10 +4238,15 @@ void GtkSalFrame::signalDragDelete(GtkWidget* /*widget*/, GdkDragContext* /*cont
void GtkDragSource::dragEnd(GdkDragContext* context)
{
- datatransfer::dnd::DragSourceDropEvent aEv;
- aEv.DropAction = GdkToVcl(gdk_drag_context_get_selected_action(context));
- aEv.DropSuccess = gdk_drag_drop_succeeded(context);
- m_xListener->dragDropEnd(aEv);
+ if (m_xListener.is())
+ {
+ datatransfer::dnd::DragSourceDropEvent aEv;
+ aEv.DropAction = GdkToVcl(gdk_drag_context_get_selected_action(context));
+ aEv.DropSuccess = gdk_drag_drop_succeeded(context);
+ auto xListener = m_xListener;
+ m_xListener.clear();
+ xListener->dragDropEnd(aEv);
+ }
g_ActiveDragSource = nullptr;
}