diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2009-04-23 09:15:04 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-05-05 09:12:07 +1000 |
commit | c50dba0b04f2115a5d23ed4a785c101f9b26900b (patch) | |
tree | f83dfdedfa5fbcf4eb52d0ef48a6f16a9bdb0622 | |
parent | fba24019ffdcf4da8938a3ad61b2f38e40626858 (diff) |
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 <http://bugs.freedesktop.org/show_bug.cgi?id=21214>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Christoph Brill <egore911@egore911.de>
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
-rw-r--r-- | src/eventcomm.c | 19 | ||||
-rw-r--r-- | src/synaptics.c | 20 | ||||
-rw-r--r-- | 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_ */ |