Module Name: xsrc
Committed By: nia
Date: Fri Oct 8 23:30:17 UTC 2021
Modified Files:
xsrc/external/mit/xf86-input-ws/dist/src: ws.c ws.h
Log Message:
xf86-input-ws: Port auto-calibration bits from xf86-input-mouse.
Needed for absolute input devices where pointer coordinates do not
match the display size.
Tested by jmcneill.
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 xsrc/external/mit/xf86-input-ws/dist/src/ws.c
cvs rdiff -u -r1.4 -r1.5 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.13 xsrc/external/mit/xf86-input-ws/dist/src/ws.c:1.14
--- xsrc/external/mit/xf86-input-ws/dist/src/ws.c:1.13 Fri Oct 1 07:14:37 2021
+++ xsrc/external/mit/xf86-input-ws/dist/src/ws.c Fri Oct 8 23:30:17 2021
@@ -219,6 +219,10 @@ 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);
@@ -602,6 +606,45 @@ 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;
@@ -613,6 +656,9 @@ wsReadInput(InputInfoPtr pInfo)
priv = pInfo->private;
+ if (priv->autoCalibrate)
+ wsAutoCalibrate(pInfo);
+
XisbBlockDuration(priv->buffer, -1);
pBuf = (unsigned char *)eventList;
n = 0;
@@ -658,12 +704,19 @@ 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->lastScreenWidth,
+ 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.4 xsrc/external/mit/xf86-input-ws/dist/src/ws.h:1.5
--- xsrc/external/mit/xf86-input-ws/dist/src/ws.h:1.4 Tue Sep 28 06:17:15 2021
+++ xsrc/external/mit/xf86-input-ws/dist/src/ws.h Fri Oct 8 23:30:17 2021
@@ -47,6 +47,9 @@ 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 */