diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/capabilities.c | 9 | ||||
-rw-r--r-- | src/capabilities.h | 1 | ||||
-rw-r--r-- | src/hwstate.c | 21 |
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 @@ #define ADDCAP(s, c, x) strcat(s, c->has_##x ? " " #x : "") +static const int SN_COORD = 250; /* coordinate signal-to-noise ratio */ + static const int bits_per_long = 8 * sizeof(long); static inline int nlongs(int nbit) @@ -78,6 +80,13 @@ int read_capabilities(struct Capabilities *cap, int fd) cap->has_mtdata = cap->has_position_x && cap->has_position_y; + cap->xfuzz = cap->abs_position_x.fuzz; + cap->yfuzz = cap->abs_position_y.fuzz; + if (cap->xfuzz <= 0 || cap->yfuzz <= 0) { + cap->xfuzz = get_cap_xsize(cap) / SN_COORD; + cap->yfuzz = get_cap_ysize(cap) / SN_COORD; + } + return 0; } 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 { struct input_absinfo abs_orientation; struct input_absinfo abs_position_x; struct input_absinfo abs_position_y; + int xfuzz, yfuzz; }; int 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) return dx * dx + dy * dy; } +/* Dmitry Torokhov's code from kernel/driver/input/input.c */ +static int defuzz(int value, int old_val, int fuzz) +{ + if (fuzz) { + if (value > old_val - fuzz / 2 && value < old_val + fuzz / 2) + return old_val; + + if (value > old_val - fuzz && value < old_val + fuzz) + return (old_val * 3 + value) / 4; + + if (value > old_val - fuzz * 2 && value < old_val + fuzz * 2) + return (old_val + value) / 2; + } + + return value; +} + static void set_finger(struct FingerState *fs, const struct FingerData *hw, int id, const struct Capabilities *caps) { + int x = defuzz(hw->position_x, fs->hw.position_x, caps->xfuzz); + int y = defuzz(hw->position_y, fs->hw.position_y, caps->yfuzz); fs->hw = *hw; fs->id = id; if (!caps->has_touch_minor) fs->hw.touch_minor = hw->touch_major; if (!caps->has_width_minor) fs->hw.width_minor = hw->width_major; + fs->hw.position_x = x; + fs->hw.position_y = y; } void modify_hwstate(struct HWState *s, |