[PATCH synaptics] Drop touch events from the driver

Hans de Goede hdegoede at redhat.com
Wed Jun 17 01:00:39 PDT 2015


Hi,

On 17-06-15 05:14, Peter Hutterer wrote:
> This was a bad idea. No-one seems to use this and it gives us little benefits.
> To even get this feature a number of other features need to be turned off
> (like two-finger scrolling and tapping). Many of these are enabled by default,
> if they are disabled a client stack with full touchpad gesture support could
> in theory support true touchpad gestures. This has never happened.
>
> Drop the touch events from the synaptics driver. This allows us to switch the
> touchpad fully over to look like a relative device, thus also removing the
> bug that changes the touchpad speed whenever a monitor is added/removed in.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

Looks good to me:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


> ---
>   src/synaptics.c | 113 +++++---------------------------------------------------
>   1 file changed, 10 insertions(+), 103 deletions(-)
>
> diff --git a/src/synaptics.c b/src/synaptics.c
> index 955b042..550b31c 100644
> --- a/src/synaptics.c
> +++ b/src/synaptics.c
> @@ -1190,49 +1190,19 @@ DeviceInitTouch(DeviceIntPtr dev, Atom *axes_labels)
>   {
>       InputInfoPtr pInfo = dev->public.devicePrivate;
>       SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private);
> -    int i;
>
> -    if (priv->has_touch) {
> -        priv->num_slots =
> -            priv->max_touches ? priv->max_touches : SYNAPTICS_MAX_TOUCHES;
> +    if (!priv->has_touch)
> +        return;
>
> -        priv->open_slots = malloc(priv->num_slots * sizeof(int));
> -        if (!priv->open_slots) {
> -            xf86IDrvMsg(pInfo, X_ERROR,
> -                        "failed to allocate open touch slots array\n");
> -            priv->has_touch = 0;
> -            priv->num_slots = 0;
> -            return;
> -        }
> +    priv->num_slots =
> +        priv->max_touches ? priv->max_touches : SYNAPTICS_MAX_TOUCHES;
>
> -        /* x/y + whatever other MT axes we found */
> -        if (!InitTouchClassDeviceStruct(dev, priv->max_touches,
> -                                        XIDependentTouch,
> -                                        2 + priv->num_mt_axes)) {
> -            xf86IDrvMsg(pInfo, X_ERROR,
> -                        "failed to initialize touch class device\n");
> -            priv->has_touch = 0;
> -            priv->num_slots = 0;
> -            free(priv->open_slots);
> -            priv->open_slots = NULL;
> -            return;
> -        }
> -
> -        for (i = 0; i < priv->num_mt_axes; i++) {
> -            SynapticsTouchAxisRec *axis = &priv->touch_axes[i];
> -            int axnum = 4 + i;  /* Skip x, y, and scroll axes */
> -
> -            if (!xf86InitValuatorAxisStruct(dev, axnum, axes_labels[axnum],
> -                                            axis->min, axis->max, axis->res, 0,
> -                                            axis->res, Absolute)) {
> -                xf86IDrvMsg(pInfo, X_WARNING,
> -                            "failed to initialize axis %s, skipping\n",
> -                            axis->label);
> -                continue;
> -            }
> -
> -            xf86InitValuatorDefaults(dev, axnum);
> -        }
> +    priv->open_slots = malloc(priv->num_slots * sizeof(int));
> +    if (!priv->open_slots) {
> +        xf86IDrvMsg(pInfo, X_ERROR,
> +                    "failed to allocate open touch slots array\n");
> +        priv->has_touch = 0;
> +        priv->num_slots = 0;
>       }
>   }
>
> @@ -3009,18 +2979,9 @@ static void
>   HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw)
>   {
>       SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private;
> -    SynapticsParameters *para = &priv->synpara;
>       int new_active_touches = priv->num_active_touches;
> -    int min_touches = 2;
> -    Bool restart_touches = FALSE;
>       int i;
>
> -    if (para->click_action[F3_CLICK1] || para->tap_action[F3_TAP])
> -        min_touches = 4;
> -    else if (para->click_action[F2_CLICK1] || para->tap_action[F2_TAP] ||
> -             para->scroll_twofinger_vert || para->scroll_twofinger_horiz)
> -        min_touches = 3;
> -
>       /* Count new number of active touches */
>       for (i = 0; i < hw->num_mt_mask; i++) {
>           if (hw->slot_state[i] == SLOTSTATE_OPEN)
> @@ -3029,60 +2990,6 @@ HandleTouches(InputInfoPtr pInfo, struct SynapticsHwState *hw)
>               new_active_touches--;
>       }
>
> -    if (priv->has_semi_mt)
> -        goto out;
> -
> -    if (priv->num_active_touches < min_touches &&
> -        new_active_touches < min_touches) {
> -        /* We stayed below number of touches needed to send events */
> -        goto out;
> -    }
> -    else if (priv->num_active_touches >= min_touches &&
> -             new_active_touches < min_touches) {
> -        /* We are transitioning to less than the number of touches needed to
> -         * send events. End all currently open touches. */
> -        for (i = 0; i < priv->num_active_touches; i++) {
> -            int slot = priv->open_slots[i];
> -
> -            xf86PostTouchEvent(pInfo->dev, slot, XI_TouchEnd, 0,
> -                               hw->mt_mask[slot]);
> -        }
> -
> -        /* Don't send any more events */
> -        goto out;
> -    }
> -    else if (priv->num_active_touches < min_touches &&
> -             new_active_touches >= min_touches) {
> -        /* We are transitioning to more than the number of touches needed to
> -         * send events. Begin all already open touches. */
> -        restart_touches = TRUE;
> -        for (i = 0; i < priv->num_active_touches; i++) {
> -            int slot = priv->open_slots[i];
> -
> -            xf86PostTouchEvent(pInfo->dev, slot, XI_TouchBegin, 0,
> -                               hw->mt_mask[slot]);
> -        }
> -    }
> -
> -    /* Send touch begin events for all new touches */
> -    for (i = 0; i < hw->num_mt_mask; i++)
> -        if (hw->slot_state[i] == SLOTSTATE_OPEN)
> -            xf86PostTouchEvent(pInfo->dev, i, XI_TouchBegin, 0, hw->mt_mask[i]);
> -
> -    /* Send touch update/end events for all the rest */
> -    for (i = 0; i < priv->num_active_touches; i++) {
> -        int slot = priv->open_slots[i];
> -
> -        /* Don't send update event if we just reopened the touch above */
> -        if (hw->slot_state[slot] == SLOTSTATE_UPDATE && !restart_touches)
> -            xf86PostTouchEvent(pInfo->dev, slot, XI_TouchUpdate, 0,
> -                               hw->mt_mask[slot]);
> -        else if (hw->slot_state[slot] == SLOTSTATE_CLOSE)
> -            xf86PostTouchEvent(pInfo->dev, slot, XI_TouchEnd, 0,
> -                               hw->mt_mask[slot]);
> -    }
> -
> - out:
>       UpdateTouchState(pInfo, hw);
>   }
>
>


More information about the xorg-devel mailing list