summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2008-08-06 15:57:12 +0930
committerPeter Hutterer <peter.hutterer@who-t.net>2008-08-06 16:03:20 +0930
commitf04b27861983212bb6b216c589aa7b0b24256f63 (patch)
treebe832d4d5314b4daeac505dbce7b61747e3d3ead
parent89b1add387b52ef55f5a8f87603153d27207e2f6 (diff)
Use axis ranges reported by the hardware, if possible.
The evdev kernel module provides the ability to query the axis ranges from the device. If they are given, use those as defaults instead of the hardcoded ones. User-specified ranges overrule any ranges reported.
-rw-r--r--src/eventcomm.c36
-rw-r--r--src/synaptics.c18
2 files changed, 49 insertions, 5 deletions
diff --git a/src/eventcomm.c b/src/eventcomm.c
index e654102..3d3e6cf 100644
--- a/src/eventcomm.c
+++ b/src/eventcomm.c
@@ -106,6 +106,37 @@ event_query_is_touchpad(int fd)
return TRUE;
}
+/* Query device for axis ranges and store outcome in the default parameter. */
+static void
+event_query_axis_ranges(int fd, LocalDevicePtr local)
+{
+ SynapticsSHM *pars = &((SynapticsPrivate *)local->private)->synpara_default;
+ struct input_absinfo abs;
+ int rc;
+
+ SYSCALL(rc = ioctl(fd, EVIOCGABS(ABS_X), &abs));
+ if (rc == 0)
+ {
+ xf86Msg(X_INFO, "%s: x-axis range %d - %d\n", local->name,
+ abs.minimum, abs.maximum);
+ pars->left_edge = abs.minimum;
+ pars->right_edge = abs.maximum;
+ } else
+ xf86Msg(X_ERROR, "%s: failed to query axis range (%s)\n", local->name,
+ strerror(errno));
+
+ SYSCALL(rc = ioctl(fd, EVIOCGABS(ABS_Y), &abs));
+ if (rc == 0)
+ {
+ xf86Msg(X_INFO, "%s: y-axis range %d - %d\n", local->name,
+ abs.minimum, abs.maximum);
+ pars->top_edge = abs.minimum;
+ pars->bottom_edge = abs.maximum;
+ } else
+ xf86Msg(X_ERROR, "%s: failed to query axis range (%s)\n", local->name,
+ strerror(errno));
+}
+
static Bool
EventQueryHardware(LocalDevicePtr local, struct SynapticsHwInfo *synhw)
{
@@ -297,13 +328,16 @@ EventAutoDevProbe(LocalDevicePtr local)
noent_cnt = 0;
have_evdev = TRUE;
is_touchpad = event_query_is_touchpad(fd);
- SYSCALL(close(fd));
if (is_touchpad) {
xf86Msg(X_PROBED, "%s auto-dev sets device to %s\n",
local->name, fname);
xf86ReplaceStrOption(local->options, "Device", fname);
+
+ event_query_axis_ranges(fd, local);
+ SYSCALL(close(fd));
return TRUE;
}
+ SYSCALL(close(fd));
}
ErrorF("%s no synaptics event device found (checked %d nodes)\n",
local->name, i + 1);
diff --git a/src/synaptics.c b/src/synaptics.c
index c493a57..0a2fcdf 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -336,6 +336,14 @@ SynapticsPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
xf86OptionListReport(opts);
+ /* set hard-coded axis ranges before querying the device.
+ * These defaults are overwritten with the ones provided by the device
+ * during SetDeviceAndProtocol (if applicable). */
+ priv->synpara_default.left_edge = 1900;
+ priv->synpara_default.right_edge = 5400;
+ priv->synpara_default.top_edge = 1900;
+ priv->synpara_default.bottom_edge = 4000;
+
SetDeviceAndProtocol(local);
/* open the touchpad device */
@@ -362,10 +370,12 @@ SynapticsPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
/* read the parameters */
pars = &priv->synpara_default;
pars->version = (PACKAGE_VERSION_MAJOR*10000+PACKAGE_VERSION_MINOR*100+PACKAGE_VERSION_PATCHLEVEL);
- pars->left_edge = xf86SetIntOption(opts, "LeftEdge", 1900);
- pars->right_edge = xf86SetIntOption(opts, "RightEdge", 5400);
- pars->top_edge = xf86SetIntOption(opts, "TopEdge", 1900);
- pars->bottom_edge = xf86SetIntOption(opts, "BottomEdge", 4000);
+ /* pars->xyz_edge contains defaults or values reported by hardware*/
+ pars->left_edge = xf86SetIntOption(opts, "LeftEdge", pars->left_edge);
+ pars->right_edge = xf86SetIntOption(opts, "RightEdge", pars->right_edge);
+ pars->top_edge = xf86SetIntOption(opts, "TopEdge", pars->top_edge);
+ pars->bottom_edge = xf86SetIntOption(opts, "BottomEdge", pars->bottom_edge);
+
pars->finger_low = xf86SetIntOption(opts, "FingerLow", 25);
pars->finger_high = xf86SetIntOption(opts, "FingerHigh", 30);
pars->finger_press = xf86SetIntOption(opts, "FingerPress", 256);