Module Name:    src
Committed By:   nia
Date:           Sat Dec  4 14:53:56 UTC 2021

Modified Files:
        src/sys/dev/pckbport: synaptics.c

Log Message:
synaptics: Fix tracking of extended buttons.

- Ensure that packets are processed whenever any button change
  occurs, instead of just processing packets when there is movement
  or trackpad finger activity
- Only transfer the state of the "extended buttons" to the button
  masks when actual changes occur OR a button is being held down.

With this patch, my middle mouse button no longer gets "stuck down",
but proper press/release tracking and dragging behavior is preserved.

Thanks to blymn for pointers.


To generate a diff of this commit:
cvs rdiff -u -r1.74 -r1.75 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.74 src/sys/dev/pckbport/synaptics.c:1.75
--- src/sys/dev/pckbport/synaptics.c:1.74	Fri Dec  3 13:27:39 2021
+++ src/sys/dev/pckbport/synaptics.c	Sat Dec  4 14:53:56 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: synaptics.c,v 1.74 2021/12/03 13:27:39 andvar Exp $	*/
+/*	$NetBSD: synaptics.c,v 1.75 2021/12/04 14:53:56 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.74 2021/12/03 13:27:39 andvar Exp $");
+__KERNEL_RCSID(0, "$NetBSD: synaptics.c,v 1.75 2021/12/04 14:53:56 nia Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1031,6 +1031,8 @@ pms_synaptics_parse(struct pms_softc *ps
 	struct synaptics_packet nsp;
 	char new_buttons, ew_mode;
 	unsigned v, primary_finger, secondary_finger;
+	int ext_left = -1, ext_right = -1, ext_middle = -1,
+	    ext_up = -1, ext_down = -1;
 
 	sc->total_packets++;
 
@@ -1177,29 +1179,29 @@ pms_synaptics_parse(struct pms_softc *ps
 			    psc->packet[3], psc->packet[4], psc->packet[5]);
 
 			if ((psc->packet[4] & SYN_1BUTMASK) != 0)
-				sc->ext_left = PMS_LBUTMASK;
+				ext_left = PMS_LBUTMASK;
 			else
-				sc->ext_left = 0;
+				ext_left = 0;
 
 			if ((psc->packet[4] & SYN_3BUTMASK) != 0)
-				sc->ext_middle = PMS_MBUTMASK;
+				ext_middle = PMS_MBUTMASK;
 			else
-				sc->ext_middle = 0;
+				ext_middle = 0;
 
 			if ((psc->packet[5] & SYN_2BUTMASK) != 0)
-				sc->ext_right = PMS_RBUTMASK;
+				ext_right = PMS_RBUTMASK;
 			else
-				sc->ext_right = 0;
+				ext_right = 0;
 
 			if ((psc->packet[5] & SYN_4BUTMASK) != 0)
-				sc->ext_up = 1;
+				ext_up = 1;
 			else
-				sc->ext_up = 0;
+				ext_up = 0;
 
 			if ((psc->packet[4] & SYN_5BUTMASK) != 0)
-				sc->ext_down = 1;
+				ext_down = 1;
 			else
-				sc->ext_down = 0;
+				ext_down = 0;
 		} else {
 			/* Left/Right button handling. */
 			nsp.sp_left = psc->packet[0] & PMS_LBUTMASK;
@@ -1275,16 +1277,38 @@ pms_synaptics_parse(struct pms_softc *ps
 			/* Old style Middle Button. */
 			nsp.sp_middle = (psc->packet[0] & PMS_LBUTMASK) ^
 		    	    (psc->packet[3] & PMS_LBUTMASK);
-		} else if (synaptics_up_down_emul != 1) {
+		} else {
 			nsp.sp_middle = 0;
 		}
 
-		/* Overlay extended button state */
-		nsp.sp_left |= sc->ext_left;
-		nsp.sp_right |= sc->ext_right;
-		nsp.sp_middle |= sc->ext_middle;
-		nsp.sp_up |= sc->ext_up;
-		nsp.sp_down |= sc->ext_down;
+		/*
+		 * Overlay extended button state if anything changed,
+		 * preserve the state if a button is being held.
+		 */
+		if (ext_left != -1)
+			nsp.sp_left = sc->ext_left = ext_left;
+		else if (sc->ext_left != 0)
+			nsp.sp_left = sc->ext_left;
+
+		if (ext_right != -1)
+			nsp.sp_right = sc->ext_right = ext_right;
+		else if (sc->ext_right != 0)
+			nsp.sp_right = sc->ext_right;
+
+		if (ext_middle != -1)
+			nsp.sp_middle = sc->ext_middle = ext_middle;
+		else if (sc->ext_middle != 0)
+			nsp.sp_middle = sc->ext_middle;
+
+		if (ext_up != -1)
+			nsp.sp_up = sc->ext_up = ext_up;
+		else if (sc->ext_up != 0)
+			nsp.sp_up = sc->ext_up;
+
+		if (ext_down != -1)
+			nsp.sp_down = sc->ext_down = ext_down;
+		else if (sc->ext_down != 0)
+			nsp.sp_down = sc->ext_down;
 
 		switch (synaptics_up_down_emul) {
 		case 1:
@@ -1328,7 +1352,12 @@ skip_position:
 	/* If no fingers and we at least saw the primary finger
 	 * or the buttons changed then process the last packet.
 	 */
-	if (pms_synaptics_get_fingers(psc, nsp.sp_w, nsp.sp_z) == 0) {
+	if (pms_synaptics_get_fingers(psc, nsp.sp_w, nsp.sp_z) == 0 ||
+	    nsp.sp_left != packet.sp_left ||
+	    nsp.sp_right != packet.sp_right ||
+	    nsp.sp_middle != packet.sp_middle ||
+	    nsp.sp_up != packet.sp_up ||
+	    nsp.sp_down != packet.sp_down) {
 		if (nsp.sp_primary == 1) {
 			pms_synaptics_process_packet(psc, &nsp);
 			sc->packet_count[SYN_PRIMARY_FINGER] = 0;

Reply via email to