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;