data-device: send INVALID_FINISH when operation != dnd
authorHarish Krupo <harishkrupo@gmail.com>
Fri, 19 Apr 2019 16:36:37 +0000 (22:06 +0530)
committerHarish Krupo <harishkrupo@gmail.com>
Fri, 19 Apr 2019 16:36:37 +0000 (22:06 +0530)
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 <harishkrupo@gmail.com>
include/libweston/libweston.h
libweston/data-device.c

index 965831878c2435b6b62f197e13ab5620dc3eba18..f30b66386cc9a8802c713fb034bff697f17ab40a 100644 (file)
@@ -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;
index b0fb776054a72ddd4aac8662dd490833c942def1..e19409fc445ca7ba3470a7cc445f8f274f15a0a2 100644 (file)
@@ -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);