summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-11-07 12:25:19 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-11-07 12:25:19 +1000
commit10d42e084a94b0fe467dc04901de8dc9c455ecfd (patch)
tree7823e9c356856ebc1f60ab6096dcf01b855195c9
parent7b1799e06a0535f0e2e441d2acca220024e6d209 (diff)
Paint all grabs, not just the current one
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--multitouch.c67
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)