diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2008-11-08 22:19:50 +0100 |
---|---|---|
committer | Henrik Rydberg <rydberg@euromail.se> | 2008-11-08 22:19:50 +0100 |
commit | c1131a0c9c628976d35bf6669e4d7aff7ac78988 (patch) | |
tree | dc427418916815c93713400fe644f4dd57bfc576 | |
parent | 2d96d426e063a4c2c33cabf9c6ebf570db1fcf1b (diff) | |
download | xorg-input-kobomultitouch-c1131a0c9c628976d35bf6669e4d7aff7ac78988.tar.gz xorg-input-kobomultitouch-c1131a0c9c628976d35bf6669e4d7aff7ac78988.tar.bz2 xorg-input-kobomultitouch-c1131a0c9c628976d35bf6669e4d7aff7ac78988.zip |
matching stable!
however, now crashes X occasionally... stream overload?
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r-- | src/common.h | 4 | ||||
-rw-r--r-- | src/multitouch.c | 26 | ||||
-rw-r--r-- | src/state.c | 38 | ||||
-rw-r--r-- | src/state.h | 4 |
4 files changed, 57 insertions, 15 deletions
diff --git a/src/common.h b/src/common.h index c57ae1a..0ddfaaf 100644 --- a/src/common.h +++ b/src/common.h @@ -30,6 +30,10 @@ #define SYSCALL(call) while (((call) == -1) && (errno == EINTR)) +#define GETBIT(m, x) ((m>>(x))&1U) +#define SETBIT(m, x) (m|=(1U<<(x))) +#define CLEARBIT(m, x) (m&=~(1U<<(x))) + //////////////////////////////////////////////////////// #endif diff --git a/src/multitouch.c b/src/multitouch.c index a16d1b1..0ef808e 100644 --- a/src/multitouch.c +++ b/src/multitouch.c @@ -128,16 +128,21 @@ static void handle_state(LocalDevicePtr local, const struct State *ns) { const struct FingerState *fs, *p, *e = ns->finger + ns->nfinger; - int dx = 0, dy = 0, n = 0, i; - for (p = ns->finger; p != e; p++) { - if (fs = find_finger(os, p->id)) { - dx += p->hw.position_x - fs->hw.position_x; - dy += p->hw.position_y - fs->hw.position_y; + int dx = 0, dy = 0, dn = 0, n = 0, i; + if (count_fingers(ns) == count_fingers(os)) { + for (p = ns->finger; p != e; p++) { + if (fs = find_finger(os, p->id)) { + dx += p->hw.position_x - fs->hw.position_x; + dy += p->hw.position_y - fs->hw.position_y; + dn++; + } } } if (dx || dy) { + dx /= dn; + dy /= dn; xf86PostMotionEvent(local->dev, 0, 0, 2, dx, dy); - xf86Msg(X_INFO, "motion: %d %d\n", dx, dy); + //xf86Msg(X_INFO, "motion: %d %d\n", dx, dy); n++; } for (i = 0; i < DIM_BUTTON; i++) { @@ -145,14 +150,13 @@ static void handle_state(LocalDevicePtr local, xf86PostButtonEvent(local->dev, FALSE, i, GETBIT(ns->button, i), 0, 0); - xf86Msg(X_INFO, "button: %d -> %d\n", - i, GETBIT(ns->button, i)); + //xf86Msg(X_INFO, "button: %d -> %d\n", + //i, GETBIT(ns->button, i)); n++; } } - if (n) { - output_state(ns); - } + //if (n) + //output_state(ns); } //////////////////////////////////////////////////////////////////////////// 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 @@ #include <stdlib.h> #include <limits.h> +const double FTW = 0.1; +const double FTS = 0.1; + /******************************************************/ void init_state(struct State *s) @@ -36,6 +39,17 @@ static void set_finger(struct FingerState* fs, fs->hw.width_minor = hw->width_major; } +static bool touching_finger(const struct FingerData* hw, + const struct Capabilities* caps) +{ + if (caps->has_touch_major && caps->has_width_major) + return hw->width_major > 0 && + hw->touch_major > FTW * hw->width_major; + if (caps->has_touch_major) + hw->touch_major > FTS * caps->abs_touch_major.maximum; + return 1; +} + /******************************************************/ void modify_state(struct State *s, @@ -43,7 +57,8 @@ void modify_state(struct State *s, const struct Capabilities* caps) { float A[DIM2_FINGER], *row; - int sid[DIM_FINGER], hw2s[DIM_FINGER], id, sk, hwk; + int sid[DIM_FINGER], hw2s[DIM_FINGER]; + int id, sk, hwk; /* setup distance matrix for finger id matching */ for (sk = 0; sk < s->nfinger; sk++) { @@ -58,8 +73,12 @@ void modify_state(struct State *s, /* update matched fingers and create new ones */ for (hwk = 0; hwk < hw->nfinger; hwk++) { sk = hw2s[hwk]; - id = sk < 0 ? s->nextid++ : sid[sk]; - set_finger(s->finger + hwk, hw->finger + hwk, id, caps); + id = sk >= 0 ? sid[sk] : 0; + if (!touching_finger(&hw->finger[hwk], caps)) + id = 0; + else while (!id) + id = ++s->lastid; + set_finger(&s->finger[hwk], &hw->finger[hwk], id, caps); } s->button = hw->button; @@ -75,6 +94,8 @@ const struct FingerState *find_finger(const struct State *s, int id) { int i; + if (!id) + return NULL; for (i = 0; i < s->nfinger; i++) if (s->finger[i].id == id) return s->finger + i; @@ -84,6 +105,17 @@ const struct FingerState *find_finger(const struct State *s, int id) /******************************************************/ +int count_fingers(const struct State *s) +{ + int i, n = 0; + for (i = 0; i < s->nfinger; i++) + if (s->finger[i].id) + n++; + return n; +} + +/******************************************************/ + void output_state(const struct State *s) { int i; diff --git a/src/state.h b/src/state.h index 65ae581..5a59192 100644 --- a/src/state.h +++ b/src/state.h @@ -6,6 +6,7 @@ //////////////////////////////////////////////////////// +/* zero id means not mapped (not touching) */ struct FingerState { struct FingerData hw; int id; @@ -17,7 +18,7 @@ struct State { struct FingerState finger[DIM_FINGER]; button_t button; int nfinger; - int nextid; + int lastid; }; //////////////////////////////////////////////////////// @@ -29,6 +30,7 @@ void modify_state(struct State *s, void output_state(const struct State *s); const struct FingerState *find_finger(const struct State *s, int id); +int count_fingers(const struct State *s); //////////////////////////////////////////////////////// |