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.
dev
Kristian Høgsberg 12 years ago
parent 40e44ab18d
commit 5f95557631
  1. 2
      src/compositor.h
  2. 41
      src/data-device.c

@ -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;

@ -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);
} }

Loading…
Cancel
Save