On Sat, Oct 31, 2015 at 12:22 AM, Michael Catanzaro <[email protected]> wrote: > 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.
Yeah, you're right It doesn't make too much of an example... I changed it locally to make it control the drag icon surface together with data_source.target, so you need mime_type != NULL && action != 0 in order to get the opaque icon, that's as realistic as it can get given the dnd client workings I guess... > > Reviewed-by: Michael Catanzaro <[email protected]> Thanks! Carlos _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
