diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-12-07 12:31:26 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-12-07 12:31:26 +1000 |
commit | 37d7bddae0f5e0d1f376e43d5e9d7c748a8a02a7 (patch) | |
tree | 1bbb42f6a21f2d9002d2746bee6fbd60aac1f0f6 | |
parent | 49a4fcaa604a728730a3d593a5c738d07028d12c (diff) |
Split out grab searching into helper functions
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | multitouch.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/multitouch.c b/multitouch.c index edcff1c..b9370ca 100644 --- a/multitouch.c +++ b/multitouch.c @@ -491,29 +491,53 @@ static void paint_grabs(struct multitouch *mt) cairo_restore(mt->cr_grabs); } -static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) +static struct grabpoint* find_unused_grab(struct multitouch *mt) { + int i; struct grabpoint *grab = NULL; + for (i = 0; i < mt->ngrabs; i++) + { + grab = &mt->grabs[i]; + if (grab->state == TSTATE_END) + break; + } + + return grab; +} + +static struct grabpoint* find_grab(struct multitouch *mt, uint32_t touchid) +{ int i; + struct grabpoint *grab = NULL; + for (i = 0; i < mt->ngrabs; i++) { grab = &mt->grabs[i]; - if (event->evtype == XI_TouchBegin && grab->state == TSTATE_END) - { - grab->state = TSTATE_BEGIN; - grab->touchid = event->detail; - grab->startx = event->event_x; - grab->starty = event->event_y; - grab->grab_window = event->event; - grab->nevents = 0; - grab->flags = 0; - break; - } else if (event->evtype != XI_TouchBegin) { - if (grab->state != TSTATE_END && grab->touchid == event->detail) - break; - } + if (grab->state != TSTATE_END && grab->touchid == touchid) + break; } + + return grab; +} + +static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) +{ + struct grabpoint *grab = NULL; + + if (event->evtype == XI_TouchBegin) + { + grab = find_unused_grab(mt); + grab->state = TSTATE_BEGIN; + grab->touchid = event->detail; + grab->startx = event->event_x; + grab->starty = event->event_y; + grab->grab_window = event->event; + grab->nevents = 0; + grab->flags = 0; + } else + grab = find_grab(mt, event->detail); + if (!grab) { error("oops, touchpoint for %d (touchid %d) not found\n", event->evtype, event->detail); |