summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2011-11-07 16:42:52 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2011-11-07 16:42:52 +1000
commit0a6a38e56e34112240c6f2edb2296f0f07234292 (patch)
tree73280c297fe47da5921b6f5fc509f6b7e071610d
parentd8a03efa330b5d24d7a523704bebe5eab6305510 (diff)
Hook up the whitebar for non-ownership, XIRejectTouch events
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--multitouch.c48
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;