weston: release keyboard/touch/pointer objects

This patch adds the missing calls to release when the seat has capabilities
changes. It also fixes a missing release of the touch object and a leak with
old clients.

Signed-off-by: David FORT <contact@hardening-consulting.com>
Reviewed-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
dev
FORT David 9 years ago committed by Derek Foreman
parent d669714d71
commit f7bb9352f7
  1. 20
      clients/window.c

@ -3256,6 +3256,9 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
wl_pointer_add_listener(input->pointer, &pointer_listener, wl_pointer_add_listener(input->pointer, &pointer_listener,
input); input);
} else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) { } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && input->pointer) {
if (input->display->seat_version >= WL_POINTER_RELEASE_SINCE_VERSION)
wl_pointer_release(input->pointer);
else
wl_pointer_destroy(input->pointer); wl_pointer_destroy(input->pointer);
input->pointer = NULL; input->pointer = NULL;
} }
@ -3266,6 +3269,9 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
wl_keyboard_add_listener(input->keyboard, &keyboard_listener, wl_keyboard_add_listener(input->keyboard, &keyboard_listener,
input); input);
} else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) { } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && input->keyboard) {
if (input->display->seat_version >= WL_KEYBOARD_RELEASE_SINCE_VERSION)
wl_keyboard_release(input->keyboard);
else
wl_keyboard_destroy(input->keyboard); wl_keyboard_destroy(input->keyboard);
input->keyboard = NULL; input->keyboard = NULL;
} }
@ -3275,6 +3281,9 @@ seat_handle_capabilities(void *data, struct wl_seat *seat,
wl_touch_set_user_data(input->touch, input); wl_touch_set_user_data(input->touch, input);
wl_touch_add_listener(input->touch, &touch_listener, input); wl_touch_add_listener(input->touch, &touch_listener, input);
} else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && input->touch) { } else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && input->touch) {
if (input->display->seat_version >= WL_TOUCH_RELEASE_SINCE_VERSION)
wl_touch_release(input->touch);
else
wl_touch_destroy(input->touch); wl_touch_destroy(input->touch);
input->touch = NULL; input->touch = NULL;
} }
@ -5269,11 +5278,20 @@ input_destroy(struct input *input)
else else
wl_data_device_destroy(input->data_device); wl_data_device_destroy(input->data_device);
} }
if (input->display->seat_version >= 3) { if (input->display->seat_version >= WL_POINTER_RELEASE_SINCE_VERSION) {
if (input->touch)
wl_touch_release(input->touch);
if (input->pointer) if (input->pointer)
wl_pointer_release(input->pointer); wl_pointer_release(input->pointer);
if (input->keyboard) if (input->keyboard)
wl_keyboard_release(input->keyboard); wl_keyboard_release(input->keyboard);
} else {
if (input->touch)
wl_touch_destroy(input->touch);
if (input->pointer)
wl_pointer_destroy(input->pointer);
if (input->keyboard)
wl_keyboard_destroy(input->keyboard);
} }
fini_xkb(input); fini_xkb(input);

Loading…
Cancel
Save