diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-07 12:25:19 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-07 12:25:19 +1000 |
commit | 10d42e084a94b0fe467dc04901de8dc9c455ecfd (patch) | |
tree | 7823e9c356856ebc1f60ab6096dcf01b855195c9 | |
parent | 7b1799e06a0535f0e2e441d2acca220024e6d209 (diff) |
Paint all grabs, not just the current one
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | multitouch.c | 67 |
1 files changed, 47 insertions, 20 deletions
diff --git a/multitouch.c b/multitouch.c index 7234a76..4a3d8e0 100644 --- a/multitouch.c +++ b/multitouch.c @@ -318,10 +318,49 @@ static void paint_touch_end(struct multitouch *mt, XIDeviceEvent *event) } +static void paint_grabs(struct multitouch *mt) +{ + const int radius = 50; + struct grabpoint *grab; + int i; + + /* clear the whole area */ + cairo_save(mt->cr_grabs); + cairo_save(mt->cr_grabs); + cairo_set_operator(mt->cr_grabs, CAIRO_OPERATOR_CLEAR); + cairo_paint(mt->cr_grabs); + cairo_restore(mt->cr_grabs); + + + for (i = 0; i < mt->ngrabs; i++) + { + grab = &mt->grabs[i]; + + if (grab->state == TSTATE_END) + continue; + + /* draw starting circle */ + cairo_set_source_rgba(mt->cr_grabs, 0, 0, 1, 1); + cairo_move_to(mt->cr_grabs, grab->startx + radius, grab->starty); + cairo_arc(mt->cr_grabs, grab->startx, grab->starty, radius, 0, 2 * M_PI); + cairo_stroke(mt->cr_grabs); + + /* draw line to current point */ + cairo_set_source_rgba(mt->cr_grabs, 0, 0, 1, 1); + cairo_move_to(mt->cr_grabs, grab->startx, grab->starty); + cairo_line_to(mt->cr_grabs, grab->x, grab->y); + + msg("%d: %.2f/%.2f %.2f/%.2f\n", i, grab->startx, grab->starty, grab->x, + grab->y); + } + + cairo_stroke(mt->cr_grabs); + cairo_restore(mt->cr_grabs); +} + static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) { struct grabpoint *grab = NULL; - const int radius = 50; int i; for (i = 0; i < mt->ngrabs; i++) @@ -345,29 +384,17 @@ static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) return; } - /* clear the whole area */ - cairo_save(mt->cr_grabs); - cairo_save(mt->cr_grabs); - cairo_set_operator(mt->cr_grabs, CAIRO_OPERATOR_CLEAR); - cairo_paint(mt->cr_grabs); - cairo_restore(mt->cr_grabs); - - /* draw starting circle */ - cairo_set_source_rgba(mt->cr_grabs, 0, 0, 1, 1); - cairo_arc(mt->cr_grabs, grab->startx, grab->starty, radius, 0, 2 * M_PI); - cairo_stroke(mt->cr_grabs); - grab->x = event->event_x; grab->y = event->event_y; - /* draw line to current point */ - cairo_set_source_rgba(mt->cr_grabs, 0, 0, 1, 1); - cairo_move_to(mt->cr_grabs, grab->startx, grab->starty); - cairo_line_to(mt->cr_grabs, grab->x, grab->y); - cairo_stroke(mt->cr_grabs); - cairo_restore(mt->cr_grabs); + paint_grabs(mt); + expose(mt, 0, 0, mt->width, mt->height); - expose(mt, grab->startx, grab->starty, grab->x, grab->y); + switch (event->evtype) + { + case XI_TouchEnd: grab->state = TSTATE_END; break; + case XI_TouchUpdate: grab->state = TSTATE_UPDATE; break; + } } static void paint_event(struct multitouch *mt, XIDeviceEvent *event) |