diff options
author | Caolán McNamara <caolanm@redhat.com> | 2016-11-16 10:16:29 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2016-11-16 10:19:30 +0000 |
commit | 09972f971e13ff967c9897d50ba5fbf0f862e8a4 (patch) | |
tree | 47325053fb92752027b511cd90f4ce2aad34f96d | |
parent | 1034ee0c091036f7d43a42b3213ffa589150e38c (diff) |
gtk3: problems with gdk_drag_status under wayland
under wayland, the value selected by gdk_drag_status is not immediately
available via gdk_drag_context_get_selected_action, so use the value
we set on it, not the value it claims to have
pull common code together as getPreferredDragAction
Change-Id: I4d95c4b8183505f2203ad1a8f6947df983ce8d21
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkframe.cxx | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index e17a8b89388f..a9a32a429e5c 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -3202,6 +3202,23 @@ namespace } } +namespace +{ + static GdkDragAction getPreferredDragAction(sal_Int8 dragOperation) + { + GdkDragAction eAct(static_cast<GdkDragAction>(0)); + + if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_MOVE) + eAct = GDK_ACTION_MOVE; + else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_COPY) + eAct = GDK_ACTION_COPY; + else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_LINK) + eAct = GDK_ACTION_LINK; + + return eAct; + } +} + class GtkDropTargetDropContext : public cppu::WeakImplHelper<css::datatransfer::dnd::XDropTargetDropContext> { GdkDragContext *m_pContext; @@ -3216,16 +3233,7 @@ public: // XDropTargetDropContext virtual void SAL_CALL acceptDrop(sal_Int8 dragOperation) throw(std::exception) override { - GdkDragAction eAct(static_cast<GdkDragAction>(0)); - - if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_MOVE) - eAct = GDK_ACTION_MOVE; - else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_COPY) - eAct = GDK_ACTION_COPY; - else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_LINK) - eAct = GDK_ACTION_LINK; - - gdk_drag_status(m_pContext, eAct, m_nTime); + gdk_drag_status(m_pContext, getPreferredDragAction(dragOperation), m_nTime); } virtual void SAL_CALL rejectDrop() throw(std::exception) override @@ -3378,16 +3386,7 @@ public: virtual void SAL_CALL acceptDrag(sal_Int8 dragOperation) throw(std::exception) override { - GdkDragAction eAct(static_cast<GdkDragAction>(0)); - - if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_MOVE) - eAct = GDK_ACTION_MOVE; - else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_COPY) - eAct = GDK_ACTION_COPY; - else if (dragOperation & css::datatransfer::dnd::DNDConstants::ACTION_LINK) - eAct = GDK_ACTION_LINK; - - gdk_drag_status(m_pContext, eAct, m_nTime); + gdk_drag_status(m_pContext, getPreferredDragAction(dragOperation), m_nTime); } virtual void SAL_CALL rejectDrag() throw(std::exception) override @@ -3429,12 +3428,18 @@ gboolean GtkSalFrame::signalDragMotion(GtkWidget *pWidget, GdkDragContext *conte //preliminary accept the Drag and select the preferred action, the fire_* will //inform the original caller of our choice and the callsite can decide //to overrule this choice. i.e. typically here we default to ACTION_MOVE - pContext->acceptDrag(GdkToVcl(gdk_drag_context_get_actions(context))); + sal_Int8 nSourceActions = GdkToVcl(gdk_drag_context_get_actions(context)); + GdkDragAction eAction = getPreferredDragAction(nSourceActions); + gdk_drag_status(context, eAction, time); aEvent.Context = pContext; aEvent.LocationX = x; aEvent.LocationY = y; - aEvent.DropAction = GdkToVcl(gdk_drag_context_get_selected_action(context)); - aEvent.SourceActions = GdkToVcl(gdk_drag_context_get_actions(context)); + //under wayland at least, the action selected by gdk_drag_status on the + //context is not immediately available via gdk_drag_context_get_selected_action + //so here we set the DropAction from what we selected on the context, not + //what the context says is selected + aEvent.DropAction = GdkToVcl(eAction); + aEvent.SourceActions = nSourceActions; if (!pThis->m_bInDrag) { |