[PATCH] protocol: Add DnD actions
Bryce Harrington
bryce at osg.samsung.com
Wed Mar 18 16:56:58 PDT 2015
On Mon, Feb 16, 2015 at 04:37:34PM +0100, Carlos Garnacho wrote:
> These 2 requests have been added:
>
> - wl_data_source.notify_actions request: Notifies the compositor of the
> available actions on the data source.
> - wl_data_offer.notify_actions request: Notifies the compositor of the
> available actions on the destination side, plus the preferred action.
>
> Out of the data from these requests, the compositor can determine the action
> both parts agree on (and optionally let the user play a role through eg.
> keyboard modifiers). The chosen option will be notified to both parties
> through the following two requests:
>
> - wl_data_source.action
> - wl_data_offer.action
>
> Compared to the XDND protocol, there is one notable change: XDND lets the
> source suggest an action, whereas wl_data_device lets the destination
> prefer a given action. The difference is subtle here, it comes off as
> convenience because it is the drag destination which receives the motion
> events (unlike in X) and can perform action updates.
>
> The drag destination seems also in a better position to update the
> preferred action based on things like the data being transferred, the
> place being dropped, and whether the drag is client-local.
>
> Additionally, the wl_data_source.drop_performed and finished events will
> notify the source of the different termination phases of the DnD operation.
>
> Roughly based on previous work by Giulio Camuffo <giuliocamuffo at gmail.com>
> ---
> protocol/wayland.xml | 97 +++++++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 92 insertions(+), 5 deletions(-)
>
> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
> index 2a49805..110804e 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
> @@ -461,9 +461,37 @@
>
> <arg name="mime_type" type="string"/>
> </event>
> +
> + <!-- Version 3 additions -->
Watch your spaces and tabs, looks like there's a mix...
> + <event name="action" since="3">
> + <description summary="notify the selected action">
> + This event notifies the offer of the action selected by the compositor.
The phrasing of this first sentence seems cumbersome. Maybe:
This event indicates the action selected by the compositor from the
offered set of actions.
> + The action will be determined after matching the options offered by the
> + source side (through data_source.set_actions) and the destination side
> + (through data_offer.notify_actions).
> +
> + This event can be emitted multiple times during the lifetime of a
> + data_offer, the most recent action received is always the valid one.
> + </description>
> + <arg name="dnd_action" type="uint"/>
> + </event>
> +
> + <request name="notify_actions" since="3">
> + <description summary="the data has been dropped">
> + Sets the actions that the client supports for this operation. This
> + request may trigger a data_offer.action event if the compositor needs
> + changing the selected option after the destination-side change.
> +
> + Compositors wishing to stay compatible with earlier data_device versions
> + should set the "copy" action by default.
Perhaps do you mean?
"copy" action *as the* default
> + </description>
> + <arg name="dnd_actions" type="uint"/>
> + <arg name="preferred_action" type="uint"/>
> + </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 +538,61 @@
>
> <event name="cancelled">
> <description summary="selection was cancelled">
> - This data source has been replaced by another data source.
> + This data source has been replaced by another data source, or
> + the drop operation finished, but resulted on no mimetype requested
> + through data_source.target or no action notified through data_source.action.
The wording here is very confusing. Also I think you meant "in no"
rather than "on no".
Perhaps try phrasing it, "This data source is no longer valid. There
are several reasons why this could happen: ..."
> The client should clean up and destroy this data source.
> </description>
> </event>
>
> + <!-- Version 3 additions -->
> +
> + <event name="action" since="3">
> + <description summary="notify the selected action">
> + This event notifies the data_source of the action selected by the
> + compositor. The action will be determined after matching the options
as above
> + offered by the source side (through data_source.set_actions) and the
> + destination side (through data_offer.notify_actions).
> +
> + This event can be emitted multiple times during the lifetime of a
> + data_offer, the most recent action received is always the valid one.
> + </description>
> + <arg name="dnd_action" type="uint"/>
> + </event>
> +
> + <request name="notify_actions" since="3">
> + <description summary="notify the available actions">
> + Sets the actions the source client supports for this operation. This
> + request may trigger a data_source.action event if the compositor needs
> + changing the selected option after the source-side change.
needs *to change* the
> +
> + Clients are recommended to hardcode the "ask" action, so they can honor
> + this action as the preferred by the destination side.
Maybe:
Clients should always provide the "ask" action as one of the
available options, so the destination side always knows at least
one action that will be honored.
> + Compositors wishing to stay compatible with earlier data_device versions
> + should set the "copy" action by default.
> + </description>
> + <arg name="dnd_actions" type="uint"/>
> + </request>
> +
> + <event name="drop_performed">
> + <description summary="the drag and drop operation physically finished">
> + The user dropped this data onto an accepting destination. Note that
> + the data_source will be used further in the future (either immediately,
> + or in a delayed manner on "ask" actions) and should not be destroyed
> + here.
> + </description>
> + </event>
> +
> + <event name="finished">
> + <description summary="the drag and drop operation finished">
> + The drop destination finished requesting data from this data_source.
> + The client should clean up and destroy this data source.
> + </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
> @@ -682,6 +757,18 @@
> <arg name="id" type="new_id" interface="wl_data_device"/>
> <arg name="seat" type="object" interface="wl_seat"/>
> </request>
> +
> + <!-- Version 3 additions -->
> +
> + <enum name="dnd_action" since="3">
> + <description summary="drag and drop actions">
> + This is a bitmask of the available/preferred actions in a drag and drop
> + operation.
> + </description>
> + <entry name="copy" value="1"/>
> + <entry name="move" value="2"/>
> + <entry name="ask" value="4"/>
> + </enum>
> </interface>
>
> <interface name="wl_shell" version="1">
Bryce
More information about the wayland-devel
mailing list