diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2008-08-06 15:57:12 +0930 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2008-08-06 16:03:20 +0930 |
commit | f04b27861983212bb6b216c589aa7b0b24256f63 (patch) | |
tree | be832d4d5314b4daeac505dbce7b61747e3d3ead | |
parent | 89b1add387b52ef55f5a8f87603153d27207e2f6 (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.c | 36 | ||||
-rw-r--r-- | src/synaptics.c | 18 |
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); |