summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2009-04-23 09:15:04 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2009-05-05 09:12:07 +1000
commitc50dba0b04f2115a5d23ed4a785c101f9b26900b (patch)
treef83dfdedfa5fbcf4eb52d0ef48a6f16a9bdb0622
parentfba24019ffdcf4da8938a3ad61b2f38e40626858 (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.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 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_ */