diff options
Diffstat (limited to 'src/grail-api.c')
| -rw-r--r-- | src/grail-api.c | 57 |
1 files changed, 23 insertions, 34 deletions
diff --git a/src/grail-api.c b/src/grail-api.c index 9503889..9490659 100644 --- a/src/grail-api.c +++ b/src/grail-api.c | |||
| @@ -55,42 +55,34 @@ static void tp_event(struct touch_dev *dev, | |||
| 55 | evbuf_put(&x->evbuf, ev); | 55 | evbuf_put(&x->evbuf, ev); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | static int handle_abs_events(struct grail *ge, | 58 | static void evput(struct grail_impl *x, struct timeval time, |
| 59 | const struct input_event *syn, | 59 | unsigned type, unsigned code, int value) |
| 60 | int pointer) | ||
| 61 | { | 60 | { |
| 61 | struct input_event ev = { time, type, code, value }; | ||
| 62 | evbuf_put(&x->evbuf, &ev); | ||
| 63 | } | ||
| 64 | |||
| 65 | static void handle_abs_events(struct grail *ge, const struct input_event *syn) | ||
| 66 | { | ||
| 67 | static const int fm_mask = 0x03; | ||
| 62 | struct grail_impl *impl = ge->impl; | 68 | struct grail_impl *impl = ge->impl; |
| 63 | struct input_event ev = *syn; | 69 | struct gesture_inserter *gin = ge->gin; |
| 64 | int nevent = 0; | 70 | struct gesture_recognizer *gru = ge->gru; |
| 71 | struct move_model *move = &gru->move; | ||
| 72 | struct tapping_model *tap = &gru->tapping; | ||
| 73 | int used_move = grail_mask_count(gin->types, sizeof(gin->types)); | ||
| 74 | int ismove = move->single && (move->active & fm_mask) && !used_move; | ||
| 75 | int ishold = move->single && tap->active && !used_move; | ||
| 76 | int pointer = ismove || ishold; | ||
| 77 | |||
| 65 | if (pointer != impl->pointer_status) { | 78 | if (pointer != impl->pointer_status) { |
| 66 | ev.type = EV_KEY; | 79 | evput(impl, syn->time, EV_KEY, BTN_TOUCH, pointer); |
| 67 | ev.code = BTN_TOUCH; | ||
| 68 | ev.value = pointer; | ||
| 69 | ge->event(ge, &ev); | ||
| 70 | impl->pointer_status = pointer; | 80 | impl->pointer_status = pointer; |
| 71 | nevent++; | ||
| 72 | } | 81 | } |
| 73 | if (pointer) { | 82 | if (pointer) { |
| 74 | ev.type = EV_ABS; | 83 | evput(impl, syn->time, EV_ABS, ABS_X, impl->pointer_x); |
| 75 | ev.code = ABS_X; | 84 | evput(impl, syn->time, EV_ABS, ABS_Y, impl->pointer_y); |
| 76 | ev.value = impl->pointer_x; | ||
| 77 | ge->event(ge, &ev); | ||
| 78 | nevent++; | ||
| 79 | ev.type = EV_ABS; | ||
| 80 | ev.code = ABS_Y; | ||
| 81 | ev.value = impl->pointer_y; | ||
| 82 | ge->event(ge, &ev); | ||
| 83 | nevent++; | ||
| 84 | } | 85 | } |
| 85 | return nevent; | ||
| 86 | } | ||
| 87 | |||
| 88 | static int pointer_active(const struct grail *ge) | ||
| 89 | { | ||
| 90 | static const int fm_mask = 0x03; | ||
| 91 | const struct move_model *move = &ge->gru->move; | ||
| 92 | const struct tapping_model *tap = &ge->gru->tapping; | ||
| 93 | return move->single && ((move->active & fm_mask) || tap->active); | ||
| 94 | } | 86 | } |
| 95 | 87 | ||
| 96 | static void tp_sync(struct touch_dev *dev, | 88 | static void tp_sync(struct touch_dev *dev, |
| @@ -99,21 +91,18 @@ static void tp_sync(struct touch_dev *dev, | |||
| 99 | struct input_event ev; | 91 | struct input_event ev; |
| 100 | struct grail *ge = dev->priv; | 92 | struct grail *ge = dev->priv; |
| 101 | struct grail_impl *impl = ge->impl; | 93 | struct grail_impl *impl = ge->impl; |
| 102 | struct gesture_inserter *gin = ge->gin; | ||
| 103 | struct touch_frame *frame = &dev->frame; | 94 | struct touch_frame *frame = &dev->frame; |
| 104 | int pointer, used_move, nevent = 0; | 95 | int nevent = 0; |
| 105 | gin_frame_begin(ge, frame); | 96 | gin_frame_begin(ge, frame); |
| 106 | gru_recognize(ge, frame); | 97 | gru_recognize(ge, frame); |
| 107 | gin_frame_end(ge, frame); | 98 | gin_frame_end(ge, frame); |
| 108 | used_move = grail_mask_count(gin->types, sizeof(gin->types)); | ||
| 109 | pointer = pointer_active(ge) && !used_move; | ||
| 110 | 99 | ||
| 111 | if (!ge->event) { | 100 | if (!ge->event) { |
| 112 | evbuf_clear(&impl->evbuf); | 101 | evbuf_clear(&impl->evbuf); |
| 113 | return; | 102 | return; |
| 114 | } | 103 | } |
| 115 | if (!impl->filter_abs) | 104 | if (!impl->filter_abs) |
| 116 | nevent += handle_abs_events(ge, syn, pointer); | 105 | handle_abs_events(ge, syn); |
| 117 | while (!evbuf_empty(&impl->evbuf)) { | 106 | while (!evbuf_empty(&impl->evbuf)) { |
| 118 | evbuf_get(&impl->evbuf, &ev); | 107 | evbuf_get(&impl->evbuf, &ev); |
| 119 | ge->event(ge, &ev); | 108 | ge->event(ge, &ev); |
