[PATCH synaptics] Add property support for secondary (top) software buttons
Hans de Goede
hdegoede at redhat.com
Mon Mar 10 01:27:56 PDT 2014
Hi,
On 03/10/2014 12:51 AM, Peter Hutterer wrote:
> This was originally intended as a xorg.conf option only (and still largely
> is seen as such). Secondary software button are required only on a specific
> series of touchpads and should be pre-configured by the system and/or the
> distribution. As such, the property will only be initialized and respond to
> run-time changes if first set in in the xorg.conf.
>
> Exposing the property in this way gives clients a chance of detecting if a top
> software button area is present and thus adjust their behaviour accordingly.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Looks good:
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> include/synaptics-properties.h | 3 +++
> man/synaptics.man | 3 ++-
> src/properties.c | 48 +++++++++++++++++++++++++++++++++---------
> src/synaptics.c | 16 --------------
> src/synapticsstr.h | 16 ++++++++++++++
> 5 files changed, 59 insertions(+), 27 deletions(-)
>
> diff --git a/include/synaptics-properties.h b/include/synaptics-properties.h
> index 19bd2b2..32ab2e1 100644
> --- a/include/synaptics-properties.h
> +++ b/include/synaptics-properties.h
> @@ -152,6 +152,9 @@
> /* 32 bit, 4 values, left, right, top, buttom */
> #define SYNAPTICS_PROP_SOFTBUTTON_AREAS "Synaptics Soft Button Areas"
>
> +/* 32 bit, 4 values, left, right, top, buttom */
> +#define SYNAPTICS_PROP_SECONDARY_SOFTBUTTON_AREAS "Synaptics Secondary Soft Button Areas"
> +
> /* 32 Bit Integer, 2 values, horizontal hysteresis, vertical hysteresis */
> #define SYNAPTICS_PROP_NOISE_CANCELLATION "Synaptics Noise Cancellation"
>
> diff --git a/man/synaptics.man b/man/synaptics.man
> index e5af098..499fbe8 100644
> --- a/man/synaptics.man
> +++ b/man/synaptics.man
> @@ -499,7 +499,8 @@ For the allowed values for this option, see
> .B Option \*qSoftButtonAreas\*q.
> Primary and secondary soft button areas must not overlap each other. If they do,
> the behavior of the driver is undefined.
> -No property associated, this option must be set in the
> +Property: "Synaptics Secondary Soft Button Areas". This property is only
> +initialized if the option is set in the
> __xconfigfile__(__filemansuffix__).
> .
>
> diff --git a/src/properties.c b/src/properties.c
> index d4fd3cb..525649c 100644
> --- a/src/properties.c
> +++ b/src/properties.c
> @@ -91,6 +91,7 @@ Atom prop_capabilities = 0;
> Atom prop_resolution = 0;
> Atom prop_area = 0;
> Atom prop_softbutton_areas = 0;
> +Atom prop_secondary_softbutton_areas = 0;
> Atom prop_noise_cancellation = 0;
> Atom prop_product_id = 0;
> Atom prop_device_node = 0;
> @@ -164,16 +165,30 @@ InitSoftButtonProperty(InputInfoPtr pInfo)
> 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];
> + values[0] = para->softbutton_areas[BOTTOM_RIGHT_BUTTON_AREA][LEFT];
> + values[1] = para->softbutton_areas[BOTTOM_RIGHT_BUTTON_AREA][RIGHT];
> + values[2] = para->softbutton_areas[BOTTOM_RIGHT_BUTTON_AREA][TOP];
> + values[3] = para->softbutton_areas[BOTTOM_RIGHT_BUTTON_AREA][BOTTOM];
> + values[4] = para->softbutton_areas[BOTTOM_MIDDLE_BUTTON_AREA][LEFT];
> + values[5] = para->softbutton_areas[BOTTOM_MIDDLE_BUTTON_AREA][RIGHT];
> + values[6] = para->softbutton_areas[BOTTOM_MIDDLE_BUTTON_AREA][TOP];
> + values[7] = para->softbutton_areas[BOTTOM_MIDDLE_BUTTON_AREA][BOTTOM];
> prop_softbutton_areas =
> InitAtom(pInfo->dev, SYNAPTICS_PROP_SOFTBUTTON_AREAS, 32, 8, values);
> +
> + values[0] = para->softbutton_areas[TOP_RIGHT_BUTTON_AREA][LEFT];
> + values[1] = para->softbutton_areas[TOP_RIGHT_BUTTON_AREA][RIGHT];
> + values[2] = para->softbutton_areas[TOP_RIGHT_BUTTON_AREA][TOP];
> + values[3] = para->softbutton_areas[TOP_RIGHT_BUTTON_AREA][BOTTOM];
> + values[4] = para->softbutton_areas[TOP_MIDDLE_BUTTON_AREA][LEFT];
> + values[5] = para->softbutton_areas[TOP_MIDDLE_BUTTON_AREA][RIGHT];
> + values[6] = para->softbutton_areas[TOP_MIDDLE_BUTTON_AREA][TOP];
> + values[7] = para->softbutton_areas[TOP_MIDDLE_BUTTON_AREA][BOTTOM];
> +
> + if (values[0] || values[1] || values[2] || values[4] ||
> + values[5] || values[6] || values[7])
> + prop_secondary_softbutton_areas =
> + InitAtom(pInfo->dev, SYNAPTICS_PROP_SECONDARY_SOFTBUTTON_AREAS, 32, 8, values);
> }
>
> void
> @@ -768,8 +783,21 @@ SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
> if (!SynapticsIsSoftButtonAreasValid(areas))
> return BadValue;
>
> - memcpy(para->softbutton_areas[0], areas, 4 * sizeof(int));
> - memcpy(para->softbutton_areas[1], areas + 4, 4 * sizeof(int));
> + memcpy(para->softbutton_areas[BOTTOM_RIGHT_BUTTON_AREA], areas, 4 * sizeof(int));
> + memcpy(para->softbutton_areas[BOTTOM_MIDDLE_BUTTON_AREA], areas + 4, 4 * sizeof(int));
> + }
> + else if (property == prop_secondary_softbutton_areas) {
> + int *areas;
> +
> + if (prop->size != 8 || prop->format != 32 || prop->type != XA_INTEGER)
> + return BadMatch;
> +
> + areas = (int *) prop->data;
> + if (!SynapticsIsSoftButtonAreasValid(areas))
> + return BadValue;
> +
> + memcpy(para->softbutton_areas[TOP_RIGHT_BUTTON_AREA], areas, 4 * sizeof(int));
> + memcpy(para->softbutton_areas[TOP_MIDDLE_BUTTON_AREA], areas + 4, 4 * sizeof(int));
> }
> else if (property == prop_noise_cancellation) {
> INT32 *hyst;
> diff --git a/src/synaptics.c b/src/synaptics.c
> index f778d39..c819982 100644
> --- a/src/synaptics.c
> +++ b/src/synaptics.c
> @@ -89,22 +89,6 @@ enum EdgeType {
> LEFT_TOP_EDGE = TOP_EDGE | LEFT_EDGE
> };
>
> -enum SoftButtonAreas {
> - BOTTOM_BUTTON_AREA = 0,
> - BOTTOM_RIGHT_BUTTON_AREA = 0,
> - BOTTOM_MIDDLE_BUTTON_AREA = 1,
> - TOP_BUTTON_AREA = 2,
> - TOP_RIGHT_BUTTON_AREA = 2,
> - TOP_MIDDLE_BUTTON_AREA = 3
> -};
> -
> -enum SoftButtonAreaEdges {
> - LEFT = 0,
> - RIGHT = 1,
> - TOP = 2,
> - BOTTOM = 3
> -};
> -
> /*
> * We expect to be receiving a steady 80 packets/sec (which gives 40
> * reports/sec with more than one finger on the pad, as Advanced Gesture Mode
> diff --git a/src/synapticsstr.h b/src/synapticsstr.h
> index 72140c3..955c0f2 100644
> --- a/src/synapticsstr.h
> +++ b/src/synapticsstr.h
> @@ -150,6 +150,22 @@ enum TouchpadModel {
> MODEL_UNIBODY_MACBOOK
> };
>
> +enum SoftButtonAreas {
> + BOTTOM_BUTTON_AREA = 0,
> + BOTTOM_RIGHT_BUTTON_AREA = 0,
> + BOTTOM_MIDDLE_BUTTON_AREA = 1,
> + TOP_BUTTON_AREA = 2,
> + TOP_RIGHT_BUTTON_AREA = 2,
> + TOP_MIDDLE_BUTTON_AREA = 3
> +};
> +
> +enum SoftButtonAreaEdges {
> + LEFT = 0,
> + RIGHT = 1,
> + TOP = 2,
> + BOTTOM = 3
> +};
> +
> typedef struct _SynapticsParameters {
> /* Parameter data */
> int left_edge, right_edge, top_edge, bottom_edge; /* edge coordinates absolute */
>
More information about the xorg-devel
mailing list