diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/grail-inserter.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/grail-inserter.c b/src/grail-inserter.c index 5225cb8..fc9076a 100644 --- a/src/grail-inserter.c +++ b/src/grail-inserter.c | |||
| @@ -38,6 +38,18 @@ static int find_gslot(const struct gesture_inserter *gin, int gid) | |||
| 38 | return -1; | 38 | return -1; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | static int mask_overlap(const grail_mask_t *a, const grail_mask_t *b, | ||
| 42 | int bytes) | ||
| 43 | { | ||
| 44 | int i; | ||
| 45 | |||
| 46 | for (i = 0; i < bytes; i++) | ||
| 47 | if (a[i] & b[i]) | ||
| 48 | return 1; | ||
| 49 | |||
| 50 | return 0; | ||
| 51 | } | ||
| 52 | |||
| 41 | // todo: spanning tree for multi-user case | 53 | // todo: spanning tree for multi-user case |
| 42 | static void setup_new_gestures(struct grail *ge, | 54 | static void setup_new_gestures(struct grail *ge, |
| 43 | const struct utouch_frame *frame) | 55 | const struct utouch_frame *frame) |
| @@ -119,8 +131,10 @@ void gin_frame_begin(struct grail *ge, const struct utouch_frame *frame) | |||
| 119 | void gin_frame_end(struct grail *ge, const struct utouch_frame *frame) | 131 | void gin_frame_end(struct grail *ge, const struct utouch_frame *frame) |
| 120 | { | 132 | { |
| 121 | struct gesture_inserter *gin = ge->gin; | 133 | struct gesture_inserter *gin = ge->gin; |
| 134 | grail_mask_t keep[DIM_TOUCH_BYTES]; | ||
| 122 | int i, hold[2] = { 0, 0 }, discard[2] = { 0, 0 }; | 135 | int i, hold[2] = { 0, 0 }, discard[2] = { 0, 0 }; |
| 123 | 136 | ||
| 137 | memset(keep, 0, sizeof(keep)); | ||
| 124 | setup_new_gestures(ge, frame); | 138 | setup_new_gestures(ge, frame); |
| 125 | 139 | ||
| 126 | grail_mask_foreach(i, gin->used, sizeof(gin->used)) { | 140 | grail_mask_foreach(i, gin->used, sizeof(gin->used)) { |
| @@ -143,8 +157,16 @@ void gin_frame_end(struct grail *ge, const struct utouch_frame *frame) | |||
| 143 | 157 | ||
| 144 | grail_mask_foreach(i, gin->used, sizeof(gin->used)) { | 158 | grail_mask_foreach(i, gin->used, sizeof(gin->used)) { |
| 145 | struct slot_state *s = &gin->state[i]; | 159 | struct slot_state *s = &gin->state[i]; |
| 160 | if (s->slice == 1) | ||
| 161 | grail_mask_set_mask(keep, s->span, sizeof(keep)); | ||
| 162 | } | ||
| 163 | |||
| 164 | grail_mask_foreach(i, gin->used, sizeof(gin->used)) { | ||
| 165 | struct slot_state *s = &gin->state[i]; | ||
| 146 | if (!s->timeout) | 166 | if (!s->timeout) |
| 147 | continue; | 167 | continue; |
| 168 | if (mask_overlap(keep, s->span, sizeof(keep))) | ||
| 169 | continue; | ||
| 148 | gin_gid_discard(ge, s->id); | 170 | gin_gid_discard(ge, s->id); |
| 149 | } | 171 | } |
| 150 | 172 | ||
