From 737ac0d4b3f7b40c345b61ff62dea0550217f063 Mon Sep 17 00:00:00 2001 From: Harish Krupo Date: Fri, 19 Apr 2019 22:06:37 +0530 Subject: [PATCH] data-device: send INVALID_FINISH when operation != dnd The documentation of wl_data_offer::finish states that it should be used to signify that a drag and drop operation is completed. So send WL_DATA_OFFER_ERROR_INVALID_FINISH when the client calls the finish request but the operation isn't dnd. Signed-off-by: Harish Krupo --- include/libweston/libweston.h | 1 + libweston/data-device.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index 96583187..f30b6638 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -427,6 +427,7 @@ struct weston_data_source { struct weston_seat *seat; bool accepted; bool actions_set; + bool set_selection; uint32_t dnd_actions; enum wl_data_device_manager_dnd_action current_dnd_action; enum wl_data_device_manager_dnd_action compositor_action; diff --git a/libweston/data-device.c b/libweston/data-device.c index b0fb7760..e19409fc 100644 --- a/libweston/data-device.c +++ b/libweston/data-device.c @@ -220,6 +220,13 @@ data_offer_finish(struct wl_client *client, struct wl_resource *resource) if (!offer->source || offer->source->offer != offer) return; + if (offer->source->set_selection) { + wl_resource_post_error(offer->resource, + WL_DATA_OFFER_ERROR_INVALID_FINISH, + "finish only valid for drag n drop"); + return; + } + /* Disallow finish while we have a grab driving drag-and-drop, or * if the negotiation is not at the right stage */ @@ -1145,6 +1152,7 @@ weston_seat_set_selection(struct weston_seat *seat, seat->selection_data_source = source; seat->selection_serial = serial; + source->set_selection = true; if (keyboard) focus = keyboard->focus; @@ -1267,6 +1275,7 @@ create_data_source(struct wl_client *client, source->dnd_actions = 0; source->current_dnd_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE; source->compositor_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE; + source->set_selection = false; wl_array_init(&source->mime_types);