[PATCH] protocol: Add DnD actions

Carlos Garnacho carlosg at gnome.org
Wed Apr 8 07:08:27 PDT 2015


Hey Bryce,

Thanks for the review! I'm attaching new patches fixing the issues 
you/Marek have seen, the doc blurbs have been reworded in a few places.

This v2 also adds a wl_data_offer.source_actions event. This allows 
drag destinations to adapt their action mask accordingly, instead just 
being practically able to set a static one, things get a bit more akin 
to XDnD in this regard.

With v2, I've been able to make DnD on par with X in GTK+ (feature-
wise, that is):
https://git.gnome.org/browse/gtk+/log/?h=wip/wayland-dnd-actions
https://git.gnome.org/browse/mutter/log/?h=wip/dnd-actions

Cheers,
  Carlos

On miƩ, 2015-03-18 at 16:56 -0700, Bryce Harrington wrote:
> 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
> _______________________________________________
> 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