diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-10 16:34:35 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2011-11-10 16:34:35 +1000 |
commit | 6db80193241c00dfa7b37131576eea7de1a864e8 (patch) | |
tree | 298b5fe7d1fbade7ca72e1bdd294d2ccade35550 | |
parent | 55d88994f09b76cab8883055c60fd72d24efb04f (diff) |
Accept/Reject the grab after 100 events
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | multitouch.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/multitouch.c b/multitouch.c index 35b4a39..53c52de 100644 --- a/multitouch.c +++ b/multitouch.c @@ -52,6 +52,7 @@ struct grabpoint { double startx, starty; /* x/y of TouchBegin */ double x, y; /* last recorded x/y position */ Window grab_window; + int nevents; }; struct multitouch { @@ -449,6 +450,7 @@ static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) grab->startx = event->event_x; grab->starty = event->event_y; grab->grab_window = event->event; + grab->nevents = 0; break; } else if (event->evtype != XI_TouchBegin) { if (grab->state != TSTATE_END && grab->touchid == event->detail) @@ -463,26 +465,27 @@ static void handle_grabbed_event(struct multitouch *mt, XIDeviceEvent *event) grab->x = event->event_x; grab->y = event->event_y; + grab->nevents++; paint_grabs(mt); expose(mt, 0, 0, mt->width, mt->height); - switch (event->evtype) + if (grab->state != TSTATE_END && + (event->evtype == XI_TouchEnd || (grab->nevents > 100 && event->evtype != XI_TouchOwnership))) { - case XI_TouchEnd: - { - int mode = XIAcceptTouch; - if (event->event == mt->whitebar || event->event == mt->whitebar_os) - mode = XIRejectTouch; - grab->state = TSTATE_END; - XIAllowTouchEvents(mt->dpy, event->deviceid, event->detail, - event->event, mode); - } - break; - case XI_TouchUpdate: + int mode = XIAcceptTouch; + const char *modestr = "Accept"; + if (event->event == mt->whitebar || event->event == mt->whitebar_os) + { + mode = XIRejectTouch; + modestr = "Reject"; + } + grab->state = TSTATE_END; + msg("%s touch %d on %#lx.\n", modestr, event->detail, event->event); + XIAllowTouchEvents(mt->dpy, event->deviceid, event->detail, + event->event, mode); + } else if (event->evtype == XI_TouchUpdate) grab->state = TSTATE_UPDATE; - break; - } } static void handle_ownership(struct multitouch *mt, XITouchOwnershipEvent *event) |