diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/wscons/wsconsio.h | 5 | ||||
-rw-r--r-- | sys/dev/wscons/wsmouse.c | 74 | ||||
-rw-r--r-- | sys/dev/wscons/wsmouseinput.h | 8 | ||||
-rw-r--r-- | sys/dev/wscons/wstpad.c | 35 |
4 files changed, 36 insertions, 86 deletions
diff --git a/sys/dev/wscons/wsconsio.h b/sys/dev/wscons/wsconsio.h index 64478d4efd9..97803143bc3 100644 --- a/sys/dev/wscons/wsconsio.h +++ b/sys/dev/wscons/wsconsio.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wsconsio.h,v 1.89 2018/07/30 15:56:30 jcs Exp $ */ +/* $OpenBSD: wsconsio.h,v 1.90 2018/11/10 14:27:51 bru Exp $ */ /* $NetBSD: wsconsio.h,v 1.74 2005/04/28 07:15:44 martin Exp $ */ /* @@ -295,7 +295,8 @@ enum wsmousecfg { WSMOUSECFG_X_HYSTERESIS,/* retard value for X coordinates */ WSMOUSECFG_Y_HYSTERESIS,/* retard value for Y coordinates */ WSMOUSECFG_DECELERATION,/* threshold (distance) for deceleration */ - WSMOUSECFG_STRONG_HYSTERESIS, /* apply the filter continuously */ + WSMOUSECFG_STRONG_HYSTERESIS, /* FALSE and read-only, the fea- + ture is not supported anymore. */ WSMOUSECFG_SMOOTHING, /* smoothing factor (0-7) */ /* diff --git a/sys/dev/wscons/wsmouse.c b/sys/dev/wscons/wsmouse.c index be654aa7ab8..9f3a34fa93a 100644 --- a/sys/dev/wscons/wsmouse.c +++ b/sys/dev/wscons/wsmouse.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wsmouse.c,v 1.45 2018/05/07 21:58:42 bru Exp $ */ +/* $OpenBSD: wsmouse.c,v 1.46 2018/11/10 14:27:51 bru Exp $ */ /* $NetBSD: wsmouse.c,v 1.35 2005/02/27 00:27:52 perry Exp $ */ /* @@ -625,7 +625,10 @@ set_x(struct position *pos, int x, u_int *sync, u_int mask) } if ((pos->dx = x - pos->x)) { pos->x = x; - pos->acc_dx += pos->dx; + if (pos->dx > 0 == pos->acc_dx > 0) + pos->acc_dx += pos->dx; + else + pos->acc_dx = pos->dx; *sync |= mask; } } @@ -641,7 +644,10 @@ set_y(struct position *pos, int y, u_int *sync, u_int mask) } if ((pos->dy = y - pos->y)) { pos->y = y; - pos->acc_dy += pos->dy; + if (pos->dy > 0 == pos->acc_dy > 0) + pos->acc_dy += pos->dy; + else + pos->acc_dy = pos->dy; *sync |= mask; } } @@ -704,7 +710,6 @@ wsmouse_mtstate(struct device *sc, int slot, int x, int y, int pressure) struct mt_state *mt = &input->mt; struct mt_slot *mts; u_int bit; - int initial; if (slot < 0 || slot >= mt->num_slots) return; @@ -712,24 +717,17 @@ wsmouse_mtstate(struct device *sc, int slot, int x, int y, int pressure) bit = (1 << slot); mt->frame |= bit; - /* Is this a new touch? */ - initial = ((mt->touches & bit) == (mt->sync[MTS_TOUCH] & bit)); - mts = &mt->slots[slot]; - if (initial) { - mts->pos.x = x; - mts->pos.y = y; + set_x(&mts->pos, x, mt->sync + MTS_X, bit); + set_y(&mts->pos, y, mt->sync + MTS_Y, bit); + + /* Is this a new touch? */ + if ((mt->touches & bit) == (mt->sync[MTS_TOUCH] & bit)) cleardeltas(&mts->pos); - mt->sync[MTS_X] |= bit; - mt->sync[MTS_Y] |= bit; - } else { - set_x(&mts->pos, x, mt->sync + MTS_X, bit); - set_y(&mts->pos, y, mt->sync + MTS_Y, bit); - } pressure = normalized_pressure(input, pressure); - if (pressure != mts->pressure || initial) { + if (pressure != mts->pressure) { mts->pressure = pressure; mt->sync[MTS_PRESSURE] |= bit; @@ -738,6 +736,9 @@ wsmouse_mtstate(struct device *sc, int slot, int x, int y, int pressure) mt->num_touches++; mt->touches |= bit; mt->sync[MTS_TOUCH] |= bit; + + mt->sync[MTS_X] |= bit; + mt->sync[MTS_Y] |= bit; } } else if (mt->touches & bit) { mt->num_touches--; @@ -850,7 +851,7 @@ wsmouse_mt_update(struct wsmouseinput *input) * (pressure == 0). Clear the sync flags for touches that have * been released. */ - if (input->mt.sync[MTS_TOUCH] & ~input->mt.touches) { + if (input->mt.frame & ~input->mt.touches) { for (i = MTS_X; i < MTS_SIZE; i++) input->mt.sync[i] &= input->mt.touches; } @@ -860,18 +861,6 @@ wsmouse_mt_update(struct wsmouseinput *input) int wsmouse_hysteresis(struct wsmouseinput *input, struct position *pos) { - - if (!(input->filter.h.hysteresis && input->filter.v.hysteresis)) - return (0); - - if ((pos->dx > 0 && pos->dx > pos->acc_dx) - || (pos->dx < 0 && pos->dx < pos->acc_dx)) - pos->acc_dx = pos->dx; - - if ((pos->dy > 0 && pos->dy > pos->acc_dy) - || (pos->dy < 0 && pos->dy < pos->acc_dy)) - pos->acc_dy = pos->dy; - return (abs(pos->acc_dx) < input->filter.h.hysteresis && abs(pos->acc_dy) < input->filter.v.hysteresis); } @@ -896,6 +885,14 @@ wsmouse_ptr_ctrl(struct wsmouseinput *input) u_int updates; int select, slot; + mt->prev_ptr = mt->ptr; + + if (mt->num_touches <= 1) { + mt->ptr = mt->touches; + mt->ptr_cycle = mt->ptr; + return; + } + updates = (mt->sync[MTS_X] | mt->sync[MTS_Y]) & ~mt->sync[MTS_TOUCH]; FOREACHBIT(updates, slot) { /* @@ -907,14 +904,6 @@ wsmouse_ptr_ctrl(struct wsmouseinput *input) updates ^= (1 << slot); } - mt->prev_ptr = mt->ptr; - - if (mt->num_touches <= 1) { - mt->ptr = mt->touches; - mt->ptr_cycle = mt->ptr; - return; - } - /* * If there is no pointer-controlling slot, or if it should be * masked, select a new one. @@ -1489,8 +1478,7 @@ wsmouse_get_params(struct device *sc, params[i].value = input->filter.dclr; break; case WSMOUSECFG_STRONG_HYSTERESIS: - params[i].value = - !!(input->filter.mode & STRONG_HYSTERESIS); + params[i].value = 0; /* The feature has been removed. */ break; case WSMOUSECFG_SMOOTHING: params[i].value = @@ -1570,12 +1558,6 @@ wsmouse_set_params(struct device *sc, case WSMOUSECFG_DY_MAX: input->filter.v.dmax = val; break; - case WSMOUSECFG_STRONG_HYSTERESIS: - if (val) - input->filter.mode |= STRONG_HYSTERESIS; - else - input->filter.mode &= ~STRONG_HYSTERESIS; - break; case WSMOUSECFG_SMOOTHING: input->filter.mode &= ~SMOOTHING_MASK; input->filter.mode |= (val & SMOOTHING_MASK); diff --git a/sys/dev/wscons/wsmouseinput.h b/sys/dev/wscons/wsmouseinput.h index e4735fc970a..68231755012 100644 --- a/sys/dev/wscons/wsmouseinput.h +++ b/sys/dev/wscons/wsmouseinput.h @@ -1,4 +1,4 @@ -/* $OpenBSD: wsmouseinput.h,v 1.11 2018/05/07 21:58:42 bru Exp $ */ +/* $OpenBSD: wsmouseinput.h,v 1.12 2018/11/10 14:27:51 bru Exp $ */ /* * Copyright (c) 2015, 2016 Ulf Brosziewski @@ -167,11 +167,9 @@ struct wsmouseinput { #define LOG_INPUT (1 << 19) #define LOG_EVENTS (1 << 20) -/* filter.mode (bit 0-2: smoothing factor, bit 3: hysteresis type) */ -#define WEAK_HYSTERESIS 0 -#define STRONG_HYSTERESIS (1 << 3) +/* filter.mode (bit 0-2: smoothing factor, bit 3-n: unused) */ #define SMOOTHING_MASK 7 -#define FILTER_MODE_DEFAULT WEAK_HYSTERESIS +#define FILTER_MODE_DEFAULT 0 struct evq_access { struct wseventvar *evar; diff --git a/sys/dev/wscons/wstpad.c b/sys/dev/wscons/wstpad.c index d4c9cb474d8..9ed1887b400 100644 --- a/sys/dev/wscons/wstpad.c +++ b/sys/dev/wscons/wstpad.c @@ -1,4 +1,4 @@ -/* $OpenBSD: wstpad.c,v 1.18 2018/11/05 23:38:04 bru Exp $ */ +/* $OpenBSD: wstpad.c,v 1.19 2018/11/10 14:27:51 bru Exp $ */ /* * Copyright (c) 2015, 2016 Ulf Brosziewski @@ -1219,33 +1219,6 @@ wstpad_decelerate(struct wsmouseinput *input, int *dx, int *dy) return (0); } -/* - * The hysteresis filter may suppress noise and accidental pointer - * movements. The "strong" variant applies independently to the axes, - * and it is applied continuously. It takes effect whenever the - * orientation on an axis changes, which makes pointer paths more stable. - * - * The default variant, wsmouse_hysteresis, is more precise and does not - * affect paths, it just filters noise when a touch starts or is resting. - */ -static inline void -strong_hysteresis(int *delta, int *acc, int threshold) -{ - int d; - - if (*delta > 0) { - if (*delta > *acc) - *acc = *delta; - if ((d = *acc - threshold) < *delta) - *delta = (d < 0 ? 0 : d); - } else if (*delta < 0) { - if (*delta < *acc) - *acc = *delta; - if ((d = *acc + threshold) > *delta) - *delta = (d > 0 ? 0 : d); - } -} - void wstpad_filter(struct wsmouseinput *input) { @@ -1263,12 +1236,8 @@ wstpad_filter(struct wsmouseinput *input) dx = pos->dx; dy = pos->dy; - if (input->filter.mode & STRONG_HYSTERESIS) { - strong_hysteresis(&dx, &pos->acc_dx, h->hysteresis); - strong_hysteresis(&dy, &pos->acc_dy, v->hysteresis); - } else if (wsmouse_hysteresis(input, pos)) { + if (wsmouse_hysteresis(input, pos)) dx = dy = 0; - } if (input->filter.dclr && wstpad_decelerate(input, &dx, &dy)) /* Strong smoothing may hamper the precision at low speeds. */ |