[PATCH wayland v4] protocol: Add DnD actions
Michael Catanzaro
mcatanzaro at igalia.com
Wed Sep 30 16:02:45 PDT 2015
Reviewed-by: Michael Catanzaro <mcatanzaro at igalia.com>
Nit regarding data_offer.action and data_source.action: "This event can
be emitted multiple times during the drag-and-drop operation, mainly in
response to source side changes (through data_source.set_actions),
destination side changes (through data_offer.set_actions), and as *the*
pointer enters/leaves surfaces."
Nit regarding data_offer.set_actions and data_source.set_actions: "This
request may trigger the emission of data_source.action and
data_offer.action events if the compositor needs *to change* the
selected action."
On Wed, 2015-09-30 at 22:46 +0200, Carlos Garnacho wrote:
> These 2 requests have been added:
>
> - wl_data_source.set_actions: Notifies the compositor of the
> available
> actions on the data source.
> - wl_data_offer.set_actions: 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 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
>
> In addition, the destination side can peek the source side actions
> through
> wl_data_offer.source_actions.
>
> Compared to the XDND protocol, there's two notable changes:
>
> - 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.
>
> - That same source-side preferred action is used in XDND to convey
> the
> modifier-induced action to the drag destination, which would then
> ack
> it, or reply with another action that's accepted (or none), this
> makes
> the XdndPosition/XdndStatus messaging very verbose, and synchronous
> because the drag source always needs to know the latest
> status/action
> for every position+action sent.
>
> Here it's the compositor which takes care of modifiers and matching
> available/accepted actions, this allows for the signaling to happen
> only whenever the actions/modifiers change for real.
>
> Roughly based on previous work by Giulio Camuffo <
> giuliocamuffo at gmail.com>
>
> Changes since v3:
> - Splitted from DnD progress notification changes.
> - Further rationales in commit log.
>
> Changes since v2:
> - Renamed notify_actions to set_actions on both sides, seems more
> consistent
> with the rest of the protocol.
> - Spelled out better which events may be triggered on the compositor
> side
> by the requests, the circumstances in which events are emitted, and
> what are events useful for in clients.
> - Defined a minimal common ground wrt compositor-side action picking
> and
> keybindings.
> - Acknowledge the possibility of compositor/toolkit defined actions,
> even
> though none are used at the moment.
> Changes since v1:
> - Added wl_data_offer.source_actions to let know of the actions
> offered
> by a data source.
> - Renamed wl_data_source.finished to "drag_finished" for clarity
> - Improved wording as suggested by Bryce
>
> Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
> ---
> protocol/wayland.xml | 125
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 125 insertions(+)
>
> diff --git a/protocol/wayland.xml b/protocol/wayland.xml
> index 1ee143f..92fcd99 100644
> --- a/protocol/wayland.xml
> +++ b/protocol/wayland.xml
> @@ -461,6 +461,52 @@
>
> <arg name="mime_type" type="string"/>
> </event>
> +
> + <!-- Version 3 additions -->
> +
> + <event name="source_actions" since="3">
> + <description summary="notify the source-side available
> actions">
> + This event indicates the actions offered by the data source.
> It
> + will be sent right after data_device.enter, or anytime the
> source
> + side changes its offered actions through
> data_source.set_actions.
> + </description>
> + <arg name="source_actions" type="uint"/>
> + </event>
> +
> + <event name="action" since="3">
> + <description summary="notify the selected action">
> + This event indicates the action selected by the compositor
> after
> + matching the source/destination side actions. Only one
> action (or
> + none) will be offered here.
> +
> + This event can be emitted multiple times during the drag-and
> -drop
> + operation, mainly in response to source side changes
> (through
> + data_source.set_actions), destination side changes (through
> + data_offer.set_actions), and as pointer enters/leaves
> surfaces.
> +
> + Compositors may also change the selected action on the fly,
> mainly
> + in response to keyboard modifier changes during the drag-and
> -drop
> + operation.
> +
> + The most recent action received is always the valid one.
> + </description>
> + <arg name="dnd_action" type="uint"/>
> + </event>
> +
> + <request name="set_actions" since="3">
> + <description summary="set the available/preferred drag-and
> -drop actions">
> + Sets the actions that the destination side client supports
> for
> + this operation. This request may trigger the emission of
> + data_source.action and data_offer.action events if the
> compositor
> + needs changing the selected action.
> +
> + This request can be called multiple times throughout the
> + drag-and-drop operation, typically in response to
> data_device.enter
> + or data_device.motion events.
> + </description>
> + <arg name="dnd_actions" type="uint"/>
> + <arg name="preferred_action" type="uint"/>
> + </request>
> </interface>
>
> <interface name="wl_data_source" version="3">
> @@ -517,6 +563,9 @@
> - The drop operation finished, but the drop destination did
> not
> accept any of the mimetypes offered through
> data_source.target.
> - The drop operation finished but didn't happen over a DnD
> target.
> + - The drop operation finished, but the drop destination did
> not
> + select any action present in the mask offered through
> + data_source.action.
>
> The client should clean up and destroy this data source.
> </description>
> @@ -537,8 +586,44 @@
> The drop destination finished interoperating with this data
> source, the client is now free to destroy this data source
> and
> free all associated data.
> +
> + Clients can also trigger the deletion of source-side data on
> + "move" drag-and-drop operations.
> </description>
> </event>
> +
> + <event name="action" since="3">
> + <description summary="notify the selected action">
> + This event indicates the action selected by the compositor
> after
> + matching the source/destination side actions. Only one
> action (or
> + none) will be offered here.
> +
> + This event can be emitted multiple times during the drag-and
> -drop
> + operation, mainly in response to source side changes
> (through
> + data_source.set_actions), destination side changes (through
> + data_offer.set_actions), and as pointer enters/leaves
> surfaces.
> +
> + Compositors may also change the selected action on the fly,
> mainly
> + in response to keyboard modifier changes during the drag-and
> -drop
> + operation.
> +
> + The most recent action received is always the valid one.
> +
> + Clients can trigger cursor surface changes from this point,
> so
> + they reflect the current action.
> + </description>
> + <arg name="dnd_action" type="uint"/>
> + </event>
> +
> + <request name="set_actions" since="3">
> + <description summary="set the available drag-and-drop
> actions">
> + Sets the actions that the source side client supports for
> this
> + operation. This request may trigger a data_source.action
> event and
> + data_offer.action events if the compositor needs changing
> the
> + selected action.
> + </description>
> + <arg name="dnd_actions" type="uint"/>
> + </request>
> </interface>
>
> <interface name="wl_data_device" version="3">
> @@ -706,6 +791,46 @@
> <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.
> +
> + The current reserved ranges are:
> +
> + 0x0000 - 0x00FF: Reserved for the wayland core protocol.
> + 0x01FF - 0xFFFF: Reserved for future toolkit-specific use.
> Slots
> + may be reserved.
> +
> + In the compositor, the selected action comes out as a result
> of
> + matching the actions offered by the source and destination
> sides,
> + "action" events with a "none" action will be sent to both
> source
> + and destination if there is no match. All further checks
> will
> + effectively happen on (source_actions & dest_actions).
> +
> + In addition, compositors may also pick different actions in
> + reaction to key modifiers being pressed, one common ground
> that
> + has been present in major toolkits (and the behavior
> recommended
> + for compositors) is:
> +
> + - If no modifiers are pressed, the first match (in bit
> order)
> + will be used.
> + - Pressing Shift selects "move", if enabled in the mask.
> + - Pressing Control selects "copy", if enabled in the mask.
> +
> + Behavior beyond that is considered implementation-dependent.
> + Compositors may for example bind other modifiers (like
> Alt/Meta)
> + or drags initiated with other buttons than BTN_LEFT to
> specific
> + actions (eg. "ask", or the next match after move/copy).
> + </description>
> + <entry name="none" value="0"/>
> + <entry name="copy" value="1"/>
> + <entry name="move" value="2"/>
> + <entry name="ask" value="4"/>
> + </enum>
> </interface>
>
> <interface name="wl_shell" version="1">
More information about the wayland-devel
mailing list