diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2010-08-10 15:26:22 +0100 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2010-08-10 15:26:22 +0100 |
| commit | 33be41843e18b6a716ff62982e32c843e7a2bb1f (patch) | |
| tree | edd5bb894a42506842661b74f4ce7a8960057f65 /src | |
| parent | a9a0e2c02bdd6e9dfdff523705e7afcb47e82adb (diff) | |
Filter kernel touch and tap buttons
Reinsert BTN_TOUCH depending on the drag gesture
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src')
| -rw-r--r-- | src/grail-api.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/grail-api.c b/src/grail-api.c index fbd0e83..9774e01 100644 --- a/src/grail-api.c +++ b/src/grail-api.c | |||
| @@ -36,6 +36,7 @@ struct grail_impl { | |||
| 36 | struct touch_engine engine; | 36 | struct touch_engine engine; |
| 37 | struct evbuf evbuf; | 37 | struct evbuf evbuf; |
| 38 | int filter_abs; | 38 | int filter_abs; |
| 39 | int hack_status; | ||
| 39 | }; | 40 | }; |
| 40 | 41 | ||
| 41 | static void tp_event(struct touch_engine *engine, | 42 | static void tp_event(struct touch_engine *engine, |
| @@ -46,6 +47,20 @@ static void tp_event(struct touch_engine *engine, | |||
| 46 | evbuf_put(&x->evbuf, ev); | 47 | evbuf_put(&x->evbuf, ev); |
| 47 | } | 48 | } |
| 48 | 49 | ||
| 50 | static int extra_filtered(const struct input_event *ev) | ||
| 51 | { | ||
| 52 | if (ev->type == EV_KEY) { | ||
| 53 | switch (ev->code) { | ||
| 54 | case BTN_TOUCH: | ||
| 55 | case BTN_TOOL_DOUBLETAP: | ||
| 56 | case BTN_TOOL_TRIPLETAP: | ||
| 57 | case BTN_TOOL_QUADTAP: | ||
| 58 | return 1; | ||
| 59 | } | ||
| 60 | } | ||
| 61 | return 0; | ||
| 62 | } | ||
| 63 | |||
| 49 | static void tp_sync(struct touch_engine *engine, | 64 | static void tp_sync(struct touch_engine *engine, |
| 50 | const struct input_event *syn) | 65 | const struct input_event *syn) |
| 51 | { | 66 | { |
| @@ -55,11 +70,12 @@ static void tp_sync(struct touch_engine *engine, | |||
| 55 | struct gesture_recognizer *gru = ge->gru; | 70 | struct gesture_recognizer *gru = ge->gru; |
| 56 | struct touch_frame *frame = &engine->frame; | 71 | struct touch_frame *frame = &engine->frame; |
| 57 | grail_mask_t filtered[DIM_EV_TYPE_BYTES]; | 72 | grail_mask_t filtered[DIM_EV_TYPE_BYTES]; |
| 58 | int dofilt, nevent = 0; | 73 | int dofilt, hack, nevent = 0; |
| 59 | gin_frame_begin(ge, frame); | 74 | gin_frame_begin(ge, frame); |
| 60 | gru_recognize(ge, frame); | 75 | gru_recognize(ge, frame); |
| 61 | gin_frame_end(ge, filtered, sizeof(filtered), frame); | 76 | gin_frame_end(ge, filtered, sizeof(filtered), frame); |
| 62 | dofilt = gru->move.multi || gru->move.single && x->filter_abs; | 77 | dofilt = gru->move.multi || gru->move.single && x->filter_abs; |
| 78 | hack = gru->move.single; | ||
| 63 | 79 | ||
| 64 | if (!ge->event) { | 80 | if (!ge->event) { |
| 65 | evbuf_clear(&x->evbuf); | 81 | evbuf_clear(&x->evbuf); |
| @@ -69,9 +85,19 @@ static void tp_sync(struct touch_engine *engine, | |||
| 69 | evbuf_get(&x->evbuf, &ev); | 85 | evbuf_get(&x->evbuf, &ev); |
| 70 | if (dofilt && grail_mask_get(filtered, ev.type)) | 86 | if (dofilt && grail_mask_get(filtered, ev.type)) |
| 71 | continue; | 87 | continue; |
| 88 | if (extra_filtered(&ev)) | ||
| 89 | continue; | ||
| 72 | ge->event(ge, &ev); | 90 | ge->event(ge, &ev); |
| 73 | nevent++; | 91 | nevent++; |
| 74 | } | 92 | } |
| 93 | if (hack != x->hack_status) { | ||
| 94 | ev = *syn; | ||
| 95 | ev.type = EV_KEY; | ||
| 96 | ev.code = BTN_TOUCH; | ||
| 97 | ev.value = hack; | ||
| 98 | ge->event(ge, &ev); | ||
| 99 | x->hack_status = hack; | ||
| 100 | } | ||
| 75 | if (nevent) | 101 | if (nevent) |
| 76 | ge->event(ge, syn); | 102 | ge->event(ge, syn); |
| 77 | } | 103 | } |
