Module Name: src Committed By: nia Date: Tue Sep 28 06:16:13 UTC 2021
Modified Files: src/sys/dev/pckbport: synaptics.c Log Message: synaptics: use the new WSCONS_EVENT_(H|V)SCROLL event types to implement two-finger scrolling. remove non-functional code for detecting reported finger width. To generate a diff of this commit: cvs rdiff -u -r1.71 -r1.72 src/sys/dev/pckbport/synaptics.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pckbport/synaptics.c diff -u src/sys/dev/pckbport/synaptics.c:1.71 src/sys/dev/pckbport/synaptics.c:1.72 --- src/sys/dev/pckbport/synaptics.c:1.71 Sun May 30 13:20:01 2021 +++ src/sys/dev/pckbport/synaptics.c Tue Sep 28 06:16:13 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: synaptics.c,v 1.71 2021/05/30 13:20:01 riastradh Exp $ */ +/* $NetBSD: synaptics.c,v 1.72 2021/09/28 06:16:13 nia Exp $ */ /* * Copyright (c) 2005, Steve C. Woodford @@ -48,7 +48,7 @@ #include "opt_pms.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: synaptics.c,v 1.71 2021/05/30 13:20:01 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: synaptics.c,v 1.72 2021/09/28 06:16:13 nia Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -120,9 +120,6 @@ static int synaptics_max_speed_x = 32; static int synaptics_max_speed_y = 32; static int synaptics_max_speed_z = 2; static int synaptics_movement_threshold = 4; -static int synaptics_fscroll_min = 13; -static int synaptics_fscroll_max = 14; -static int synaptics_dz_hold = 30; static int synaptics_movement_enable = 1; static bool synaptics_aux_mid_button_scroll = TRUE; static int synaptics_debug = 0; @@ -159,9 +156,6 @@ static int synaptics_max_speed_x_nodenum static int synaptics_max_speed_y_nodenum; static int synaptics_max_speed_z_nodenum; static int synaptics_movement_threshold_nodenum; -static int synaptics_finger_scroll_min_nodenum; -static int synaptics_finger_scroll_max_nodenum; -static int synaptics_dz_hold_nodenum; static int synaptics_movement_enable_nodenum; static int synaptics_aux_mid_button_scroll_nodenum; @@ -503,7 +497,6 @@ pms_synaptics_enable(void *vsc) sc->gesture_tap_packet = 0; sc->gesture_type = 0; sc->gesture_buttons = 0; - sc->dz_hold = 0; for (i = 0; i < SYN_MAX_FINGERS; i++) { sc->rem_x[i] = sc->rem_y[i] = sc->rem_z[i] = 0; sc->movement_history[i] = 0; @@ -809,42 +802,6 @@ pms_sysctl_synaptics(struct sysctllog ** if ((rc = sysctl_createv(clog, 0, NULL, &node, CTLFLAG_PERMANENT | CTLFLAG_READWRITE, - CTLTYPE_INT, "finger_scroll-min", - SYSCTL_DESCR("Minimum width at which y cursor movements will be converted to scroll wheel events"), - pms_sysctl_synaptics_verify, 0, - &synaptics_fscroll_min, - 0, CTL_HW, root_num, CTL_CREATE, - CTL_EOL)) != 0) - goto err; - - synaptics_finger_scroll_min_nodenum = node->sysctl_num; - - if ((rc = sysctl_createv(clog, 0, NULL, &node, - CTLFLAG_PERMANENT | CTLFLAG_READWRITE, - CTLTYPE_INT, "finger_scroll-max", - SYSCTL_DESCR("Maximum width at which y cursor movements will be converted to scroll wheel events"), - pms_sysctl_synaptics_verify, 0, - &synaptics_fscroll_max, - 0, CTL_HW, root_num, CTL_CREATE, - CTL_EOL)) != 0) - goto err; - - synaptics_finger_scroll_max_nodenum = node->sysctl_num; - - if ((rc = sysctl_createv(clog, 0, NULL, &node, - CTLFLAG_PERMANENT | CTLFLAG_READWRITE, - CTLTYPE_INT, "finger_scroll-hysteresis", - SYSCTL_DESCR("Number of packets to keep reporting y cursor movements as scroll wheel events"), - pms_sysctl_synaptics_verify, 0, - &synaptics_dz_hold, - 0, CTL_HW, root_num, CTL_CREATE, - CTL_EOL)) != 0) - goto err; - - synaptics_dz_hold_nodenum = node->sysctl_num; - - if ((rc = sysctl_createv(clog, 0, NULL, &node, - CTLFLAG_PERMANENT | CTLFLAG_READWRITE, CTLTYPE_BOOL, "aux_mid_button_scroll", SYSCTL_DESCR("Interpet Y-Axis movement with the middle button held as scrolling on the passthrough device (e.g. TrackPoint)"), pms_sysctl_synaptics_verify, 0, @@ -943,17 +900,6 @@ pms_sysctl_synaptics_verify(SYSCTLFN_ARG if (t < SYNAPTICS_EDGE_LEFT || t > SYNAPTICS_EDGE_RIGHT) return (EINVAL); } else - if (node.sysctl_num == synaptics_finger_scroll_min_nodenum || - node.sysctl_num == synaptics_finger_scroll_max_nodenum) { - /* make sure we avoid the "magic" widths, 4 and below - are for fingers, 15 is palm detect. */ - if ((t < 5) || (t > 14)) - return (EINVAL); - } else - if (node.sysctl_num == synaptics_dz_hold_nodenum) { - if (t < 0) - return (EINVAL); - } else if (node.sysctl_num == synaptics_movement_enable_nodenum) { if (t < 0 || t > 1) return (EINVAL); @@ -1213,20 +1159,20 @@ pms_synaptics_passthrough(struct pms_sof psc->buttons ^= changed; if (dx || dy || dz || changed) { + s = spltty(); /* - * If the middle button is held, interpret Y-axis - * movement as scrolling. + * If the middle button is held, interpret movement as + * scrolling. */ if (synaptics_aux_mid_button_scroll && dy && (psc->buttons & 0x2)) { - dz = -dy; - dx = dy = 0; + wsmouse_precision_scroll(psc->sc_wsmousedev, dx, dy); + } else { + buttons = (psc->buttons & 0x1f) | ((psc->buttons >> 5) & 0x7); + wsmouse_input(psc->sc_wsmousedev, + buttons, dx, dy, dz, 0, + WSMOUSE_INPUT_DELTA); } - buttons = (psc->buttons & 0x1f) | ((psc->buttons >> 5) & 0x7); - s = spltty(); - wsmouse_input(psc->sc_wsmousedev, - buttons, dx, dy, dz, 0, - WSMOUSE_INPUT_DELTA); splx(s); } } @@ -1650,27 +1596,19 @@ synaptics_scale(int delta, int scale, in static inline void synaptics_movement(struct synaptics_softc *sc, struct synaptics_packet *sp, - int finger, int scroll_emul, int *dxp, int *dyp, int *dzp) + int finger, int *dxp, int *dyp, int *dzp) { int dx, dy, dz, edge; dx = dy = dz = 0; /* - * Compute the next values of dx and dy and dz. If scroll_emul - * is non-zero, take the dy and used it as use it as dz so we - * can emulate a scroll wheel. + * Compute the next values of dx and dy and dz. */ - if (scroll_emul == 0) { - dx = synaptics_filter_policy(sc, finger, sc->history_x[finger], - sp->sp_x); - dy = synaptics_filter_policy(sc, finger, sc->history_y[finger], - sp->sp_y); - } else { - dz = synaptics_filter_policy(sc, finger, sc->history_z[finger], - sp->sp_y); - dx = dy = 0; - } + dx = synaptics_filter_policy(sc, finger, sc->history_x[finger], + sp->sp_x); + dy = synaptics_filter_policy(sc, finger, sc->history_y[finger], + sp->sp_y); /* * If we're dealing with a drag gesture, and the finger moves to @@ -1720,7 +1658,7 @@ pms_synaptics_process_packet(struct pms_ struct synaptics_softc *sc = &psc->u.synaptics; int dx, dy, dz; int fingers, palm, buttons, changed; - int s, z_emul; + int s; /* * Do Z-axis emulation using up/down buttons if required. @@ -1781,20 +1719,21 @@ pms_synaptics_process_packet(struct pms_ */ if (palm == 0 && synaptics_movement_enable) { if (fingers == 1) { - z_emul = 0; - - if ((sp->sp_w >= synaptics_fscroll_min) && - (sp->sp_w <= synaptics_fscroll_max)) { - z_emul = 1; - sc->dz_hold = synaptics_dz_hold; - } - - if (sc->dz_hold > 0) { - z_emul = 1; - } - + /* + * Single finger - normal movement. + */ + synaptics_movement(sc, sp, sp->sp_finger, + &dx, &dy, &dz); + } else if (fingers == 2 && sc->gesture_type == 0) { + /* + * Multiple finger movement. Interpret it as scrolling. + */ synaptics_movement(sc, sp, sp->sp_finger, - z_emul, &dx, &dy, &dz); + &dx, &dy, &dz); + s = spltty(); + wsmouse_precision_scroll(psc->sc_wsmousedev, dx, dy); + splx(s); + return; } else { /* * No valid finger. Therefore no movement. @@ -1812,9 +1751,6 @@ pms_synaptics_process_packet(struct pms_ dx = dy = dz = 0; } - if (sc->dz_hold > 0) - sc->dz_hold--; - /* * Pass the final results up to wsmouse_input() if necessary. */