input_device_attach,
};
+static void
+handle_drag_surface_destroy(struct wl_listener *listener,
+ struct wl_resource *resource, uint32_t time)
+{
+ struct weston_input_device *device;
+
+ device = container_of(listener, struct weston_input_device,
+ drag_surface_destroy_listener);
+
+ device->drag_surface = NULL;
+}
+
static void unbind_input_device(struct wl_resource *resource)
{
wl_list_remove(&resource->link);
device->modifier_state = 0;
device->num_tp = 0;
+ device->drag_surface_destroy_listener.func = handle_drag_surface_destroy;
+
wl_list_insert(ec->input_device_list.prev, &device->link);
}
if (!input_device->drag_surface || surface_changed) {
undef_region(&device->drag_surface->input);
+ wl_list_remove(&device->drag_surface_destroy_listener.link);
device->drag_surface = NULL;
if (!surface_changed)
return;
weston_surface_set_position(device->drag_surface,
input_device->x, input_device->y);
+ wl_list_insert(device->drag_surface->surface.resource.destroy_listener_list.prev,
+ &device->drag_surface_destroy_listener.link);
}
if (device->drag_surface->output == NULL &&
struct weston_compositor *compositor;
struct weston_surface *sprite;
struct weston_surface *drag_surface;
+ struct wl_listener drag_surface_destroy_listener;
int32_t hotspot_x, hotspot_y;
struct wl_list link;
uint32_t modifier_state;