summaryrefslogtreecommitdiff
path: root/src/state.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2008-11-08 22:19:50 +0100
committerHenrik Rydberg <rydberg@euromail.se>2008-11-08 22:19:50 +0100
commitc1131a0c9c628976d35bf6669e4d7aff7ac78988 (patch)
treedc427418916815c93713400fe644f4dd57bfc576 /src/state.c
parent2d96d426e063a4c2c33cabf9c6ebf570db1fcf1b (diff)
matching stable!
however, now crashes X occasionally... stream overload? Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c38
1 files changed, 35 insertions, 3 deletions
diff --git a/src/state.c b/src/state.c
index 1391322..290ec95 100644
--- a/src/state.c
+++ b/src/state.c
@@ -2,6 +2,9 @@
2#include <stdlib.h> 2#include <stdlib.h>
3#include <limits.h> 3#include <limits.h>
4 4
5const double FTW = 0.1;
6const double FTS = 0.1;
7
5/******************************************************/ 8/******************************************************/
6 9
7void init_state(struct State *s) 10void init_state(struct State *s)
@@ -36,6 +39,17 @@ static void set_finger(struct FingerState* fs,
36 fs->hw.width_minor = hw->width_major; 39 fs->hw.width_minor = hw->width_major;
37} 40}
38 41
42static bool touching_finger(const struct FingerData* hw,
43 const struct Capabilities* caps)
44{
45 if (caps->has_touch_major && caps->has_width_major)
46 return hw->width_major > 0 &&
47 hw->touch_major > FTW * hw->width_major;
48 if (caps->has_touch_major)
49 hw->touch_major > FTS * caps->abs_touch_major.maximum;
50 return 1;
51}
52
39/******************************************************/ 53/******************************************************/
40 54
41void modify_state(struct State *s, 55void modify_state(struct State *s,
@@ -43,7 +57,8 @@ void modify_state(struct State *s,
43 const struct Capabilities* caps) 57 const struct Capabilities* caps)
44{ 58{
45 float A[DIM2_FINGER], *row; 59 float A[DIM2_FINGER], *row;
46 int sid[DIM_FINGER], hw2s[DIM_FINGER], id, sk, hwk; 60 int sid[DIM_FINGER], hw2s[DIM_FINGER];
61 int id, sk, hwk;
47 62
48 /* setup distance matrix for finger id matching */ 63 /* setup distance matrix for finger id matching */
49 for (sk = 0; sk < s->nfinger; sk++) { 64 for (sk = 0; sk < s->nfinger; sk++) {
@@ -58,8 +73,12 @@ void modify_state(struct State *s,
58 /* update matched fingers and create new ones */ 73 /* update matched fingers and create new ones */
59 for (hwk = 0; hwk < hw->nfinger; hwk++) { 74 for (hwk = 0; hwk < hw->nfinger; hwk++) {
60 sk = hw2s[hwk]; 75 sk = hw2s[hwk];
61 id = sk < 0 ? s->nextid++ : sid[sk]; 76 id = sk >= 0 ? sid[sk] : 0;
62 set_finger(s->finger + hwk, hw->finger + hwk, id, caps); 77 if (!touching_finger(&hw->finger[hwk], caps))
78 id = 0;
79 else while (!id)
80 id = ++s->lastid;
81 set_finger(&s->finger[hwk], &hw->finger[hwk], id, caps);
63 } 82 }
64 83
65 s->button = hw->button; 84 s->button = hw->button;
@@ -75,6 +94,8 @@ const struct FingerState *find_finger(const struct State *s, int id)
75{ 94{
76 int i; 95 int i;
77 96
97 if (!id)
98 return NULL;
78 for (i = 0; i < s->nfinger; i++) 99 for (i = 0; i < s->nfinger; i++)
79 if (s->finger[i].id == id) 100 if (s->finger[i].id == id)
80 return s->finger + i; 101 return s->finger + i;
@@ -84,6 +105,17 @@ const struct FingerState *find_finger(const struct State *s, int id)
84 105
85/******************************************************/ 106/******************************************************/
86 107
108int count_fingers(const struct State *s)
109{
110 int i, n = 0;
111 for (i = 0; i < s->nfinger; i++)
112 if (s->finger[i].id)
113 n++;
114 return n;
115}
116
117/******************************************************/
118
87void output_state(const struct State *s) 119void output_state(const struct State *s)
88{ 120{
89 int i; 121 int i;