From 78085b21f2dc7b1d49a0c54ab56b567fc195d440 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Tue, 15 Jun 2010 20:24:14 +0200 Subject: refactor: Simplify capabilities Use the generated abs2mt mapping to simplify the MT device capabilities. Signed-off-by: Henrik Rydberg --- driver/multitouch.c | 8 ++-- include/mtdev-caps.h | 23 ++++-------- include/mtstate.h | 3 +- mtdev/caps.c | 104 ++++++++++++++++++++++++--------------------------- src/hwstate.c | 18 ++++----- src/memory.c | 10 +++-- src/mtstate.c | 12 +++--- 7 files changed, 85 insertions(+), 93 deletions(-) diff --git a/driver/multitouch.c b/driver/multitouch.c index 7e275b3..ee5242f 100644 --- a/driver/multitouch.c +++ b/driver/multitouch.c @@ -141,16 +141,16 @@ static int device_init(DeviceIntPtr dev, LocalDevicePtr local) #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7 axes_labels[0], #endif - mt->caps.abs_position_x.minimum, - mt->caps.abs_position_x.maximum, + mt->caps.abs[BIT_POSITION_X].minimum, + mt->caps.abs[BIT_POSITION_X].maximum, 1, 0, 1); xf86InitValuatorDefaults(dev, 0); xf86InitValuatorAxisStruct(dev, 1, #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7 axes_labels[1], #endif - mt->caps.abs_position_y.minimum, - mt->caps.abs_position_y.maximum, + mt->caps.abs[BIT_POSITION_Y].minimum, + mt->caps.abs[BIT_POSITION_Y].maximum, 1, 0, 1); xf86InitValuatorDefaults(dev, 1); diff --git a/include/mtdev-caps.h b/include/mtdev-caps.h index 8f88404..4460eca 100644 --- a/include/mtdev-caps.h +++ b/include/mtdev-caps.h @@ -23,25 +23,18 @@ #define MTDEV_CAPS_H #include "common.h" +#include "abs2mt.h" +#include "mtbit.h" struct Capabilities { struct input_id devid; char devname[32]; - int has_left, has_middle; - int has_right, has_mtdata, has_ibt; - int has_touch_major, has_touch_minor; - int has_width_major, has_width_minor; - int has_orientation, has_dummy; - int has_position_x, has_position_y; - struct input_absinfo abs_touch_major; - struct input_absinfo abs_touch_minor; - struct input_absinfo abs_width_major; - struct input_absinfo abs_width_minor; - struct input_absinfo abs_orientation; - struct input_absinfo abs_position_x; - struct input_absinfo abs_position_y; - int xfuzz, yfuzz, wfuzz; - int yclick; + int has_left, has_middle, has_right; + int has_mtdata, has_ibt; + int has_slot, nullid; + int has_abs[MT_ABS_SIZE]; + struct input_absinfo slot; + struct input_absinfo abs[MT_ABS_SIZE]; }; int read_capabilities(struct Capabilities *cap, int fd); diff --git a/include/mtstate.h b/include/mtstate.h index ac0b18d..b5f5dd1 100644 --- a/include/mtstate.h +++ b/include/mtstate.h @@ -54,8 +54,7 @@ static inline int center_dist2(const struct MTFinger *a, static inline int center_maxdist2(const struct Capabilities *caps) { - return dist2(caps->abs_position_x.maximum - get_cap_xmid(caps), - caps->abs_position_y.maximum - get_cap_ymid(caps)); + return dist2(get_cap_xsize(caps) / 2, get_cap_ysize(caps) / 2); } #endif diff --git a/mtdev/caps.c b/mtdev/caps.c index 51e7f5b..069816e 100644 --- a/mtdev/caps.c +++ b/mtdev/caps.c @@ -19,17 +19,17 @@ * **************************************************************************/ -#include +#include "mtdev-caps.h" +#include "mtbit.h" #define SETABS(c, x, map, key, fd) \ - (c->has_##x = getbit(map, key) && getabs(&c->abs_##x, key, fd)) + (c->has_##x = getbit(map, key) && getabs(&c->x, key, fd)) #define ADDCAP(s, c, x) strcat(s, c->has_##x ? " " #x : "") -#define CLICK_AREA(c) ((c->has_ibt ? 0.20 : 0.00) * get_cap_ysize(c)) - static const int SN_COORD = 250; /* coordinate signal-to-noise ratio */ static const int SN_WIDTH = 100; /* width signal-to-noise ratio */ +static const int SN_ORIENT = 10; /* orientation signal-to-noise ratio */ static const int bits_per_long = 8 * sizeof(long); @@ -50,6 +50,11 @@ static int getabs(struct input_absinfo *abs, int key, int fd) return rc >= 0; } +static int has_mt_data(const struct Capabilities *cap) +{ + return cap->has_abs[BIT_POSITION_X] && cap->has_abs[BIT_POSITION_Y]; +} + static int has_integrated_button(const struct Capabilities *cap) { static const int bcm5974_vmask_ibt = 1; @@ -58,12 +63,20 @@ static int has_integrated_button(const struct Capabilities *cap) return cap->devid.version & bcm5974_vmask_ibt; } +static void default_fuzz(struct Capabilities *cap, unsigned int code, int sn) +{ + int bit = abs2mt(code); + if (cap->has_abs[bit] && cap->abs[bit].fuzz == 0) + cap->abs[bit].fuzz = + (cap->abs[bit].maximum - cap->abs[bit].minimum) / sn; +} + int read_capabilities(struct Capabilities *cap, int fd) { unsigned long evbits[nlongs(EV_MAX)]; unsigned long absbits[nlongs(ABS_MAX)]; unsigned long keybits[nlongs(KEY_MAX)]; - int rc; + int rc, i; memset(cap, 0, sizeof(struct Capabilities)); @@ -87,95 +100,76 @@ int read_capabilities(struct Capabilities *cap, int fd) cap->has_middle = getbit(keybits, BTN_MIDDLE); cap->has_right = getbit(keybits, BTN_RIGHT); - SETABS(cap, touch_major, absbits, ABS_MT_TOUCH_MAJOR, fd); - SETABS(cap, touch_minor, absbits, ABS_MT_TOUCH_MINOR, fd); - SETABS(cap, width_major, absbits, ABS_MT_WIDTH_MAJOR, fd); - SETABS(cap, width_minor, absbits, ABS_MT_WIDTH_MINOR, fd); - SETABS(cap, orientation, absbits, ABS_MT_ORIENTATION, fd); - SETABS(cap, position_x, absbits, ABS_MT_POSITION_X, fd); - SETABS(cap, position_y, absbits, ABS_MT_POSITION_Y, fd); + SETABS(cap, slot, absbits, ABS_MT_SLOT, fd); + for (i = 0; i < MT_ABS_SIZE; i++) + SETABS(cap, abs[i], absbits, mt2abs(i), fd); - cap->has_mtdata = cap->has_position_x && cap->has_position_y; + cap->has_mtdata = has_mt_data(cap); cap->has_ibt = has_integrated_button(cap); - 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; - } - cap->wfuzz = cap->abs_touch_major.fuzz; - if (cap->wfuzz <= 0) - cap->wfuzz = get_cap_wsize(cap) / SN_WIDTH; + if (cap->has_abs[BIT_TRACKING_ID]) + cap->nullid = cap->abs[BIT_TRACKING_ID].minimum - 1; - cap->yclick = cap->abs_position_y.maximum - CLICK_AREA(cap); + default_fuzz(cap, ABS_MT_POSITION_X, SN_COORD); + default_fuzz(cap, ABS_MT_POSITION_Y, SN_COORD); + default_fuzz(cap, ABS_MT_TOUCH_MAJOR, SN_WIDTH); + default_fuzz(cap, ABS_MT_TOUCH_MINOR, SN_WIDTH); + default_fuzz(cap, ABS_MT_WIDTH_MAJOR, SN_WIDTH); + default_fuzz(cap, ABS_MT_WIDTH_MINOR, SN_WIDTH); + default_fuzz(cap, ABS_MT_ORIENTATION, SN_ORIENT); return 0; } int get_cap_xsize(const struct Capabilities *cap) { - return cap->abs_position_x.maximum - cap->abs_position_x.minimum; + const struct input_absinfo *x = &cap->abs[BIT_POSITION_X]; + return x->maximum - x->minimum; } int get_cap_ysize(const struct Capabilities *cap) { - return cap->abs_position_y.maximum - cap->abs_position_y.minimum; + const struct input_absinfo *y = &cap->abs[BIT_POSITION_Y]; + return y->maximum - y->minimum; } int get_cap_wsize(const struct Capabilities *cap) { - return cap->abs_touch_major.maximum - cap->abs_touch_major.minimum; + const struct input_absinfo *w = &cap->abs[BIT_TOUCH_MAJOR]; + return w->maximum - w->minimum; } int get_cap_xmid(const struct Capabilities *cap) { - return (cap->abs_position_x.maximum + cap->abs_position_x.minimum) >> 1; + const struct input_absinfo *x = &cap->abs[BIT_POSITION_X]; + return (x->maximum + x->minimum) >> 1; } int get_cap_ymid(const struct Capabilities *cap) { - return (cap->abs_position_y.maximum + cap->abs_position_y.minimum) >> 1; + const struct input_absinfo *y = &cap->abs[BIT_POSITION_Y]; + return (y->maximum + y->minimum) >> 1; } void output_capabilities(const struct Capabilities *cap) { char line[1024]; + int i; memset(line, 0, sizeof(line)); ADDCAP(line, cap, left); ADDCAP(line, cap, middle); ADDCAP(line, cap, right); ADDCAP(line, cap, mtdata); ADDCAP(line, cap, ibt); - ADDCAP(line, cap, touch_major); - ADDCAP(line, cap, touch_minor); - ADDCAP(line, cap, width_major); - ADDCAP(line, cap, width_minor); - ADDCAP(line, cap, orientation); - ADDCAP(line, cap, position_x); - ADDCAP(line, cap, position_y); xf86Msg(X_INFO, "multitouch: devname: %s\n", cap->devname); xf86Msg(X_INFO, "multitouch: devid: %x %x %x\n", cap->devid.vendor, cap->devid.product, cap->devid.version); xf86Msg(X_INFO, "multitouch: caps:%s\n", line); - if (cap->has_touch_major) - xf86Msg(X_INFO, "multitouch: touch: %d %d\n", - cap->abs_touch_major.minimum, - cap->abs_touch_major.maximum); - if (cap->has_width_major) - xf86Msg(X_INFO, "multitouch: width: %d %d\n", - cap->abs_width_major.minimum, - cap->abs_width_major.maximum); - if (cap->has_orientation) - xf86Msg(X_INFO, "multitouch: orientation: %d %d\n", - cap->abs_orientation.minimum, - cap->abs_orientation.maximum); - if (cap->has_position_x) - xf86Msg(X_INFO, "multitouch: position_x: %d %d\n", - cap->abs_position_x.minimum, - cap->abs_position_x.maximum); - if (cap->has_position_y) - xf86Msg(X_INFO, "multitouch: position_y: %d %d\n", - cap->abs_position_y.minimum, - cap->abs_position_y.maximum); + for (i = 0; i < MT_ABS_SIZE; i++) { + if (cap->has_abs[i]) + xf86Msg(X_INFO, "multitouch: %d: min: %d max: %d\n", + i, + cap->abs[i].minimum, + cap->abs[i].maximum); + } } diff --git a/src/hwstate.c b/src/hwstate.c index 81f4b8b..032351c 100644 --- a/src/hwstate.c +++ b/src/hwstate.c @@ -21,7 +21,7 @@ #include "hwstate.h" -#define NOTOUCH(hw, c) ((hw)->touch_major == 0 && (c)->has_touch_major) +#define NOTOUCH(hw, c) ((hw)->touch_major == 0 && (c)->has_abs[BIT_TOUCH_MAJOR]) void init_hwstate(struct HWState *s) { @@ -49,12 +49,12 @@ 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); - int tj = defuzz(hw->touch_major, fs->hw.touch_major, caps->wfuzz); - int tn = defuzz(hw->touch_minor, fs->hw.touch_minor, caps->wfuzz); - int wj = defuzz(hw->width_major, fs->hw.width_major, caps->wfuzz); - int wn = defuzz(hw->width_minor, fs->hw.width_minor, caps->wfuzz); + int x = defuzz(hw->position_x, fs->hw.position_x, caps->abs[BIT_POSITION_X].fuzz); + int y = defuzz(hw->position_y, fs->hw.position_y, caps->abs[BIT_POSITION_Y].fuzz); + int tj = defuzz(hw->touch_major, fs->hw.touch_major, caps->abs[BIT_TOUCH_MAJOR].fuzz); + int tn = defuzz(hw->touch_minor, fs->hw.touch_minor, caps->abs[BIT_TOUCH_MAJOR].fuzz); + int wj = defuzz(hw->width_major, fs->hw.width_major, caps->abs[BIT_TOUCH_MAJOR].fuzz); + int wn = defuzz(hw->width_minor, fs->hw.width_minor, caps->abs[BIT_TOUCH_MAJOR].fuzz); fs->id = id; fs->hw = *hw; fs->hw.position_x = x; @@ -65,9 +65,9 @@ static void set_finger(struct FingerState *fs, } fs->hw.width_major = wj; fs->hw.width_minor = wn; - if (!caps->has_touch_minor) + if (!caps->has_abs[BIT_TOUCH_MINOR]) fs->hw.touch_minor = hw->touch_major; - if (!caps->has_width_minor) + if (!caps->has_abs[BIT_WIDTH_MINOR]) fs->hw.width_minor = hw->width_major; } diff --git a/src/memory.c b/src/memory.c index 9084502..39621da 100644 --- a/src/memory.c +++ b/src/memory.c @@ -21,6 +21,9 @@ #include "memory.h" +/* click area definition */ +#define CLICK_AREA(c) ((c->has_ibt ? 0.20 : 0.00) * get_cap_ysize(c)) + /* fraction of max movement threshold */ #define DELTA_CUT(x) (0.5 * (x)) @@ -88,11 +91,12 @@ static void update_pointers(struct Memory *m, const struct Capabilities *caps) { const struct MTFinger *f = state->finger; + int yclick = caps->abs[BIT_POSITION_Y].maximum - CLICK_AREA(caps); int i; if (state->nfinger < 2) { m->pointing = m->fingers; - m->ybar = caps->abs_position_y.maximum; + m->ybar = caps->abs[BIT_POSITION_Y].maximum; return; } @@ -107,9 +111,9 @@ static void update_pointers(struct Memory *m, } m->pointing = 0; - m->ybar = caps->yclick; + m->ybar = yclick; foreach_bit(i, m->fingers) { - if (f[i].hw.position_y > caps->yclick) + if (f[i].hw.position_y > yclick) continue; if (!m->pointing || f[i].hw.position_y > m->ybar) m->ybar = f[i].hw.position_y; diff --git a/src/mtstate.c b/src/mtstate.c index 1e2eeef..2403765 100644 --- a/src/mtstate.c +++ b/src/mtstate.c @@ -22,7 +22,7 @@ #include "mtstate.h" #define TOUCH_WIDTH(hw) (0.05 * hw->width_major) -#define TOUCH_SCALE(caps) (0.05 * caps->abs_touch_major.maximum) +#define TOUCH_SCALE(caps) (0.05 * caps->abs[BIT_TOUCH_MAJOR].maximum) #define THUMB_TOUCH(hw) (1.2 * hw->touch_minor) #define THUMB_WIDTH_TOUCH(hw) (3 * hw->touch_major) @@ -37,9 +37,9 @@ void init_mtstate(struct MTState *s) static int touching_finger(const struct FingerData *hw, const struct Capabilities *caps) { - if (caps->has_touch_major && caps->has_width_major) + if (caps->has_abs[BIT_TOUCH_MAJOR] && caps->has_abs[BIT_WIDTH_MAJOR]) return hw->touch_major > TOUCH_WIDTH(hw); - if (caps->has_touch_major) + if (caps->has_abs[BIT_TOUCH_MAJOR]) return hw->touch_major > TOUCH_SCALE(caps); return 1; } @@ -55,8 +55,10 @@ static int touching_finger(const struct FingerData *hw, static int thumb_finger(const struct FingerData *hw, const struct Capabilities *caps) { - if (!caps->has_touch_major || !caps->has_touch_minor || - !caps->has_width_major || !caps->has_width_minor) + if (!caps->has_abs[BIT_TOUCH_MAJOR] || + !caps->has_abs[BIT_TOUCH_MINOR] || + !caps->has_abs[BIT_WIDTH_MAJOR] || + !caps->has_abs[BIT_WIDTH_MINOR]) return 0; return hw->touch_major > THUMB_TOUCH(hw) && hw->width_major > THUMB_WIDTH_TOUCH(hw) && -- cgit v1.2.3