From 52e72fb741f469d82c6c859e17e055d8cb77bcfa Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 1 May 2009 13:37:44 +1000 Subject: [PATCH] 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 --- 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 3e4c074..3b03695 100644 --- a/src/eventcomm.c +++ b/src/eventcomm.c @@ -115,6 +115,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) @@ -360,6 +378,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 2383c38..ee1239a 100644 --- a/src/synaptics.c +++ b/src/synaptics.c @@ -318,7 +318,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. */ @@ -330,8 +333,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 688167c..f518c11 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 _SynapticsPrivateRec { SynapticsSHM synpara_default; /* Default parameter settings, read from @@ -146,6 +152,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_ */ -- 1.6.3.rc1.1.g81c43.dirty