summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-05-01 13:37:44 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-05-05 10:58:29 +1000
commit2b3325dc53d1a560b94b9c88aeb05b0f7f9085cd (patch)
tree0c18d78f8c92f68f9ce8d04878981dfcb1747798
parent5456328aea1db9d869fc38d63f1e50f93d1e2dae (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> (cherry-picked from commit c50dba0b04f2115a5d23ed4a785c101f9b26900b)
-rw-r--r--src/eventcomm.c19
-rw-r--r--src/synaptics.c20
-rw-r--r--src/synapticsstr.h8
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 6b98e6e..9b89595 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_ */