summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-12-07 12:31:26 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-12-07 12:31:26 +1000
commit37d7bddae0f5e0d1f376e43d5e9d7c748a8a02a7 (patch)
tree1bbb42f6a21f2d9002d2746bee6fbd60aac1f0f6
parent49a4fcaa604a728730a3d593a5c738d07028d12c (diff)
Split out grab searching into helper functions
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--multitouch.c54
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);