diff --git a/src/data-device.c b/src/data-device.c index f522eb51..93c923c9 100644 --- a/src/data-device.c +++ b/src/data-device.c @@ -202,42 +202,6 @@ drag_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy, int32_ weston_surface_configure(es, fx, fy, width, height); } -static int -device_setup_new_drag_surface(struct weston_drag *drag, - struct weston_surface *icon) -{ - if (icon->configure) { - wl_resource_post_error(&icon->resource, - WL_DISPLAY_ERROR_INVALID_OBJECT, - "surface->configure already set"); - return 0; - } - - drag->icon = icon; - drag->dx = 0; - drag->dy = 0; - - icon->configure = drag_surface_configure; - icon->configure_private = drag; - - wl_signal_add(&icon->resource.destroy_signal, - &drag->icon_destroy_listener); - - return 1; -} - -static void -device_release_drag_surface(struct weston_drag *drag) -{ - if (weston_surface_is_mapped(drag->icon)) - weston_surface_unmap(drag->icon); - - drag->icon->configure = NULL; - empty_region(&drag->icon->pending.input); - wl_list_remove(&drag->icon_destroy_listener.link); - drag->icon = NULL; -} - static void destroy_drag_focus(struct wl_listener *listener, void *data) { @@ -314,8 +278,14 @@ drag_grab_motion(struct weston_pointer_grab *grab, static void data_device_end_drag_grab(struct weston_drag *drag) { - if (drag->icon) - device_release_drag_surface(drag); + if (drag->icon) { + if (weston_surface_is_mapped(drag->icon)) + weston_surface_unmap(drag->icon); + + drag->icon->configure = NULL; + empty_region(&drag->icon->pending.input); + wl_list_remove(&drag->icon_destroy_listener.link); + } drag_grab_focus(&drag->grab, NULL, wl_fixed_from_int(0), wl_fixed_from_int(0)); @@ -379,12 +349,22 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource, { struct weston_seat *seat = resource->data; struct weston_drag *drag = resource->data; + struct weston_surface *icon = NULL; /* FIXME: Check that client has implicit grab on the origin * surface that matches the given time. */ /* FIXME: Check that the data source type array isn't empty. */ + if (icon_resource) + icon = icon_resource->data; + if (icon && icon->configure) { + wl_resource_post_error(icon_resource, + WL_DISPLAY_ERROR_INVALID_OBJECT, + "surface->configure already set"); + return; + } + drag = malloc(sizeof *drag); if (drag == NULL) { wl_resource_post_no_memory(resource); @@ -394,7 +374,6 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource, memset(drag, 0, sizeof *drag); drag->grab.interface = &drag_grab_interface; drag->client = client; - drag->icon_destroy_listener.notify = handle_drag_icon_destroy; if (source_resource) { drag->data_source = source_resource->data; @@ -403,9 +382,14 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource, &drag->data_source_listener); } - if (icon_resource) { - if (!device_setup_new_drag_surface(drag, icon_resource->data)) - return; + if (icon) { + drag->icon = icon; + drag->icon_destroy_listener.notify = handle_drag_icon_destroy; + wl_signal_add(&icon->resource.destroy_signal, + &drag->icon_destroy_listener); + + icon->configure = drag_surface_configure; + icon->configure_private = drag; } weston_pointer_set_focus(seat->pointer, NULL,