Add reject round trip to dnd protocol
authorKristian Høgsberg <krh@bitplanet.net>
Tue, 30 Nov 2010 20:10:26 +0000 (15:10 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 30 Nov 2010 20:10:26 +0000 (15:10 -0500)
This lets a drag target reject a drop.

clients/dnd.c
compositor/compositor.c
protocol/wayland.xml

index d0f2081..d5594ff 100644 (file)
@@ -271,9 +271,16 @@ drag_finish(void *data, struct wl_drag *drag, int fd)
        free(dnd_drag);
 }
 
+static void
+drag_reject(void *data, struct wl_drag *drag)
+{
+       fprintf(stderr, "drop rejected\n");
+}
+
 static const struct wl_drag_listener drag_listener = {
        drag_target,
-       drag_finish
+       drag_finish,
+       drag_reject
 };
 
 static void
@@ -379,10 +386,7 @@ drag_offer_drop(void *data, struct wl_drag_offer *offer)
 
        if (!dnd_offer->drag_type) {
                fprintf(stderr, "got 'drop', but no target\n");
-               /* FIXME: Should send response so compositor and
-                * source knows it's over. Can't send -1 to indicate
-                * 'no target' though becauses of the way fd passing
-                * currently works.  */
+               wl_drag_offer_reject(offer);
                return;
        }
 
index cbb0b6b..f993bf6 100644 (file)
@@ -1137,9 +1137,19 @@ drag_offer_receive(struct wl_client *client,
        close(fd);
 }
 
+static void
+drag_offer_reject(struct wl_client *client, struct wl_drag_offer *offer)
+{
+       struct wl_drag *drag = container_of(offer, struct wl_drag, drag_offer);
+
+       wl_client_post_event(drag->source->client, &drag->resource.base,
+                            WL_DRAG_REJECT);
+}
+
 static const struct wl_drag_offer_interface drag_offer_interface = {
        drag_offer_accept,
-       drag_offer_receive
+       drag_offer_receive,
+       drag_offer_reject
 };
 
 static void
index 24c53c2..77ff8f8 100644 (file)
     <event name="finish">
       <arg name="fd" type="fd"/>
     </event>
+
+    <event name="reject"/>
   </interface>
 
 
       <arg name="fd" type="fd"/>
     </request>
 
+    <!-- Called to reject a drop  -->
+    <request name="reject"/>
+
     <!-- Sent before the pointer_focus event to announce the types
          offered.  One event per offered mime type. -->
     <event name="offer">