summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/capabilities.c9
-rw-r--r--src/capabilities.h1
-rw-r--r--src/hwstate.c21
3 files changed, 31 insertions, 0 deletions
diff --git a/src/capabilities.c b/src/capabilities.c
index 7316f01..620ab60 100644
--- a/src/capabilities.c
+++ b/src/capabilities.c
@@ -26,6 +26,8 @@
26 26
27#define ADDCAP(s, c, x) strcat(s, c->has_##x ? " " #x : "") 27#define ADDCAP(s, c, x) strcat(s, c->has_##x ? " " #x : "")
28 28
29static const int SN_COORD = 250; /* coordinate signal-to-noise ratio */
30
29static const int bits_per_long = 8 * sizeof(long); 31static const int bits_per_long = 8 * sizeof(long);
30 32
31static inline int nlongs(int nbit) 33static inline int nlongs(int nbit)
@@ -78,6 +80,13 @@ int read_capabilities(struct Capabilities *cap, int fd)
78 80
79 cap->has_mtdata = cap->has_position_x && cap->has_position_y; 81 cap->has_mtdata = cap->has_position_x && cap->has_position_y;
80 82
83 cap->xfuzz = cap->abs_position_x.fuzz;
84 cap->yfuzz = cap->abs_position_y.fuzz;
85 if (cap->xfuzz <= 0 || cap->yfuzz <= 0) {
86 cap->xfuzz = get_cap_xsize(cap) / SN_COORD;
87 cap->yfuzz = get_cap_ysize(cap) / SN_COORD;
88 }
89
81 return 0; 90 return 0;
82} 91}
83 92
diff --git a/src/capabilities.h b/src/capabilities.h
index dc257ce..591eed6 100644
--- a/src/capabilities.h
+++ b/src/capabilities.h
@@ -38,6 +38,7 @@ struct Capabilities {
38 struct input_absinfo abs_orientation; 38 struct input_absinfo abs_orientation;
39 struct input_absinfo abs_position_x; 39 struct input_absinfo abs_position_x;
40 struct input_absinfo abs_position_y; 40 struct input_absinfo abs_position_y;
41 int xfuzz, yfuzz;
41}; 42};
42 43
43int read_capabilities(struct Capabilities *cap, int fd); 44int read_capabilities(struct Capabilities *cap, int fd);
diff --git a/src/hwstate.c b/src/hwstate.c
index 40cef5b..4af636c 100644
--- a/src/hwstate.c
+++ b/src/hwstate.c
@@ -44,16 +44,37 @@ inline int dist2(const struct FingerData *a, const struct FingerData *b)
44 return dx * dx + dy * dy; 44 return dx * dx + dy * dy;
45} 45}
46 46
47/* Dmitry Torokhov's code from kernel/driver/input/input.c */
48static int defuzz(int value, int old_val, int fuzz)
49{
50 if (fuzz) {
51 if (value > old_val - fuzz / 2 && value < old_val + fuzz / 2)
52 return old_val;
53
54 if (value > old_val - fuzz && value < old_val + fuzz)
55 return (old_val * 3 + value) / 4;
56
57 if (value > old_val - fuzz * 2 && value < old_val + fuzz * 2)
58 return (old_val + value) / 2;
59 }
60
61 return value;
62}
63
47static void set_finger(struct FingerState *fs, 64static void set_finger(struct FingerState *fs,
48 const struct FingerData *hw, int id, 65 const struct FingerData *hw, int id,
49 const struct Capabilities *caps) 66 const struct Capabilities *caps)
50{ 67{
68 int x = defuzz(hw->position_x, fs->hw.position_x, caps->xfuzz);
69 int y = defuzz(hw->position_y, fs->hw.position_y, caps->yfuzz);
51 fs->hw = *hw; 70 fs->hw = *hw;
52 fs->id = id; 71 fs->id = id;
53 if (!caps->has_touch_minor) 72 if (!caps->has_touch_minor)
54 fs->hw.touch_minor = hw->touch_major; 73 fs->hw.touch_minor = hw->touch_major;
55 if (!caps->has_width_minor) 74 if (!caps->has_width_minor)
56 fs->hw.width_minor = hw->width_major; 75 fs->hw.width_minor = hw->width_major;
76 fs->hw.position_x = x;
77 fs->hw.position_y = y;
57} 78}
58 79
59void modify_hwstate(struct HWState *s, 80void modify_hwstate(struct HWState *s,