aboutsummaryrefslogtreecommitdiffstats
path: root/src
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
parent9f6a75a35de8d05a8ae2e8b5d5cd10d960d4de4b (diff)
downloadxorg-input-kobomultitouch-809b43cb3bac52ad87228a458dcd3dbf11180c97.tar.gz
xorg-input-kobomultitouch-809b43cb3bac52ad87228a458dcd3dbf11180c97.tar.bz2
xorg-input-kobomultitouch-809b43cb3bac52ad87228a458dcd3dbf11180c97.zip
cleanup
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src')
-rw-r--r--src/hwdata.c20
-rw-r--r--src/hwdata.h5
-rw-r--r--src/multitouch.c20
-rw-r--r--src/state.c55
-rw-r--r--src/state.h5
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;
};
////////////////////////////////////////////////////////