diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2008-11-07 00:57:33 +0100 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2008-11-07 00:57:33 +0100 |
| commit | 8331c4858987bce53afac9c06ab45808fd751dbd (patch) | |
| tree | d7ae3bb72ebfb4dd1f16eb29fd66f201b41dd84b /src/state.c | |
| parent | d44b4794c679141a08fd802475bb542ecf5b7c51 (diff) | |
Works nicely - state output seems reasonable
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src/state.c')
| -rw-r--r-- | src/state.c | 83 |
1 files changed, 50 insertions, 33 deletions
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 | ||
| 13 | inline int fincomp(const struct FingerState* a,const struct FingerState* b) | 13 | static 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 | ||
| 18 | inline float dist2(const struct FingerData* a,const struct FingerData* b) | 18 | inline 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 | ||
| 26 | void modify_state(struct State *s, const struct HWData* hw) | 26 | static 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 | |||
| 38 | inline 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 | |||
| 46 | void 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) | |||
| 84 | void output_state(const struct State *s) | 98 | void 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 | ||
