static void
weston_pointer_client_destroy(struct weston_pointer_client *pointer_client)
{
+ struct wl_resource *resource;
+
+ wl_resource_for_each(resource, &pointer_client->pointer_resources) {
+ wl_resource_set_user_data(resource, NULL);
+ }
+
+ wl_resource_for_each(resource,
+ &pointer_client->relative_pointer_resources) {
+ wl_resource_set_user_data(resource, NULL);
+ }
+
+ wl_list_remove(&pointer_client->pointer_resources);
+ wl_list_remove(&pointer_client->relative_pointer_resources);
free(pointer_client);
}
struct wl_client *client = wl_resource_get_client(resource);
struct weston_pointer_client *pointer_client;
- pointer_client = weston_pointer_get_pointer_client(pointer, client);
- assert(pointer_client);
-
wl_list_remove(wl_resource_get_link(resource));
- weston_pointer_cleanup_pointer_client(pointer, pointer_client);
+
+ if (pointer) {
+ pointer_client = weston_pointer_get_pointer_client(pointer,
+ client);
+ assert(pointer_client);
+ weston_pointer_cleanup_pointer_client(pointer, pointer_client);
+ }
}
static void unbind_resource(struct wl_resource *resource)
WL_EXPORT void
weston_pointer_destroy(struct weston_pointer *pointer)
{
+ struct weston_pointer_client *pointer_client, *tmp;
+
wl_signal_emit(&pointer->destroy_signal, pointer);
if (pointer->sprite)
pointer_unmap_sprite(pointer);
- /* XXX: What about pointer->resource_list? */
+ wl_list_for_each_safe(pointer_client, tmp, &pointer->pointer_clients,
+ link) {
+ wl_list_remove(&pointer_client->link);
+ weston_pointer_client_destroy(pointer_client);
+ }
wl_list_remove(&pointer->focus_resource_listener.link);
wl_list_remove(&pointer->focus_view_listener.link);
struct weston_pointer *pointer = wl_resource_get_user_data(resource);
struct weston_surface *surface = NULL;
+ if (!pointer)
+ return;
+
if (surface_resource)
surface = wl_resource_get_user_data(surface_resource);
struct weston_seat *seat = output->zoom.seat;
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
+ if (!pointer)
+ return;
+
assert(output->zoom.active);
output->zoom.current.x = wl_fixed_to_double(pointer->x);
{
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
- if (output->zoom.active)
+ if (!pointer || output->zoom.active)
return;
output->zoom.active = true;