aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2008-11-08 22:19:50 +0100
committerHenrik Rydberg <rydberg@euromail.se>2008-11-08 22:19:50 +0100
commitc1131a0c9c628976d35bf6669e4d7aff7ac78988 (patch)
treedc427418916815c93713400fe644f4dd57bfc576 /src
parent2d96d426e063a4c2c33cabf9c6ebf570db1fcf1b (diff)
downloadxorg-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>
Diffstat (limited to 'src')
-rw-r--r--src/common.h4
-rw-r--r--src/multitouch.c26
-rw-r--r--src/state.c38
-rw-r--r--src/state.h4
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);
////////////////////////////////////////////////////////