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
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
--- 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) {};