diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-07 16:42:52 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-07 16:42:52 +1000 |
commit | 0a6a38e56e34112240c6f2edb2296f0f07234292 (patch) | |
tree | 73280c297fe47da5921b6f5fc509f6b7e071610d | |
parent | d8a03efa330b5d24d7a523704bebe5eab6305510 (diff) |
Hook up the whitebar for non-ownership, XIRejectTouch events
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | multitouch.c | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/multitouch.c b/multitouch.c index b199d2d..360f241 100644 --- a/multitouch.c +++ b/multitouch.c @@ -24,8 +24,8 @@ static void usage(void) { printf("Usage:\n"); printf(" Grey window: normal touch surface\n"); - printf(" Black bar left: grabs the touchpoint, no ownership\n"); - printf(" White bar left: grabs the touchpoint, with ownership\n"); + printf(" Black bar left: grabs the touchpoint, no ownership, accepts\n"); + printf(" White bar left: grabs the touchpoint, no ownership, rejects\n"); } enum TouchState { @@ -154,7 +154,6 @@ static void init_windows(struct multitouch *mt) error("Failed to establish passive grab on blackbar\n"); /* grab touch events with ownership on whitebar */ - XISetMask(mask, XI_TouchOwnership); if (XIGrabTouchBegin(mt->dpy, XIAllMasterDevices, mt->whitebar, XINoOwnerEvents, &evmask, 1, &modifiers) != 0) error("Failed to establish passive grab on blackbar\n"); @@ -226,6 +225,7 @@ static void teardown(struct multitouch *mt) static void print_event(struct multitouch *mt, XIDeviceEvent* event) { const char *type; + const char *windowname; switch(event->evtype) { case XI_TouchBegin: type = "TouchBegin"; break; @@ -235,7 +235,15 @@ static void print_event(struct multitouch *mt, XIDeviceEvent* event) msg("Event: %s (%d)\n", type, event->deviceid); msg("\t%.2f/%.2f (%.2f/%.2f)\n", event->event_x, event->event_y, event->root_x, event->root_y); msg("\ttouchid: %d\n", event->detail); - msg("\ton %s\n", event->event == mt->win ? "window" : "blackbar"); + + if (event->event == mt->blackbar) + windowname = "blackbar"; + else if (event->event == mt->whitebar) + windowname = "whitebar"; + else + windowname = "window"; + + msg("\ton %s\n", windowname); if (event->flags & XITouchPendingEnd) msg("\tflags: pending end\n"); } @@ -320,11 +328,13 @@ static void paint_touch_end(struct multitouch *mt, XIDeviceEvent *event) } -static void paint_grabs(struct multitouch *mt) +static void paint_grabs(struct multitouch *mt, Window which) { const int radius = 50; struct grabpoint *grab; int i; + double r, g, b; + int offset; /* clear the whole area */ cairo_save(mt->cr_grabs); @@ -333,6 +343,15 @@ static void paint_grabs(struct multitouch *mt) cairo_paint(mt->cr_grabs); cairo_restore(mt->cr_grabs); + if (which == mt->blackbar) + { + r = 0; g = 0; b = 1; + offset = 0; + } else + { + r = 1; g = 0; b = 0; + offset = mt->height/2; + } for (i = 0; i < mt->ngrabs; i++) { @@ -342,15 +361,15 @@ static void paint_grabs(struct multitouch *mt) 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_set_source_rgba(mt->cr_grabs, r, g, b, 1); + cairo_move_to(mt->cr_grabs, grab->startx + radius, offset + grab->starty); + cairo_arc(mt->cr_grabs, grab->startx, offset + 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); + cairo_set_source_rgba(mt->cr_grabs, r, g, b, 1); + cairo_move_to(mt->cr_grabs, grab->startx, offset + grab->starty); + cairo_line_to(mt->cr_grabs, grab->x, offset + grab->y); msg("%d: %.2f/%.2f %.2f/%.2f\n", i, grab->startx, grab->starty, grab->x, grab->y); @@ -389,14 +408,15 @@ static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) grab->x = event->event_x; grab->y = event->event_y; - paint_grabs(mt); + paint_grabs(mt, event->event); expose(mt, 0, 0, mt->width, mt->height); switch (event->evtype) { case XI_TouchEnd: grab->state = TSTATE_END; - XIAllowTouchEvents(mt->dpy, event->deviceid, event->detail, event->event, XIAcceptTouch); + XIAllowTouchEvents(mt->dpy, event->deviceid, event->detail, event->event, + event->event == mt->blackbar ? XIAcceptTouch : XIRejectTouch); break; case XI_TouchUpdate: grab->state = TSTATE_UPDATE; @@ -406,7 +426,7 @@ static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) static void paint_event(struct multitouch *mt, XIDeviceEvent *event) { - if (event->event == mt->blackbar) + if (event->event == mt->blackbar || event->event == mt->whitebar) { handle_grabbed_event(mt, event); return; |