We should use wl_*_release when available instead of destroy, and we
should update weston's internal input tracking with weston_seat_releases

Signed-off-by: Derek Foreman <der...@osg.samsung.com>
---
 src/compositor-wayland.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index dbbc1ad..b25f4ea 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -72,6 +72,7 @@ struct wayland_backend {
 
        int use_pixman;
        int sprawl_across_outputs;
+       int seat_version;
 
        struct theme *theme;
        cairo_device_t *frame_device;
@@ -1620,6 +1621,7 @@ input_handle_capabilities(void *data, struct wl_seat 
*seat,
                          enum wl_seat_capability caps)
 {
        struct wayland_input *input = data;
+       struct wayland_backend *backend = input->backend;
 
        if ((caps & WL_SEAT_CAPABILITY_POINTER) && !input->parent.pointer) {
                input->parent.pointer = wl_seat_get_pointer(seat);
@@ -1628,8 +1630,12 @@ input_handle_capabilities(void *data, struct wl_seat 
*seat,
                                        &pointer_listener, input);
                weston_seat_init_pointer(&input->base);
        } else if (!(caps & WL_SEAT_CAPABILITY_POINTER) && 
input->parent.pointer) {
-               wl_pointer_destroy(input->parent.pointer);
+               if (backend->seat_version >= WL_POINTER_RELEASE_SINCE_VERSION)
+                       wl_pointer_release(input->parent.pointer);
+               else
+                       wl_pointer_destroy(input->parent.pointer);
                input->parent.pointer = NULL;
+               weston_seat_release_pointer(&input->base);
        }
 
        if ((caps & WL_SEAT_CAPABILITY_KEYBOARD) && !input->parent.keyboard) {
@@ -1638,8 +1644,12 @@ input_handle_capabilities(void *data, struct wl_seat 
*seat,
                wl_keyboard_add_listener(input->parent.keyboard,
                                         &keyboard_listener, input);
        } else if (!(caps & WL_SEAT_CAPABILITY_KEYBOARD) && 
input->parent.keyboard) {
-               wl_keyboard_destroy(input->parent.keyboard);
+               if (backend->seat_version >= WL_KEYBOARD_RELEASE_SINCE_VERSION)
+                       wl_keyboard_release(input->parent.keyboard);
+               else
+                       wl_keyboard_destroy(input->parent.keyboard);
                input->parent.keyboard = NULL;
+               weston_seat_release_keyboard(&input->base);
        }
 }
 
@@ -1823,6 +1833,7 @@ registry_handle_global(void *data, struct wl_registry 
*registry, uint32_t name,
                                         &_wl_fullscreen_shell_interface, 1);
        } else if (strcmp(interface, "wl_seat") == 0) {
                display_add_seat(b, name, version);
+               b->seat_version = version;
        } else if (strcmp(interface, "wl_output") == 0) {
                wayland_backend_register_output(b, name);
        } else if (strcmp(interface, "wl_shm") == 0) {
-- 
2.5.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to