tests: check for NULL surface in keyboard and pointer handlers
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Thu, 21 Apr 2016 13:47:20 +0000 (16:47 +0300)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Fri, 22 Apr 2016 07:45:09 +0000 (10:45 +0300)
When a test destroys a wl_surface, it is still possible to get events
referring to the destroyed surface. The surface in such cases will be
NULL.

Handle NULL surface gracefully in keyboard and pointer enter/leave
handlers. Touch-down handler is already NULL-safe.

This fixes a SEGV in a test I am writing for wp_viewport.

Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
tests/weston-test-client-helper.c

index 3f7ff2b..cc2544e 100644 (file)
@@ -132,7 +132,11 @@ pointer_handle_enter(void *data, struct wl_pointer *wl_pointer,
 {
        struct pointer *pointer = data;
 
-       pointer->focus = wl_surface_get_user_data(wl_surface);
+       if (wl_surface)
+               pointer->focus = wl_surface_get_user_data(wl_surface);
+       else
+               pointer->focus = NULL;
+
        pointer->x = wl_fixed_to_int(x);
        pointer->y = wl_fixed_to_int(y);
 
@@ -149,7 +153,7 @@ pointer_handle_leave(void *data, struct wl_pointer *wl_pointer,
        pointer->focus = NULL;
 
        fprintf(stderr, "test-client: got pointer leave, surface %p\n",
-               wl_surface_get_user_data(wl_surface));
+               wl_surface ? wl_surface_get_user_data(wl_surface) : NULL);
 }
 
 static void
@@ -243,7 +247,10 @@ keyboard_handle_enter(void *data, struct wl_keyboard *wl_keyboard,
 {
        struct keyboard *keyboard = data;
 
-       keyboard->focus = wl_surface_get_user_data(wl_surface);
+       if (wl_surface)
+               keyboard->focus = wl_surface_get_user_data(wl_surface);
+       else
+               keyboard->focus = NULL;
 
        fprintf(stderr, "test-client: got keyboard enter, surface %p\n",
                keyboard->focus);
@@ -258,7 +265,7 @@ keyboard_handle_leave(void *data, struct wl_keyboard *wl_keyboard,
        keyboard->focus = NULL;
 
        fprintf(stderr, "test-client: got keyboard leave, surface %p\n",
-               wl_surface_get_user_data(wl_surface));
+               wl_surface ? wl_surface_get_user_data(wl_surface) : NULL);
 }
 
 static void