[PATCH synaptics v5 18/18] Soft buttons are only available on clickpad devices, disable them otherwise.

Peter Hutterer peter.hutterer at who-t.net
Mon Mar 12 23:37:45 PDT 2012


If the clickpad support is runtime enabled/disabled, the property
appears/disappears accordingly.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 man/synaptics.man |    2 ++
 src/properties.c  |   40 +++++++++++++++++++++++++++++++---------
 src/synaptics.c   |    3 +++
 3 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/man/synaptics.man b/man/synaptics.man
index aaec35f..23862e3 100644
--- a/man/synaptics.man
+++ b/man/synaptics.man
@@ -520,6 +520,7 @@ the total height of the touchpad. Property: "Synaptics Area"
 .
 .TP
 .BI "Option \*qSoftButtonAreas\*q \*q" "RBL RBR RBT RBB MBL MBR MBT MBB" \*q
+This option is only available on ClickPad devices.
 Enable soft button click area support on ClickPad devices. The first four
 parameters define the area of the right button, and the second four parameters
 define the area of the middle button. The areas are defined by the left, right,
@@ -942,6 +943,7 @@ default.
 
 .TP 7
 .BI "Synaptics Soft Button Areas"
+This property is only available on ClickPad devices.
 The Right and middle soft button areas are used to support right and middle
 click actions on a ClickPad device. Providing 0 for all values of a given button
 disables the button area.
diff --git a/src/properties.c b/src/properties.c
index 5cd3088..783b516 100644
--- a/src/properties.c
+++ b/src/properties.c
@@ -151,6 +151,24 @@ InitFloatAtom(DeviceIntPtr dev, char *name, int nvalues, float *values)
     return atom;
 }
 
+static void
+InitSoftButtonProperty(InputInfoPtr pInfo)
+{
+    SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private;
+    SynapticsParameters *para = &priv->synpara;
+    int values[8];
+
+    values[0] = para->softbutton_areas[0][0];
+    values[1] = para->softbutton_areas[0][1];
+    values[2] = para->softbutton_areas[0][2];
+    values[3] = para->softbutton_areas[0][3];
+    values[4] = para->softbutton_areas[1][0];
+    values[5] = para->softbutton_areas[1][1];
+    values[6] = para->softbutton_areas[1][2];
+    values[7] = para->softbutton_areas[1][3];
+    prop_softbutton_areas = InitAtom(pInfo->dev, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 8, values);
+}
+
 void
 InitDeviceProperties(InputInfoPtr pInfo)
 {
@@ -301,15 +319,8 @@ InitDeviceProperties(InputInfoPtr pInfo)
     values[3] = para->area_bottom_edge;
     prop_area = InitAtom(pInfo->dev, SYNAPTICS_PROP_AREA, 32, 4, values);
 
-    values[0] = para->softbutton_areas[0][0];
-    values[1] = para->softbutton_areas[0][1];
-    values[2] = para->softbutton_areas[0][2];
-    values[3] = para->softbutton_areas[0][3];
-    values[4] = para->softbutton_areas[1][0];
-    values[5] = para->softbutton_areas[1][1];
-    values[6] = para->softbutton_areas[1][2];
-    values[7] = para->softbutton_areas[1][3];
-    prop_softbutton_areas = InitAtom(pInfo->dev, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 8, values);
+    if (para->clickpad)
+        InitSoftButtonProperty(pInfo);
 
     values[0] = para->hyst_x;
     values[1] = para->hyst_y;
@@ -407,9 +418,20 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
         para->tap_time_2         = timeouts[1];
         para->click_time         = timeouts[2];
     } else if (property == prop_clickpad) {
+        BOOL value;
+
         if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER)
             return BadMatch;
 
+        value = *(BOOL*)prop->data;
+        if (!para->clickpad && value && !prop_softbutton_areas)
+            InitSoftButtonProperty(pInfo);
+        else if (para->clickpad && !value && prop_softbutton_areas)
+        {
+            XIDeleteDeviceProperty(dev, prop_softbutton_areas, FALSE);
+            prop_softbutton_areas = 0;
+        }
+
         para->clickpad = *(BOOL*)prop->data;
     } else if (property == prop_tap_fast)
     {
diff --git a/src/synaptics.c b/src/synaptics.c
index 4275d2a..898130e 100644
--- a/src/synaptics.c
+++ b/src/synaptics.c
@@ -516,6 +516,9 @@ static void set_softbutton_areas_option(InputInfoPtr pInfo)
     char *end_str;
     int i;
 
+    if (!pars->clickpad)
+        return;
+
     option_string = xf86CheckStrOption(pInfo->options, "SoftButtonAreas", NULL);
     if (!option_string)
         return;
-- 
1.7.7.6



More information about the xorg-devel mailing list