From: Rob Bradford <[email protected]>

v2: Walk the array manually as wl_array_for_each is bytewise we're
storing pointers that we need to free.
---
 src/input.c | 27 ++++++++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/input.c b/src/input.c
index 25f2a3e..08b138c 100644
--- a/src/input.c
+++ b/src/input.c
@@ -366,10 +366,17 @@ weston_pointer_create(void)
 WL_EXPORT void
 weston_pointer_destroy(struct weston_pointer *pointer)
 {
+       void **p;
+
        if (pointer->sprite)
                pointer_unmap_sprite(pointer);
 
-       /* XXX: What about pointer->resource_list? */
+       for (p = pointer->resources.data;
+            p < (void **)(pointer->resources.data + pointer->resources.size);
+            p+= sizeof(struct wl_list *))
+               free(*p);
+       wl_array_release(&pointer->resources);
+
        if (!wl_list_empty(pointer->focus_resource_list))
                wl_list_remove(&pointer->focus_listener.link);
        free(pointer);
@@ -400,7 +407,14 @@ weston_keyboard_create(void)
 WL_EXPORT void
 weston_keyboard_destroy(struct weston_keyboard *keyboard)
 {
-       /* XXX: What about keyboard->resource_list? */
+       void **p;
+
+       for (p = keyboard->resources.data;
+            p < (void **)(keyboard->resources.data + keyboard->resources.size);
+            p+= sizeof(struct wl_list *))
+               free(*p);
+       wl_array_release(&keyboard->resources);
+
        if (!wl_list_empty(keyboard->focus_resource_list))
                wl_list_remove(&keyboard->focus_listener.link);
        wl_array_release(&keyboard->keys);
@@ -431,7 +445,14 @@ weston_touch_create(void)
 WL_EXPORT void
 weston_touch_destroy(struct weston_touch *touch)
 {
-       /* XXX: What about touch->resource_list? */
+       void **p;
+
+       for (p = touch->resources.data;
+            p < (void **)(touch->resources.data + touch->resources.size);
+            p+= sizeof(struct wl_list *))
+               free(*p);
+       wl_array_release(&touch->resources);
+
        if (!wl_list_empty(touch->focus_resource_list))
                wl_list_remove(&touch->focus_listener.link);
        free(touch);
-- 
1.8.3.1

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to