summaryrefslogtreecommitdiff
path: root/src/grail-api.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-08-10 15:26:22 +0100
committerHenrik Rydberg <rydberg@euromail.se>2010-08-10 15:26:22 +0100
commit33be41843e18b6a716ff62982e32c843e7a2bb1f (patch)
treeedd5bb894a42506842661b74f4ce7a8960057f65 /src/grail-api.c
parenta9a0e2c02bdd6e9dfdff523705e7afcb47e82adb (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/grail-api.c')
-rw-r--r--src/grail-api.c28
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
41static void tp_event(struct touch_engine *engine, 42static 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
50static 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
49static void tp_sync(struct touch_engine *engine, 64static 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}