diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hwdata.c | 20 | ||||
-rw-r--r-- | src/hwdata.h | 5 | ||||
-rw-r--r-- | src/multitouch.c | 20 | ||||
-rw-r--r-- | src/state.c | 55 | ||||
-rw-r--r-- | src/state.h | 5 |
5 files changed, 54 insertions, 51 deletions
diff --git a/src/hwdata.c b/src/hwdata.c index 029d68a..1882910 100644 --- a/src/hwdata.c +++ b/src/hwdata.c @@ -11,7 +11,6 @@ void init_hwdata(struct HWData *hw) bool read_hwdata(struct HWData *hw, const struct input_event* ev) { - bool on = ev->value != 0; switch (ev->type) { case EV_SYN: switch (ev->code) { @@ -22,20 +21,29 @@ bool read_hwdata(struct HWData *hw, const struct input_event* ev) case EV_KEY: switch (ev->code) { case BTN_LEFT: - hw->button[MT_BUTTON_LEFT] = on; + if (ev->value) + SETBIT(hw->button, MT_BUTTON_LEFT); + else + CLEARBIT(hw->button, MT_BUTTON_LEFT); break; case BTN_MIDDLE: - hw->button[MT_BUTTON_MIDDLE] = on; + if (ev->value) + SETBIT(hw->button, MT_BUTTON_MIDDLE); + else + CLEARBIT(hw->button, MT_BUTTON_MIDDLE); break; case BTN_RIGHT: - hw->button[MT_BUTTON_RIGHT] = on; + if (ev->value) + SETBIT(hw->button, MT_BUTTON_RIGHT); + else + CLEARBIT(hw->button, MT_BUTTON_RIGHT); break; case BTN_MT_REPORT_PACKET: - if (on) + if (ev->value) hw->nfinger = 0; break; case BTN_MT_REPORT_FINGER: - if (!on && hw->nfinger < DIM_FINGER) + if (!ev->value && hw->nfinger < DIM_FINGER) hw->nfinger++; break; } diff --git a/src/hwdata.h b/src/hwdata.h index 59cff0d..f91f11b 100644 --- a/src/hwdata.h +++ b/src/hwdata.h @@ -9,6 +9,8 @@ #define MT_BUTTON_MIDDLE 1 #define MT_BUTTON_RIGHT 2 +typedef unsigned int button_t; + //////////////////////////////////////////////////////// struct FingerData { @@ -22,7 +24,8 @@ struct FingerData { struct HWData { struct FingerData finger[DIM_FINGER]; - int nfinger, button[DIM_BUTTON]; + button_t button; + int nfinger; }; //////////////////////////////////////////////////////// diff --git a/src/multitouch.c b/src/multitouch.c index 987cf34..a16d1b1 100644 --- a/src/multitouch.c +++ b/src/multitouch.c @@ -128,7 +128,7 @@ 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, i; + 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; @@ -136,15 +136,23 @@ static void handle_state(LocalDevicePtr local, } } if (dx || dy) { - output_state(ns); - xf86Msg(X_INFO, "motion: %d %d\n", dx, dy); xf86PostMotionEvent(local->dev, 0, 0, 2, dx, dy); + xf86Msg(X_INFO, "motion: %d %d\n", dx, dy); + n++; } - for (i = 0; i < DIM_BUTTON; i++) - if (ns->button[i] != os->button[i]) + for (i = 0; i < DIM_BUTTON; i++) { + if (GETBIT(ns->button, i) != GETBIT(os->button, i)) { xf86PostButtonEvent(local->dev, FALSE, - i + 1, ns->button[i], + i, GETBIT(ns->button, i), 0, 0); + xf86Msg(X_INFO, "button: %d -> %d\n", + i, GETBIT(ns->button, i)); + n++; + } + } + if (n) { + output_state(ns); + } } //////////////////////////////////////////////////////////////////////////// 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, fs->hw.width_minor = hw->width_major; } -inline bool good_finger(const struct FingerState* fs) -{ - return fs->hw.touch_major > 0 && fs->hw.width_major > 0 && - fs->hw.touch_minor > 0 && fs->hw.width_minor > 0; -} - /******************************************************/ void modify_state(struct State *s, @@ -49,43 +43,30 @@ void modify_state(struct State *s, const struct Capabilities* caps) { float A[DIM2_FINGER], *row; - int id[DIM_FINGER], index[DIM_FINGER], i, j; - struct FingerState *fs = s->finger; - - for (j = 0; j < s->nfinger; j++) { - id[j] = s->finger[j].id; - row = A + hw->nfinger * j; - for (i = 0; i < hw->nfinger; i++) - row[i] = dist2(&hw->finger[i], &s->finger[j].hw); + int sid[DIM_FINGER], hw2s[DIM_FINGER], id, sk, hwk; + + /* setup distance matrix for finger id matching */ + for (sk = 0; sk < s->nfinger; sk++) { + sid[sk] = s->finger[sk].id; + row = A + hw->nfinger * sk; + for (hwk = 0; hwk < hw->nfinger; hwk++) + row[hwk] = dist2(&hw->finger[hwk], &s->finger[sk].hw); } - match_fingers(index, A, hw->nfinger, s->nfinger); + match_fingers(hw2s, A, hw->nfinger, s->nfinger); /* update matched fingers and create new ones */ - for (i = 0; i < hw->nfinger; i++) { - j = index[i]; - if (j >= 0) - set_finger(fs, hw->finger + i, id[j], caps); - else - set_finger(fs, hw->finger + i, ++s->lastid, caps); - if (good_finger(fs)) - fs++; + 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); } - s->nfinger = fs - s->finger; + + s->button = hw->button; + s->nfinger = hw->nfinger; /* sort fingers in touching order */ qsort(s->finger, s->nfinger, sizeof(struct FingerState), fincmp); - - /* make sure wrap-around does not create very strange effects */ - if (s->lastid > INT_MAX / 2) { - s->lastid = 0; - for (j = 0; j < s->nfinger; j++) - s->finger[j].id = ++s->lastid; - } - - /* copy buttons */ - for (i = 0; i < DIM_BUTTON; i++) - s->button[i] = hw->button[i]; } /******************************************************/ @@ -107,7 +88,9 @@ void output_state(const struct State *s) { int i; xf86Msg(X_INFO, "buttons: %d%d%d\n", - s->button[0], s->button[1], s->button[2]); + GETBIT(s->button, MT_BUTTON_LEFT), + GETBIT(s->button, MT_BUTTON_MIDDLE), + GETBIT(s->button, MT_BUTTON_RIGHT)); xf86Msg(X_INFO, "fingers: %d\n", s->nfinger); for (i = 0; i < s->nfinger; i++) { diff --git a/src/state.h b/src/state.h index 7bf4438..65ae581 100644 --- a/src/state.h +++ b/src/state.h @@ -15,8 +15,9 @@ struct FingerState { struct State { struct FingerState finger[DIM_FINGER]; - int button[DIM_BUTTON]; - int nfinger, lastid; + button_t button; + int nfinger; + int nextid; }; //////////////////////////////////////////////////////// |