aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--types/data_device/wlr_data_offer.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/types/data_device/wlr_data_offer.c b/types/data_device/wlr_data_offer.c
index 0b0332b1..26b894ea 100644
--- a/types/data_device/wlr_data_offer.c
+++ b/types/data_device/wlr_data_offer.c
@@ -135,6 +135,27 @@ static void data_offer_handle_finish(struct wl_client *client,
return;
}
+ // TODO: also fail while we have a drag-and-drop grab
+ if (offer->type != WLR_DATA_OFFER_DRAG) {
+ wl_resource_post_error(offer->resource,
+ WL_DATA_OFFER_ERROR_INVALID_FINISH, "Offer is not drag-and-drop");
+ return;
+ }
+ if (!offer->source->accepted) {
+ wl_resource_post_error(offer->resource,
+ WL_DATA_OFFER_ERROR_INVALID_FINISH, "Premature finish request");
+ return;
+ }
+ enum wl_data_device_manager_dnd_action action =
+ offer->source->current_dnd_action;
+ if (action == WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE ||
+ action == WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK) {
+ wl_resource_post_error(offer->resource,
+ WL_DATA_OFFER_ERROR_INVALID_FINISH,
+ "Offer finished with an invalid action");
+ return;
+ }
+
data_offer_dnd_finish(offer);
data_offer_destroy(offer);
}