From c50dba0b04f2115a5d23ed4a785c101f9b26900b Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 23 Apr 2009 09:15:04 +1000 Subject: Add TouchpadModel specifier and scale the edges accordingly. (#21214) ALPS models need different edge settings than synaptics pads to make the edges work propertly. So try to auto-detect the model (eventcomm anyway) and set the edges accordingly. New edge defaults are: synaptics: 7% of the total width alps: 15% of the total width unknown: 4% of the total width (see Synaptics UI guide) X.Org Bug 21214 Signed-off-by: Peter Hutterer Signed-off-by: Christoph Brill Signed-off-by: Henrik Rydberg --- src/eventcomm.c | 19 +++++++++++++++++++ src/synaptics.c | 20 +++++++++++++++++--- src/synapticsstr.h | 8 ++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/eventcomm.c b/src/eventcomm.c index 5f712c4..a1c3aa2 100644 --- a/src/eventcomm.c +++ b/src/eventcomm.c @@ -110,6 +110,24 @@ event_query_is_touchpad(int fd) return TRUE; } +static void +event_query_info(LocalDevicePtr local) +{ + SynapticsPrivate *priv = (SynapticsPrivate *)local->private; + short id[4]; + int rc; + + SYSCALL(rc = ioctl(local->fd, EVIOCGID, id)); + if (rc < 0) + return; + + if (id[ID_VENDOR] == 0x2 && id[ID_PRODUCT] == 0x7) + priv->model = MODEL_SYNAPTICS; + else if (id[ID_VENDOR] == 0x2 && id[ID_PRODUCT] == 0x8) + priv->model = MODEL_ALPS; + +} + /* Query device for axis ranges */ static void event_query_axis_ranges(LocalDevicePtr local) @@ -355,6 +373,7 @@ EventReadDevDimensions(LocalDevicePtr local) { if (event_query_is_touchpad(local->fd)) event_query_axis_ranges(local); + event_query_info(local); } static Bool diff --git a/src/synaptics.c b/src/synaptics.c index 5127018..fc2e0b8 100644 --- a/src/synaptics.c +++ b/src/synaptics.c @@ -317,7 +317,10 @@ static void set_default_parameters(LocalDevicePtr local) /* The synaptics specs specify typical edge widths of 4% on x, and 5.4% on * y (page 7) [Synaptics TouchPad Interfacing Guide, 510-000080 - A * Second Edition, http://www.synaptics.com/support/dev_support.cfm, 8 Sep - * 2008] + * 2008]. We use 7% for both instead for synaptics devices, and 15% for + * ALPS models. + * http://bugs.freedesktop.org/show_bug.cgi?id=21214 + * * If the range was autodetected, apply these edge widths to all four * sides. */ @@ -329,8 +332,19 @@ static void set_default_parameters(LocalDevicePtr local) width = abs(priv->maxx - priv->minx); height = abs(priv->maxy - priv->miny); diag = sqrt(width * width + height * height); - ewidth = width * .04; - eheight = height * .055; + if (priv->model == MODEL_SYNAPTICS) + { + ewidth = width * .07; + eheight = height * .07; + } else if (priv->model == MODEL_ALPS) + { + ewidth = width * .15; + eheight = height * .15; + } else + { + ewidth = width * .04; + eheight = height * .04; + } l = priv->minx + ewidth; r = priv->maxx - ewidth; diff --git a/src/synapticsstr.h b/src/synapticsstr.h index 859e757..ca3d26e 100644 --- a/src/synapticsstr.h +++ b/src/synapticsstr.h @@ -79,6 +79,12 @@ enum TapButtonState { TBS_BUTTON_DOWN_UP /* Send button down event + set up state */ }; +enum TouchpadModel { + MODEL_UNKNOWN = 0, + MODEL_SYNAPTICS, + MODEL_ALPS +}; + typedef struct _SynapticsParameters { /* Parameter data */ @@ -209,6 +215,8 @@ typedef struct _SynapticsPrivateRec Bool has_double; /* double click detected for this device */ Bool has_triple; /* triple click detected for this device */ Bool has_pressure; /* device reports pressure */ + + enum TouchpadModel model; /* The detected model */ } SynapticsPrivate; #endif /* _SYNAPTICSSTR_H_ */ -- cgit v1.2.3