[PATCH wayland 1/2] protocol: Improve data source notification around DnD progress

Bryce Harrington bryce at osg.samsung.com
Fri Jan 15 14:03:04 PST 2016


On Fri, Jan 15, 2016 at 09:11:39PM +0100, Carlos Garnacho wrote:
> Currently, there's no means for the DnD origin to know whether the
> destination is actually finished with the DnD transaction, short of
> finalizing it after the first transfer finishes, or leaking it forever.
> 
> But this poses other interoperation problems, drag destinations might
> be requesting several mimetypes at once, might be just poking to find
> out the most suitable format, might want to defer the action to a popup,
> might be poking contents early before the selection was dropped...
> 
> In addition, data_source.cancelled is suitable for the situations where
> the DnD operation fails (not on a drop target, no matching mimetypes,
> etc..), but seems undocumented for that use (and unused in weston's DnD).
> 
> In order to improve the situation, the drag source should be notified
> of all stages of DnD. In addition to documenting the "cancelled" event
> for DnD purposes, The following 2 events have been added:
> 
> - wl_data_source.dnd_drop_performed: Happens when the operation has been
>   physically finished (eg. the button is released), it could be the right
>   place to reset the pointer cursor back and undo any other state resulting
>   from the initial button press.
> - wl_data_source.dnd_finished: Happens when the destination side destroys
>   the wl_data_offer, at this point the source can just forget all data
>   related to the DnD selection as well, plus optionally deleting the data
>   on move operations.
> 
> Changes since v6:
>   - Turned wl_data_offer.finish calls with 0/NULL state/mimetype an
>     error, made it explicit that it will only result in
>     wl_data_offer.dnd_finished being sent if successful.
> 
> Changes since v5:
>   - Further rewording of wl_data_offer.finish and wl_data_offer.accept.
>     Added error for untimely wl_data_offer.finish requests.
> 
> Changes since v4:
>   - Applied rewording suggestions from Jonas Ådahl. Added new
>     wl_data_offer.finish request to allow explicit finalization on the
>     destination side.
> 
> Changes since v3:
>   - Renamed dnd_performed to a more descriptive dnd_drop_performed,
>     documented backwards compatible behavior on wl_data_offer.accept and
>     wl_data_source.cancelled.
> 
> Changes since v2:
>   - Minor rewording.
> 
> Changes since v1:
>   - Renamed events to have a common "dnd" namespace. Made dnd_performed to
>     happen invariably, data_device.cancelled may still happen afterwards.
> 
> Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
> Reviewed-by: Michael Catanzaro <mcatanzaro at igalia.com>
> Reviewed-by: Jonas Ådahl <jadahl at gmail.com>
> Reviewed-by: Mike Blumenkrantz <zmike at samsung.com>

Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>

(A few minor grammar nitpicks below, which are entirely optional and best
to do in a follow up patch post-alpha if there are no other reasons for
revving this this patch series.)

> ---
>  protocol/wayland.xml | 87 ++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 81 insertions(+), 6 deletions(-)
> 
> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
> index 8a62190..dc05993 100644
> --- a/protocol/wayland.xml
> +++ b/protocol/wayland.xml
> @@ -408,7 +408,7 @@
>    </interface>
>  
>  
> -  <interface name="wl_data_offer" version="1">
> +  <interface name="wl_data_offer" version="3">
>      <description summary="offer to transfer data">
>        A wl_data_offer represents a piece of data offered for transfer
>        by another client (the source client).  It is used by the
> @@ -418,12 +418,27 @@
>        data directly from the source client.
>      </description>
>  
> +    <enum name="error">
> +      <entry name="invalid_finish" value="0"
> +	     summary="finish request was called untimely"/>
> +    </enum>
> +
>      <request name="accept">
>        <description summary="accept one of the offered mime types">
>  	Indicate that the client can accept the given mime type, or
>  	NULL for not accepted.
>  
> -	Used for feedback during drag-and-drop.
> +	For objects of version 2 or older, this request is used by the
> +	client to give feedback whether the client can receive the given
> +	mime type, or NULL if none is accepted; the feedback does not
> +	determine whether drag-and-drop operation succeeds or not.

whether the drag-and-drop

> +	For objects of version 3 or newer, this request determines the
> +	final result of the drag-and-drop operation. If the end result
> +	is that no mime types was accepted, the drag-and-drop operation

no mime types were accepted

> +	will be cancelled and the corresponding drag source will receive
> +	wl_data_source.cancelled. Clients may still use this event in
> +	conjunction with wl_data_source.action for feedback.
>        </description>
>  
>        <arg name="serial" type="uint"/>
> @@ -442,6 +457,11 @@
>  	The receiving client reads from the read end of the pipe until
>  	EOF and then closes its end, at which point the transfer is
>  	complete.
> +
> +	This request may happen multiple times for different mimetypes,
> +	both before and after wl_data_device.drop. Drag-and-drop destination
> +	clients may preemptively fetch data or examine it more closely to
> +	determine acceptance.
>        </description>
>        <arg name="mime_type" type="string"/>
>        <arg name="fd" type="fd"/>
> @@ -461,9 +481,26 @@
>  
>        <arg name="mime_type" type="string"/>
>      </event>
> +
> +    <!-- Version 3 additions -->
> +
> +    <request name="finish" since="3">
> +      <description summary="the offer will no longer be used">
> +	Notifies the compositor that the drag destination successfully
> +	finished the drag-and-drop operation.
> +
> +	Upon receiving this request, the compositor will emit
> +	wl_data_source.dnd_finished on the drag source client.
> +
> +	It is a client error to perform other requests than
> +	wl_data_offer.destroy after this one. It is also an error to perform
> +	this request after a NULL mime type has been set in
> +	wl_data_offer.accept.
> +      </description>
> +    </request>
>    </interface>
>  
> -  <interface name="wl_data_source" version="1">
> +  <interface name="wl_data_source" version="3">
>      <description summary="offer to transfer data">
>        The wl_data_source object is the source side of a wl_data_offer.
>        It is created by the source client in a data transfer and
> @@ -510,14 +547,52 @@
>  
>      <event name="cancelled">
>        <description summary="selection was cancelled">
> -	This data source has been replaced by another data source.
> +	This data source is no longer valid. There are several reasons why
> +	this could happen:
> +
> +	- The data source has been replaced by another data source.
> +	- The drag-and-drop operation was performed, but the drop destination
> +	  did not accept any of the mimetypes offered through
> +	  wl_data_source.target.
> +	- The drag-and-drop operation was performed but didn't happen over a
> +	  surface.
> +	- The compositor cancelled the drag-and-drop operation (e.g. compositor
> +	  dependent timeouts to avoid stale drag-and-drop transfers).
> +
>  	The client should clean up and destroy this data source.
> +
> +	For objects of version 2 or older, wl_data_source.cancelled will
> +	only be emitted if the data source was replaced by another data
> +	source.
> +      </description>
> +    </event>
> +
> +    <!-- Version 3 additions -->
> +
> +    <event name="dnd_drop_performed" since="3">
> +      <description summary="the drag-and-drop operation physically finished">
> +	The user performed the drop action. This event does not indicate
> +	acceptance, wl_data_source.cancelled may still be emitted afterwards
> +	if the drop destination does not accept any mimetype.
> +
> +	This event might however not be received if the compositor cancelled

However, this event might not

> +	the drag-and-drop operation before this event could happen.
> +
> +	Note that the data_source may still be used further in the future and

may still be used in the future

> +	should not be destroyed here.
>        </description>
>      </event>
>  
> +    <event name="dnd_finished" since="3">
> +      <description summary="the drag-and-drop operation concluded">
> +	The drop destination finished interoperating with this data
> +	source, the client is now free to destroy this data source and

source, so the client

> +	free all associated data.
> +      </description>
> +    </event>
>    </interface>
>  
> -  <interface name="wl_data_device" version="2">
> +  <interface name="wl_data_device" version="3">
>      <description summary="data transfer device">
>        There is one wl_data_device per seat which can be obtained
>        from the global wl_data_device_manager singleton.
> @@ -659,7 +734,7 @@
>      </request>
>    </interface>
>  
> -  <interface name="wl_data_device_manager" version="2">
> +  <interface name="wl_data_device_manager" version="3">
>      <description summary="data transfer interface">
>        The wl_data_device_manager is a singleton global object that
>        provides access to inter-client data transfer mechanisms such as
> -- 
> 2.5.0
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list