[PATCH weston v3] data-device: Implement DnD actions

Michael Catanzaro mcatanzaro at igalia.com
Fri Oct 30 16:22:45 PDT 2015


On Fri, 2015-10-30 at 22:06 +0100, Carlos Garnacho wrote:
> --- a/clients/dnd.c
> +++ b/clients/dnd.c
> @@ -72,6 +72,7 @@ struct dnd_drag {
>  	struct item *item;
>  	int x_offset, y_offset;
>  	int width, height;
> +	uint32_t dnd_action;
>  	const char *mime_type;
>  
>  	struct wl_surface *drag_surface;
> @@ -360,12 +361,21 @@ data_source_drag_finished(void *data, struct
> wl_data_source *source)
>  	destroy_dnd_drag(dnd_drag);
>  }
>  
> +static void
> +data_source_action(void *data, struct wl_data_source *source,
> uint32_t dnd_action)
> +{
> +	struct dnd_drag *dnd_drag = data;
> +
> +	dnd_drag->dnd_action = dnd_action;
> +}
> +
>  static const struct wl_data_source_listener data_source_listener = {
>  	data_source_target,
>  	data_source_send,
>  	data_source_cancelled,
>  	data_source_drop_performed,
>  	data_source_drag_finished,
> +	data_source_action,
>  };
>  
>  static cairo_surface_t *
> @@ -461,6 +471,8 @@ create_drag_source(struct dnd *dnd,
>  					  window_get_wl_surface(dnd
> ->window),
>  					  dnd_drag->drag_surface,
>  					  serial);
> +		wl_data_source_set_actions(dnd_drag->data_source,
> +                                          
>  WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE);
>  
>  		dnd_drag->opaque =
>  			create_drag_icon(dnd_drag, item, x, y, 1);
> diff --git a/clients/window.c b/clients/window.c
> index 24aa517..146d4a7 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -3362,6 +3362,8 @@ struct data_offer {
>  	int fd;
>  	data_func_t func;
>  	int32_t x, y;
> +	uint32_t dnd_action;
> +	uint32_t source_actions;
>  	void *user_data;
>  };
>  
> @@ -3375,8 +3377,26 @@ data_offer_offer(void *data, struct
> wl_data_offer *wl_data_offer, const char *ty
>  	*p = strdup(type);
>  }
>  
> +static void
> +data_offer_source_actions(void *data, struct wl_data_offer
> *wl_data_offer, uint32_t source_actions)
> +{
> +	struct data_offer *offer = data;
> +
> +	offer->source_actions = source_actions;
> +}
> +
> +static void
> +data_offer_action(void *data, struct wl_data_offer *wl_data_offer,
> uint32_t dnd_action)
> +{
> +	struct data_offer *offer = data;
> +
> +	offer->dnd_action = dnd_action;
> +}
> +
>  static const struct wl_data_offer_listener data_offer_listener = {
>  	data_offer_offer,
> +	data_offer_source_actions,
> +	data_offer_action
>  };
>  
>  static void
> @@ -3440,6 +3460,11 @@ data_device_enter(void *data, struct
> wl_data_device *data_device,
>  		*p = NULL;
>  
>  		types_data = input->drag_offer->types.data;
> +		wl_data_offer_set_actions(offer,
> +                                         
>  WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY |
> +                                         
>  WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE,
> +                                         
>  WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY);
> +
>  	} else {
>  		input->drag_offer = NULL;
>  		types_data = NULL;

Is it normal to add unused variables in the example clients
(dnd_drag.source_action, data_offer.dnd_action,
data_offer.source_actions)? I guess there is some value in terms of
serving as an example -- is that why you've done this? -- but it seems
a bit silly to me; I would have left the implementations of those
functions empty.

Reviewed-by: Michael Catanzaro <mcatanzaro at igalia.com>


More information about the wayland-devel mailing list