Bug 1464808 - [Wayland] Emulate gdk_drag_context_get_actions(), nsWaylandDragContext::GetSelectedDragAction returns available D&D actions when no one is selected by user, r?jhorak draft
authorMartin Stransky <stransky@redhat.com>
Fri, 01 Jun 2018 12:24:17 +0200
changeset 802735 05903f2dc5621178bb5ef481a20dd6433d8efad6
parent 802004 f5958872610b8b8911abb7ea78fc5e1121fa0b1d
push id111937
push userstransky@redhat.com
push dateFri, 01 Jun 2018 10:25:06 +0000
reviewersjhorak
bugs1464808
milestone62.0a1
Bug 1464808 - [Wayland] Emulate gdk_drag_context_get_actions(), nsWaylandDragContext::GetSelectedDragAction returns available D&D actions when no one is selected by user, r?jhorak MozReview-Commit-ID: 586XiJXYZ3D
widget/gtk/nsClipboardWayland.cpp
widget/gtk/nsClipboardWayland.h
--- a/widget/gtk/nsClipboardWayland.cpp
+++ b/widget/gtk/nsClipboardWayland.cpp
@@ -232,16 +232,28 @@ WaylandDataOffer::SetSelectedDragAction(
 }
 
 GdkDragAction
 WaylandDataOffer::GetSelectedDragAction()
 {
     return wl_to_gdk_actions(mSelectedDragAction);
 }
 
+void
+WaylandDataOffer::SetAvailableDragActions(uint32_t aWaylandActions)
+{
+    mAvailableDragAction = aWaylandActions;
+}
+
+GdkDragAction
+WaylandDataOffer::GetAvailableDragActions()
+{
+    return wl_to_gdk_actions(mAvailableDragAction);
+}
+
 static void
 data_offer_offer (void                 *data,
                   struct wl_data_offer *wl_data_offer,
                   const char           *type)
 {
     auto *offer = static_cast<DataOffer*>(data);
     offer->AddMIMEType(type);
 }
@@ -250,16 +262,18 @@ data_offer_offer (void                 *
  * We don't use that but follow gdk_wayland_drag_context_commit_status()
  * from gdkdnd-wayland.c here.
  */
 static void
 data_offer_source_actions(void *data,
                           struct wl_data_offer *wl_data_offer,
                           uint32_t source_actions)
 {
+    auto *offer = static_cast<WaylandDataOffer*>(data);
+    offer->SetAvailableDragActions(source_actions);
 }
 
 /* Advertise recently selected drag and drop action by compositor, based
  * on source actions and user choice (key modifiers, etc.).
  */
 static void
 data_offer_action(void *data,
                   struct wl_data_offer *wl_data_offer,
@@ -383,17 +397,24 @@ void
 nsWaylandDragContext::SetDragStatus(GdkDragAction aAction)
 {
     mDataOffer->SetDragStatus(aAction, mTime);
 }
 
 GdkDragAction
 nsWaylandDragContext::GetSelectedDragAction()
 {
-    return mDataOffer->GetSelectedDragAction();
+    GdkDragAction gdkAction = mDataOffer->GetSelectedDragAction();
+
+    // We emulate gdk_drag_context_get_actions() here.
+    if (!gdkAction) {
+        gdkAction = mDataOffer->GetAvailableDragActions();
+    }
+
+    return gdkAction;
 }
 
 GList*
 nsWaylandDragContext::GetTargets()
 {
     int targetNums;
     GdkAtom *atoms = mDataOffer->GetTargets(&targetNums);
 
--- a/widget/gtk/nsClipboardWayland.h
+++ b/widget/gtk/nsClipboardWayland.h
@@ -42,24 +42,26 @@ public:
     WaylandDataOffer(wl_data_offer* aWaylandDataOffer);
 
     void DragOfferAccept(const char* aMimeType, uint32_t aTime);
     void SetDragStatus(GdkDragAction aAction, uint32_t aTime);
 
     GdkDragAction GetSelectedDragAction();
     void SetSelectedDragAction(uint32_t aWaylandAction);
 
-    void SetSourceDragActions(uint32_t aWaylandActions);
+    void SetAvailableDragActions(uint32_t aWaylandActions);
+    GdkDragAction GetAvailableDragActions();
 
     virtual ~WaylandDataOffer();
 private:
     bool RequestDataTransfer(const char* aMimeType, int fd) override;
 
     wl_data_offer* mWaylandDataOffer;
     uint32_t       mSelectedDragAction;
+    uint32_t       mAvailableDragAction;
 };
 
 class PrimaryDataOffer : public DataOffer
 {
 public:
     PrimaryDataOffer(gtk_primary_selection_offer* aPrimaryDataOffer);
     void SetAvailableDragActions(uint32_t aWaylandActions) {};