diff options
author | Rose Hudson <rose@krx.sh> | 2023-03-17 16:08:56 +0000 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2023-03-24 11:47:08 +0000 |
commit | 12e28c349216deb3798ff509ff9c6044bfe4ab80 (patch) | |
tree | 9d14badbbc0a7ebf062f191097001fb78a683e72 /examples | |
parent | 37f42e2df26ff694801e3b6593462f303c83b0fa (diff) |
examples/touch: support touch cancel events
Diffstat (limited to 'examples')
-rw-r--r-- | examples/touch.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/examples/touch.c b/examples/touch.c index 6d13c80e..7a9002e1 100644 --- a/examples/touch.c +++ b/examples/touch.c @@ -46,6 +46,7 @@ struct touch_state { struct wl_listener down; struct wl_listener up; struct wl_listener motion; + struct wl_listener cancel; struct wl_list link; void *data; }; @@ -130,6 +131,19 @@ static void touch_motion_notify(struct wl_listener *listener, void *data) { } } +static void touch_cancel_notify(struct wl_listener *listener, void *data) { + struct wlr_touch_cancel_event *event = data; + struct touch_state *tstate = wl_container_of(listener, tstate, cancel); + struct sample_state *sample = tstate->sample; + struct touch_point *point, *tmp; + wl_list_for_each_safe(point, tmp, &sample->touch_points, link) { + if (point->touch_id == event->touch_id) { + wl_list_remove(&point->link); + break; + } + } +} + static void touch_destroy_notify(struct wl_listener *listener, void *data) { struct touch_state *tstate = wl_container_of(listener, tstate, destroy); wl_list_remove(&tstate->link); @@ -137,6 +151,7 @@ static void touch_destroy_notify(struct wl_listener *listener, void *data) { wl_list_remove(&tstate->down.link); wl_list_remove(&tstate->up.link); wl_list_remove(&tstate->motion.link); + wl_list_remove(&tstate->cancel.link); free(tstate); } @@ -231,6 +246,8 @@ static void new_input_notify(struct wl_listener *listener, void *data) { wl_signal_add(&tstate->wlr_touch->events.motion, &tstate->motion); tstate->up.notify = touch_up_notify; wl_signal_add(&tstate->wlr_touch->events.up, &tstate->up); + tstate->cancel.notify = touch_cancel_notify; + wl_signal_add(&tstate->wlr_touch->events.cancel, &tstate->cancel); wl_list_insert(&sample->touch, &tstate->link); break; default: |