diff --git a/src/lib/ecore_wl2/ecore_wl2_display.c b/src/lib/ecore_wl2/ecore_wl2_display.c index 27f7bc8713..ed7ee717f7 100644 --- a/src/lib/ecore_wl2/ecore_wl2_display.c +++ b/src/lib/ecore_wl2/ecore_wl2_display.c @@ -115,8 +115,9 @@ _cb_global_add(void *data, struct wl_registry *registry, unsigned int id, const } else if (!strcmp(interface, "wl_data_device_manager")) { + ewd->wl.data_device_manager_version = MIN(version, 3); ewd->wl.data_device_manager = - wl_registry_bind(registry, id, &wl_data_device_manager_interface, 1); + wl_registry_bind(registry, id, &wl_data_device_manager_interface, ewd->wl.data_device_manager_version); } else if (!strcmp(interface, "wl_shell")) { diff --git a/src/lib/ecore_wl2/ecore_wl2_dnd.c b/src/lib/ecore_wl2/ecore_wl2_dnd.c index 4aca1f04d8..439ca8f17e 100644 --- a/src/lib/ecore_wl2/ecore_wl2_dnd.c +++ b/src/lib/ecore_wl2/ecore_wl2_dnd.c @@ -56,9 +56,28 @@ _offer_cb_offer(void *data, struct wl_data_offer *offer EINA_UNUSED, const char if (t) *t = strdup(type); } + +static void +data_offer_source_actions(void *data, struct wl_data_offer *wl_data_offer EINA_UNUSED, uint32_t source_actions) +{ + Ecore_Wl2_Dnd_Source *source = data; + + source->source_actions = source_actions; +} + +static void +data_offer_action(void *data, struct wl_data_offer *wl_data_offer EINA_UNUSED, uint32_t dnd_action) +{ + Ecore_Wl2_Dnd_Source *source = data; + + source->dnd_action = dnd_action; +} + static const struct wl_data_offer_listener _offer_listener = { - _offer_cb_offer + _offer_cb_offer, + data_offer_source_actions, + data_offer_action }; static void @@ -321,6 +340,12 @@ _ecore_wl2_dnd_enter(Ecore_Wl2_Input *input, struct wl_data_offer *offer, struct input->drag.source = wl_data_offer_get_user_data(offer); num = (input->drag.source->types.size / sizeof(char *)); types = input->drag.source->types.data; + if (input->display->wl.data_device_manager_version >= + WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION) + wl_data_offer_set_actions(offer, + WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY | + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE, + WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE); } else { diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h b/src/lib/ecore_wl2/ecore_wl2_private.h index 0de0190c5e..c1a4e6a15f 100644 --- a/src/lib/ecore_wl2/ecore_wl2_private.h +++ b/src/lib/ecore_wl2/ecore_wl2_private.h @@ -74,6 +74,7 @@ struct _Ecore_Wl2_Display struct wl_compositor *compositor; struct wl_subcompositor *subcompositor; struct wl_data_device_manager *data_device_manager; + int data_device_manager_version; struct wl_shm *shm; struct zwp_linux_dmabuf_v1 *dmabuf; struct wl_shell *wl_shell; @@ -178,6 +179,8 @@ typedef struct _Ecore_Wl2_Dnd_Source struct wl_data_offer *offer; struct wl_array types; + uint32_t dnd_action; + uint32_t source_actions; } Ecore_Wl2_Dnd_Source;