summaryrefslogtreecommitdiff
path: root/src/state.c
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2008-11-08 16:01:51 +0100
committerHenrik Rydberg <rydberg@euromail.se>2008-11-08 16:01:51 +0100
commit809b43cb3bac52ad87228a458dcd3dbf11180c97 (patch)
treeffc51f2d9fa6a76e85170bb0ac1279931e722a4c /src/state.c
parent9f6a75a35de8d05a8ae2e8b5d5cd10d960d4de4b (diff)
cleanup
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c55
1 files changed, 19 insertions, 36 deletions
diff --git a/src/state.c b/src/state.c
index e5ca1c1..1391322 100644
--- a/src/state.c
+++ b/src/state.c
@@ -36,12 +36,6 @@ static void set_finger(struct FingerState* fs,
36 fs->hw.width_minor = hw->width_major; 36 fs->hw.width_minor = hw->width_major;
37} 37}
38 38
39inline bool good_finger(const struct FingerState* fs)
40{
41 return fs->hw.touch_major > 0 && fs->hw.width_major > 0 &&
42 fs->hw.touch_minor > 0 && fs->hw.width_minor > 0;
43}
44
45/******************************************************/ 39/******************************************************/
46 40
47void modify_state(struct State *s, 41void modify_state(struct State *s,
@@ -49,43 +43,30 @@ void modify_state(struct State *s,
49 const struct Capabilities* caps) 43 const struct Capabilities* caps)
50{ 44{
51 float A[DIM2_FINGER], *row; 45 float A[DIM2_FINGER], *row;
52 int id[DIM_FINGER], index[DIM_FINGER], i, j; 46 int sid[DIM_FINGER], hw2s[DIM_FINGER], id, sk, hwk;
53 struct FingerState *fs = s->finger; 47
54 48 /* setup distance matrix for finger id matching */
55 for (j = 0; j < s->nfinger; j++) { 49 for (sk = 0; sk < s->nfinger; sk++) {
56 id[j] = s->finger[j].id; 50 sid[sk] = s->finger[sk].id;
57 row = A + hw->nfinger * j; 51 row = A + hw->nfinger * sk;
58 for (i = 0; i < hw->nfinger; i++) 52 for (hwk = 0; hwk < hw->nfinger; hwk++)
59 row[i] = dist2(&hw->finger[i], &s->finger[j].hw); 53 row[hwk] = dist2(&hw->finger[hwk], &s->finger[sk].hw);
60 } 54 }
61 55
62 match_fingers(index, A, hw->nfinger, s->nfinger); 56 match_fingers(hw2s, A, hw->nfinger, s->nfinger);
63 57
64 /* update matched fingers and create new ones */ 58 /* update matched fingers and create new ones */
65 for (i = 0; i < hw->nfinger; i++) { 59 for (hwk = 0; hwk < hw->nfinger; hwk++) {
66 j = index[i]; 60 sk = hw2s[hwk];
67 if (j >= 0) 61 id = sk < 0 ? s->nextid++ : sid[sk];
68 set_finger(fs, hw->finger + i, id[j], caps); 62 set_finger(s->finger + hwk, hw->finger + hwk, id, caps);
69 else
70 set_finger(fs, hw->finger + i, ++s->lastid, caps);
71 if (good_finger(fs))
72 fs++;
73 } 63 }
74 s->nfinger = fs - s->finger; 64
65 s->button = hw->button;
66 s->nfinger = hw->nfinger;
75 67
76 /* sort fingers in touching order */ 68 /* sort fingers in touching order */
77 qsort(s->finger, s->nfinger, sizeof(struct FingerState), fincmp); 69 qsort(s->finger, s->nfinger, sizeof(struct FingerState), fincmp);
78
79 /* make sure wrap-around does not create very strange effects */
80 if (s->lastid > INT_MAX / 2) {
81 s->lastid = 0;
82 for (j = 0; j < s->nfinger; j++)
83 s->finger[j].id = ++s->lastid;
84 }
85
86 /* copy buttons */
87 for (i = 0; i < DIM_BUTTON; i++)
88 s->button[i] = hw->button[i];
89} 70}
90 71
91/******************************************************/ 72/******************************************************/
@@ -107,7 +88,9 @@ void output_state(const struct State *s)
107{ 88{
108 int i; 89 int i;
109 xf86Msg(X_INFO, "buttons: %d%d%d\n", 90 xf86Msg(X_INFO, "buttons: %d%d%d\n",
110 s->button[0], s->button[1], s->button[2]); 91 GETBIT(s->button, MT_BUTTON_LEFT),
92 GETBIT(s->button, MT_BUTTON_MIDDLE),
93 GETBIT(s->button, MT_BUTTON_RIGHT));
111 xf86Msg(X_INFO, "fingers: %d\n", 94 xf86Msg(X_INFO, "fingers: %d\n",
112 s->nfinger); 95 s->nfinger);
113 for (i = 0; i < s->nfinger; i++) { 96 for (i = 0; i < s->nfinger; i++) {