From a2bb7919de809f4688c746827537f0fc0573013d Mon Sep 17 00:00:00 2001 From: Michael Fu Date: Tue, 23 Jul 2013 15:51:06 +0800 Subject: [PATCH] Reset touch focus in unmap Otherwise, there will be race condition of visiting invalid surface data. --- src/compositor.c | 2 ++ src/compositor.h | 3 +++ src/input.c | 8 ++++---- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/compositor.c b/src/compositor.c index ddb53626..e9ba0fd9 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -988,6 +988,8 @@ weston_surface_unmap(struct weston_surface *surface) NULL, wl_fixed_from_int(0), wl_fixed_from_int(0)); + if (seat->touch && seat->touch->focus == surface) + weston_touch_set_focus(seat, NULL); } weston_surface_schedule_repaint(surface); diff --git a/src/compositor.h b/src/compositor.h index 0fca43df..57b206e2 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -371,6 +371,9 @@ weston_touch_create(void); void weston_touch_destroy(struct weston_touch *touch); void +weston_touch_set_focus(struct weston_seat *seat, + struct weston_surface *surface); +void weston_touch_start_grab(struct weston_touch *device, struct weston_touch_grab *grab); void diff --git a/src/input.c b/src/input.c index 1887e7ff..704ec0d8 100644 --- a/src/input.c +++ b/src/input.c @@ -983,8 +983,8 @@ notify_keyboard_focus_out(struct weston_seat *seat) weston_keyboard_end_grab(keyboard); } -static void -touch_set_focus(struct weston_seat *seat, struct weston_surface *surface) +WL_EXPORT void +weston_touch_set_focus(struct weston_seat *seat, struct weston_surface *surface) { struct wl_resource *resource; @@ -1045,7 +1045,7 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id, * until all touch points are up again. */ if (seat->num_tp == 1) { es = weston_compositor_pick_surface(ec, x, y, &sx, &sy); - touch_set_focus(seat, es); + weston_touch_set_focus(seat, es); } else if (touch->focus) { es = (struct weston_surface *) touch->focus; weston_surface_from_global_fixed(es, x, y, &sx, &sy); @@ -1074,7 +1074,7 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id, grab->interface->up(grab, time, touch_id); if (seat->num_tp == 0) - touch_set_focus(seat, NULL); + weston_touch_set_focus(seat, NULL); break; } }