summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/multitouch.c2
-rw-r--r--src/state.c83
-rw-r--r--src/state.h5
3 files changed, 55 insertions, 35 deletions
diff --git a/src/multitouch.c b/src/multitouch.c
index 21f3e1e..c18f3d3 100644
--- a/src/multitouch.c
+++ b/src/multitouch.c
@@ -81,7 +81,7 @@ static void read_input(LocalDevicePtr local)
81 struct MTouch *mt = local->private; 81 struct MTouch *mt = local->private;
82 if (local->fd >= 0) { 82 if (local->fd >= 0) {
83 while (read_synchronized_event(mt, local->fd)) { 83 while (read_synchronized_event(mt, local->fd)) {
84 modify_state(&mt->ns, &mt->hw); 84 modify_state(&mt->ns, &mt->hw, &mt->caps);
85 output_state(&mt->ns); 85 output_state(&mt->ns);
86 mt->os = mt->ns; 86 mt->os = mt->ns;
87 } 87 }
diff --git a/src/state.c b/src/state.c
index fc3580d..eff9c3e 100644
--- a/src/state.c
+++ b/src/state.c
@@ -10,9 +10,9 @@ void init_state(struct State *s)
10 10
11/******************************************************/ 11/******************************************************/
12 12
13inline int fincomp(const struct FingerState* a,const struct FingerState* b) 13static int fincmp(const void* a,const void* b)
14{ 14{
15 return a->id - b->id; 15 return ((struct FingerState *)a)->id - ((struct FingerState *)b)->id;
16} 16}
17 17
18inline float dist2(const struct FingerData* a,const struct FingerData* b) 18inline float dist2(const struct FingerData* a,const struct FingerData* b)
@@ -23,10 +23,33 @@ inline float dist2(const struct FingerData* a,const struct FingerData* b)
23 return dx * dx + dy * dy; 23 return dx * dx + dy * dy;
24} 24}
25 25
26void modify_state(struct State *s, const struct HWData* hw) 26static void set_finger(struct FingerState* fs,
27 const struct FingerData* hw, int id,
28 const struct Capabilities* caps)
29{
30 fs->hw = *hw;
31 fs->id = id;
32 if (!caps->has_touch_minor)
33 fs->hw.touch_minor = hw->touch_major;
34 if (!caps->has_width_minor)
35 fs->hw.width_minor = hw->width_major;
36}
37
38inline bool good_finger(const struct FingerState* fs)
39{
40 return fs->hw.touch_major > 0 && fs->hw.width_major > 0 &&
41 fs->hw.touch_minor > 0 && fs->hw.width_minor > 0;
42}
43
44/******************************************************/
45
46void modify_state(struct State *s,
47 const struct HWData* hw,
48 const struct Capabilities* caps)
27{ 49{
28 float A[DIM2_FINGER], *row; 50 float A[DIM2_FINGER], *row;
29 int id[DIM_FINGER], index[DIM_FINGER], i, j; 51 int id[DIM_FINGER], index[DIM_FINGER], i, j;
52 struct FingerState *fs = s->finger;
30 53
31 for (j = 0; j < s->nfinger; j++) { 54 for (j = 0; j < s->nfinger; j++) {
32 id[j] = s->finger[j].id; 55 id[j] = s->finger[j].id;
@@ -37,29 +60,20 @@ void modify_state(struct State *s, const struct HWData* hw)
37 60
38 match_fingers(index, A, hw->nfinger, s->nfinger); 61 match_fingers(index, A, hw->nfinger, s->nfinger);
39 62
40 s->nfinger = 0; 63 /* update matched fingers and create new ones */
41
42 /* update matched fingers */
43 for (i = 0; i < hw->nfinger; i++) {
44 if ((j = index[i]) >= 0) {
45 s->finger[s->nfinger].id = id[j];
46 s->finger[s->nfinger].hw = hw->finger[i];
47 s->nfinger++;
48 }
49 }
50
51 /* create new fingers */
52 for (i = 0; i < hw->nfinger; i++) { 64 for (i = 0; i < hw->nfinger; i++) {
53 if (index[i] < 0) { 65 j = index[i];
54 s->finger[s->nfinger].id = ++s->lastid; 66 if (j >= 0)
55 s->finger[s->nfinger].hw = hw->finger[i]; 67 set_finger(fs, hw->finger + i, id[j], caps);
56 s->nfinger++; 68 else
57 } 69 set_finger(fs, hw->finger + i, ++s->lastid, caps);
70 if (good_finger(fs))
71 fs++;
58 } 72 }
73 s->nfinger = fs - s->finger;
59 74
60 /* sort fingers in touching order */ 75 /* sort fingers in touching order */
61 qsort(s->finger, s->nfinger, sizeof(struct FingerState), 76 qsort(s->finger, s->nfinger, sizeof(struct FingerState), fincmp);
62 (int (*)(const void*,const void*))fincomp);
63 77
64 /* copy buttons */ 78 /* copy buttons */
65 for (i = 0; i < DIM_BUTTON; i++) 79 for (i = 0; i < DIM_BUTTON; i++)
@@ -84,18 +98,21 @@ const struct FingerState *find_finger(const struct State *s, int id)
84void output_state(const struct State *s) 98void output_state(const struct State *s)
85{ 99{
86 int i; 100 int i;
87 printf("buttons: %d%d%d\n", s->button[0], s->button[1], s->button[2]); 101 xf86Msg(X_INFO, "buttons: %d%d%d\n",
88 printf("fingers: %d\n", s->nfinger); 102 s->button[0], s->button[1], s->button[2]);
103 xf86Msg(X_INFO, "fingers: %d\n",
104 s->nfinger);
89 for (i = 0; i < s->nfinger; i++) { 105 for (i = 0; i < s->nfinger; i++) {
90 printf(" %+02d %+05d:%+05d +%05d:%+05d %+05d %+05d:%+05d\n", 106 xf86Msg(X_INFO,
91 s->finger[i].id, 107 " %+02d %+05d:%+05d +%05d:%+05d %+06d %+05d:%+05d\n",
92 s->finger[i].hw.touch_major, 108 s->finger[i].id,
93 s->finger[i].hw.touch_minor, 109 s->finger[i].hw.touch_major,
94 s->finger[i].hw.width_major, 110 s->finger[i].hw.touch_minor,
95 s->finger[i].hw.width_minor, 111 s->finger[i].hw.width_major,
96 s->finger[i].hw.orientation, 112 s->finger[i].hw.width_minor,
97 s->finger[i].hw.position_x, 113 s->finger[i].hw.orientation,
98 s->finger[i].hw.position_y); 114 s->finger[i].hw.position_x,
115 s->finger[i].hw.position_y);
99 } 116 }
100} 117}
101 118
diff --git a/src/state.h b/src/state.h
index 8b41920..7bf4438 100644
--- a/src/state.h
+++ b/src/state.h
@@ -1,6 +1,7 @@
1#ifndef MTEVENT_H 1#ifndef MTEVENT_H
2#define MTEVENT_H 2#define MTEVENT_H
3 3
4#include "capabilities.h"
4#include "hwdata.h" 5#include "hwdata.h"
5 6
6//////////////////////////////////////////////////////// 7////////////////////////////////////////////////////////
@@ -21,7 +22,9 @@ struct State {
21//////////////////////////////////////////////////////// 22////////////////////////////////////////////////////////
22 23
23void init_state(struct State *s); 24void init_state(struct State *s);
24void modify_state(struct State *s, const struct HWData* hw); 25void modify_state(struct State *s,
26 const struct HWData* hw,
27 const struct Capabilities* caps);
25void output_state(const struct State *s); 28void output_state(const struct State *s);
26 29
27const struct FingerState *find_finger(const struct State *s, int id); 30const struct FingerState *find_finger(const struct State *s, int id);