data-device: Setup and release drag surface and beginning and end of drag

Previously we just got the drag_icon signal and had to figure out what
changed.  Now we can directly setup or release the drag icon when the
drag starts and stops.
This commit is contained in:
Kristian Høgsberg 2013-05-07 21:06:38 -04:00
parent 40e44ab18d
commit 5f95557631
2 changed files with 4 additions and 39 deletions

View File

@ -472,10 +472,8 @@ struct weston_seat {
struct wl_resource *drag_focus_resource; struct wl_resource *drag_focus_resource;
struct wl_listener drag_focus_listener; struct wl_listener drag_focus_listener;
struct weston_pointer_grab drag_grab; struct weston_pointer_grab drag_grab;
struct wl_surface *next_drag_surface;
struct weston_surface *drag_surface; struct weston_surface *drag_surface;
struct wl_listener drag_surface_destroy_listener; struct wl_listener drag_surface_destroy_listener;
struct wl_listener drag_icon_listener;
uint32_t num_tp; uint32_t num_tp;

View File

@ -231,30 +231,9 @@ device_map_drag_surface(struct weston_seat *seat)
void void
weston_seat_update_drag_surface(struct weston_seat *seat, int dx, int dy) weston_seat_update_drag_surface(struct weston_seat *seat, int dx, int dy)
{ {
int surface_changed = 0; if (!seat->drag_surface)
if (!seat->drag_surface && !seat->next_drag_surface)
return; return;
if (seat->drag_surface && seat->next_drag_surface &&
(&seat->drag_surface->surface.resource !=
&seat->next_drag_surface->resource))
/* between calls to this funcion we got a new drag_surface */
surface_changed = 1;
if (!seat->next_drag_surface || surface_changed) {
device_release_drag_surface(seat);
if (!surface_changed)
return;
}
if (!seat->drag_surface || surface_changed) {
struct weston_surface *surface =
(struct weston_surface *) seat->next_drag_surface;
if (!device_setup_new_drag_surface(seat, surface))
return;
}
/* the client may not have attached a buffer to the drag surface /* the client may not have attached a buffer to the drag surface
* when we setup it up, so check if map is needed on every update */ * when we setup it up, so check if map is needed on every update */
device_map_drag_surface(seat); device_map_drag_surface(seat);
@ -348,9 +327,8 @@ static void
data_device_end_drag_grab(struct weston_seat *seat) data_device_end_drag_grab(struct weston_seat *seat)
{ {
if (seat->drag_surface) { if (seat->drag_surface) {
seat->next_drag_surface = NULL; device_release_drag_surface(seat);
weston_seat_update_drag_surface(seat, 0, 0); weston_seat_update_drag_surface(seat, 0, 0);
wl_list_remove(&seat->drag_icon_listener.link);
} }
drag_grab_focus(&seat->drag_grab, NULL, drag_grab_focus(&seat->drag_grab, NULL,
@ -398,15 +376,6 @@ destroy_data_device_source(struct wl_listener *listener, void *data)
data_device_end_drag_grab(seat); data_device_end_drag_grab(seat);
} }
static void
destroy_data_device_icon(struct wl_listener *listener, void *data)
{
struct weston_seat *seat = container_of(listener, struct weston_seat,
drag_icon_listener);
seat->next_drag_surface = NULL;
}
static void static void
handle_drag_surface_destroy(struct wl_listener *listener, void *data) handle_drag_surface_destroy(struct wl_listener *listener, void *data)
{ {
@ -447,10 +416,8 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
} }
if (icon_resource) { if (icon_resource) {
seat->next_drag_surface = icon_resource->data; if (!device_setup_new_drag_surface(seat, icon_resource->data))
seat->drag_icon_listener.notify = destroy_data_device_icon; return;
wl_signal_add(&icon_resource->destroy_signal,
&seat->drag_icon_listener);
weston_seat_update_drag_surface(seat, 0, 0); weston_seat_update_drag_surface(seat, 0, 0);
} }