Module Name:    xsrc
Committed By:   jmcneill
Date:           Sat Dec  4 15:21:55 UTC 2021

Modified Files:
        xsrc/external/mit/xf86-input-ws/dist/src: ws.c ws.h

Log Message:
Assume WSMOUSE_TYPE_TPANEL if calibration data is present and the device
is in raw mode. The WSMOUSEIO_GTYPE ioctl may not return the correct type
on a wsmux if there is a mix of absolute and relative pointers attached.

Reverts "xf86-input-ws: Port auto-calibration bits from xf86-input-mouse".

Suggested by uwe@


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 xsrc/external/mit/xf86-input-ws/dist/src/ws.c
cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/xf86-input-ws/dist/src/ws.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: xsrc/external/mit/xf86-input-ws/dist/src/ws.c
diff -u xsrc/external/mit/xf86-input-ws/dist/src/ws.c:1.15 xsrc/external/mit/xf86-input-ws/dist/src/ws.c:1.16
--- xsrc/external/mit/xf86-input-ws/dist/src/ws.c:1.15	Sun Nov 21 21:52:59 2021
+++ xsrc/external/mit/xf86-input-ws/dist/src/ws.c	Sat Dec  4 15:21:55 2021
@@ -219,10 +219,6 @@ wsPreInit12(InputDriverPtr drv, InputInf
 		buttons_from = X_CONFIG;
 	}
 
-	priv->autoCalibrate = xf86SetBoolOption(pInfo->options, "AutoCalibrate", TRUE);
-	xf86Msg(X_CONFIG, "%s: auto calibration %sabled\n",
-	    pInfo->name, priv->autoCalibrate ? "en" : "dis"); 
-
 	priv->screen_no = xf86SetIntOption(pInfo->options, "ScreenNo", 0);
 	xf86Msg(X_CONFIG, "%s associated screen: %d\n",
 	    pInfo->name, priv->screen_no);
@@ -302,6 +298,18 @@ wsPreInit12(InputDriverPtr drv, InputInf
 		pInfo->type_name = XI_TOUCHSCREEN;
 	}
 
+	/*
+	 * Force TPANEL type for muxes have have calibration data. A mux
+	 * may have a mix of absolute and relative positioning devices,
+	 * and we need to ensure that the xinput layer translates raw
+	 * absolute position events for us.
+	 */
+	if (priv->raw && priv->type != WSMOUSE_TYPE_TPANEL) {
+		xf86Msg(X_INFO, "%s detected calibration data in raw mode, "
+		    "using touch panel mode\n", pInfo->name);
+		priv->type = WSMOUSE_TYPE_TPANEL;
+	}
+
 	if (priv->raw) {
 		xf86Msg(X_CONFIG,
 		    "%s device will work in raw mode\n",
@@ -606,45 +614,6 @@ wsDeviceOff(DeviceIntPtr pWS)
 }
 
 static void
-wsAutoCalibrate(InputInfoPtr pInfo)
-{
-	WSDevicePtr priv;
-	int width, height;
-	struct wsmouse_calibcoords cal;
-
-	priv = pInfo->private;
-	width = screenInfo.screens[priv->screen_no]->width;
-	height = screenInfo.screens[priv->screen_no]->height;
-
-	if (width != priv->lastScreenWidth ||
-	    height != priv->lastScreenHeight) {
-		if (ioctl(pInfo->fd, WSMOUSEIO_GCALIBCOORDS, &cal) == 0 &&
-		    cal.minx != cal.maxy && cal.miny != cal.maxy) {
-
-			xf86Msg(X_INFO, "%s: auto-calibrating abs pointer for %dx%d screen\n",
-			    pInfo->name, width, height);
-
-			priv->min_x = cal.minx;
-			priv->min_y = cal.miny;
-			priv->max_x = cal.maxx;
-			priv->max_y = cal.maxy;
-
-			priv->translateAbs =
-			    cal.samplelen == WSMOUSE_CALIBCOORDS_RESET;
-		}
-		priv->lastScreenWidth = width;
-		priv->lastScreenHeight = height;
-	}
-}
-
-static int
-wsTranslate(InputInfoPtr pInfo, int scrRange,
-    int rawMin, int rawMax, int rawVal)
-{
-	return ((rawVal - rawMin) * scrRange) / (rawMax - rawMin);
-}
-
-static void
 wsReadInput(InputInfoPtr pInfo)
 {
 	WSDevicePtr priv;
@@ -656,9 +625,6 @@ wsReadInput(InputInfoPtr pInfo)
 
 	priv = pInfo->private;
 
-	if (priv->autoCalibrate)
-		wsAutoCalibrate(pInfo);
-
 	XisbBlockDuration(priv->buffer, -1);
 	pBuf = (unsigned char *)eventList;
 	n = 0;
@@ -704,18 +670,12 @@ wsReadInput(InputInfoPtr pInfo)
 			if (event->value == 4095) 
 				break;
 			ax = event->value;
-			if (priv->translateAbs)
-				ax = wsTranslate(pInfo, priv->lastScreenWidth,
-				    priv->min_x, priv->max_x, ax);
 			if (priv->inv_x)
 				ax = priv->max_x - ax + priv->min_x;
 			break;
 		case WSCONS_EVENT_MOUSE_ABSOLUTE_Y:
 			DBG(4, ErrorF("Absolute Y %d\n", event->value));
 			ay = event->value;
-			if (priv->translateAbs)
-				ay = wsTranslate(pInfo, priv->lastScreenHeight,
-				    priv->min_y, priv->max_y, ay);
 			if (priv->inv_y)
 				ay = priv->max_y - ay + priv->min_y;
 			break;

Index: xsrc/external/mit/xf86-input-ws/dist/src/ws.h
diff -u xsrc/external/mit/xf86-input-ws/dist/src/ws.h:1.5 xsrc/external/mit/xf86-input-ws/dist/src/ws.h:1.6
--- xsrc/external/mit/xf86-input-ws/dist/src/ws.h:1.5	Fri Oct  8 23:30:17 2021
+++ xsrc/external/mit/xf86-input-ws/dist/src/ws.h	Sat Dec  4 15:21:55 2021
@@ -47,9 +47,6 @@ typedef struct WSDevice {
 	int screen_no;
 	int num, den, threshold; /* relative accel params */
 	pointer buffer;
-	int autoCalibrate;
-	int translateAbs;
-	int lastScreenWidth, lastScreenHeight;
 	int negativeZ, positiveZ; /* mappings for Z axis */
 	int negativeW, positiveW; /* mappings for W axis */
 	struct wsmouse_calibcoords coords; /* mirror of the kernel values */

Reply via email to