diff options
| author | Henrik Rydberg <rydberg@euromail.se> | 2010-04-18 09:10:36 +0200 |
|---|---|---|
| committer | Henrik Rydberg <rydberg@euromail.se> | 2010-04-18 09:58:49 +0200 |
| commit | 182d9419ded03262166514e3c76033a8daa14141 (patch) | |
| tree | 3265ebe907591793ee73c0186be3e0d810716722 | |
| parent | 923754e3b864c33e23725435ae5049354a8ac5aa (diff) | |
Filter non-zero finger width events
Add filtering also to touch/width events, but be careful to treat a zero
touch exactly as zero.
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
| -rw-r--r-- | src/capabilities.c | 9 | ||||
| -rw-r--r-- | src/capabilities.h | 3 | ||||
| -rw-r--r-- | src/hwstate.c | 16 |
3 files changed, 24 insertions, 4 deletions
diff --git a/src/capabilities.c b/src/capabilities.c index 1f555f9..7f3b34d 100644 --- a/src/capabilities.c +++ b/src/capabilities.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #define CLICK_AREA(c) ((c->has_ibt ? 0.20 : 0.00) * get_cap_ysize(c)) | 29 | #define CLICK_AREA(c) ((c->has_ibt ? 0.20 : 0.00) * get_cap_ysize(c)) |
| 30 | 30 | ||
| 31 | static const int SN_COORD = 250; /* coordinate signal-to-noise ratio */ | 31 | static const int SN_COORD = 250; /* coordinate signal-to-noise ratio */ |
| 32 | static const int SN_WIDTH = 15; /* width signal-to-noise ratio */ | ||
| 32 | 33 | ||
| 33 | static const int bits_per_long = 8 * sizeof(long); | 34 | static const int bits_per_long = 8 * sizeof(long); |
| 34 | 35 | ||
| @@ -103,6 +104,9 @@ int read_capabilities(struct Capabilities *cap, int fd) | |||
| 103 | cap->xfuzz = get_cap_xsize(cap) / SN_COORD; | 104 | cap->xfuzz = get_cap_xsize(cap) / SN_COORD; |
| 104 | cap->yfuzz = get_cap_ysize(cap) / SN_COORD; | 105 | cap->yfuzz = get_cap_ysize(cap) / SN_COORD; |
| 105 | } | 106 | } |
| 107 | cap->wfuzz = cap->abs_touch_major.fuzz; | ||
| 108 | if (cap->wfuzz <= 0) | ||
| 109 | cap->wfuzz = get_cap_wsize(cap) / SN_WIDTH; | ||
| 106 | 110 | ||
| 107 | cap->yclick = cap->abs_position_y.maximum - CLICK_AREA(cap); | 111 | cap->yclick = cap->abs_position_y.maximum - CLICK_AREA(cap); |
| 108 | 112 | ||
| @@ -119,6 +123,11 @@ int get_cap_ysize(const struct Capabilities *cap) | |||
| 119 | return cap->abs_position_y.maximum - cap->abs_position_y.minimum; | 123 | return cap->abs_position_y.maximum - cap->abs_position_y.minimum; |
| 120 | } | 124 | } |
| 121 | 125 | ||
| 126 | int get_cap_wsize(const struct Capabilities *cap) | ||
| 127 | { | ||
| 128 | return cap->abs_touch_major.maximum - cap->abs_touch_major.minimum; | ||
| 129 | } | ||
| 130 | |||
| 122 | void output_capabilities(const struct Capabilities *cap) | 131 | void output_capabilities(const struct Capabilities *cap) |
| 123 | { | 132 | { |
| 124 | char line[1024]; | 133 | char line[1024]; |
diff --git a/src/capabilities.h b/src/capabilities.h index af59384..402d297 100644 --- a/src/capabilities.h +++ b/src/capabilities.h | |||
| @@ -40,13 +40,14 @@ struct Capabilities { | |||
| 40 | struct input_absinfo abs_orientation; | 40 | struct input_absinfo abs_orientation; |
| 41 | struct input_absinfo abs_position_x; | 41 | struct input_absinfo abs_position_x; |
| 42 | struct input_absinfo abs_position_y; | 42 | struct input_absinfo abs_position_y; |
| 43 | int xfuzz, yfuzz; | 43 | int xfuzz, yfuzz, wfuzz; |
| 44 | int yclick; | 44 | int yclick; |
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | int read_capabilities(struct Capabilities *cap, int fd); | 47 | int read_capabilities(struct Capabilities *cap, int fd); |
| 48 | int get_cap_xsize(const struct Capabilities *cap); | 48 | int get_cap_xsize(const struct Capabilities *cap); |
| 49 | int get_cap_ysize(const struct Capabilities *cap); | 49 | int get_cap_ysize(const struct Capabilities *cap); |
| 50 | int get_cap_wsize(const struct Capabilities *cap); | ||
| 50 | 51 | ||
| 51 | void output_capabilities(const struct Capabilities *cap); | 52 | void output_capabilities(const struct Capabilities *cap); |
| 52 | 53 | ||
diff --git a/src/hwstate.c b/src/hwstate.c index d758d25..07bab31 100644 --- a/src/hwstate.c +++ b/src/hwstate.c | |||
| @@ -69,14 +69,24 @@ static void set_finger(struct FingerState *fs, | |||
| 69 | { | 69 | { |
| 70 | int x = defuzz(hw->position_x, fs->hw.position_x, caps->xfuzz); | 70 | int x = defuzz(hw->position_x, fs->hw.position_x, caps->xfuzz); |
| 71 | int y = defuzz(hw->position_y, fs->hw.position_y, caps->yfuzz); | 71 | int y = defuzz(hw->position_y, fs->hw.position_y, caps->yfuzz); |
| 72 | fs->hw = *hw; | 72 | int tj = defuzz(hw->touch_major, fs->hw.touch_major, caps->wfuzz); |
| 73 | int tn = defuzz(hw->touch_minor, fs->hw.touch_minor, caps->wfuzz); | ||
| 74 | int wj = defuzz(hw->width_major, fs->hw.width_major, caps->wfuzz); | ||
| 75 | int wn = defuzz(hw->width_minor, fs->hw.width_minor, caps->wfuzz); | ||
| 73 | fs->id = id; | 76 | fs->id = id; |
| 77 | fs->hw = *hw; | ||
| 78 | fs->hw.position_x = x; | ||
| 79 | fs->hw.position_y = y; | ||
| 80 | if (hw->touch_major) { | ||
| 81 | fs->hw.touch_major = tj; | ||
| 82 | fs->hw.touch_minor = tn; | ||
| 83 | } | ||
| 84 | fs->hw.width_major = wj; | ||
| 85 | fs->hw.width_minor = wn; | ||
| 74 | if (!caps->has_touch_minor) | 86 | if (!caps->has_touch_minor) |
| 75 | fs->hw.touch_minor = hw->touch_major; | 87 | fs->hw.touch_minor = hw->touch_major; |
| 76 | if (!caps->has_width_minor) | 88 | if (!caps->has_width_minor) |
| 77 | fs->hw.width_minor = hw->width_major; | 89 | fs->hw.width_minor = hw->width_major; |
| 78 | fs->hw.position_x = x; | ||
| 79 | fs->hw.position_y = y; | ||
| 80 | } | 90 | } |
| 81 | 91 | ||
| 82 | void modify_hwstate(struct HWState *s, | 92 | void modify_hwstate(struct HWState *s, |
