[PATCH 2/2] touchpad: Add edge-scrolling support

Hans de Goede hdegoede at redhat.com
Mon Nov 24 03:00:08 PST 2014


Hi,

On 11/20/2014 07:19 AM, Peter Hutterer wrote:
> On Wed, Nov 19, 2014 at 11:50:13AM +0100, Hans de Goede wrote:
> [...]
>>>
>>>> +
>>>> +	switch (tp->model) {
>>>> +	case MODEL_SYNAPTICS:
>>>> +		edge_width = width * .07;
>>>> +		edge_height = height * .07;
>>>> +		break;
>>>> +	case MODEL_ALPS:
>>>> +		edge_width = width * .15;
>>>> +		edge_height = height * .15;
>>>> +		break;
>>>> +	case MODEL_APPLETOUCH:
>>>> +	case MODEL_UNIBODY_MACBOOK:
>>>
>>> the unibody macbooks already had a clickpad, so this isn't needed
>>>
>>>> +		edge_width = width * .085;
>>>> +		edge_height = height * .085;
>>>> +		break;
>>>> +	default:
>>>> +		edge_width = width * .04;
>>>> +		edge_height = height * .054;
>>>> +	}
>>>
>>> fwiw, there is a bit of history there and many oddities are based on a
>>> the edges in synaptics being 'wrong'. the kernel exports the synaptics
>>> dimensions as the coordinates produced by 'an average finger', but it's not
>>> hard to go beyond min/max. iirc for alps and other devices the edges are the
>>> actual edges (and for the T440-style synaptics pads that we manually fixed
>>> up). Hence the need for different edge zones on synaptics.
>>>
>>> And the default numbers come from the synaptics user interface guide.
>>>      Typical bezel limits: x 1472–5472  y 1408–4448
>>>      Typical edge margins: x 1632–5312  y 1568–4288
>>> i.e. 4% and 5.4% are interpolated from those
>>>
>>> so in short, we don't need MODEL_SYNAPTICS, it's covered by the defaults.
>>>
>>> that just leaves APPLETOUCH and ALPS, I wonder if these have resolutions
>>> set (the synaptics code pre-dates resolution support in the kernel). if so,
>>> just defining a sensible size for the edge is enough (10mm?). or based on
>>> the diagonal.
>>
>> As also mentioned in a private mail not all alps devices have resolution set,
>> so at least for some devices we will need to take a percentage of width / height
>> (no idea why you mention diagonal here).
>
> pls see comments in the other email
>
>>>>   static int
>>>> @@ -1096,6 +1133,9 @@ tp_init(struct tp_dispatch *tp,
>>>>   	if (tp_init_scroll(tp) != 0)
>>>>   		return -1;
>>>>
>>>> +	if (tp_edge_scroll_init(tp, device) != 0)
>>>> +		return -1;
>>>
>>> tp_scroll_init() -> tp_edge_scroll_init()
>>>
>>>> +
>>>>   	device->seat_caps |= EVDEV_DEVICE_POINTER;
>>>>
>>>>   	return 0;
>>>> @@ -1239,6 +1279,7 @@ evdev_mt_touchpad_create(struct evdev_device *device)
>>>>
>>>>   	tp->model = tp_get_model(device);
>>>>
>>>> +	device->dispatch = &tp->base;
>>>
>>> I guess this is needed for some check or another? if so, can we either pass
>>> in the data that's needed, or alternatively make it consistent that the
>>> create method sets device->dispatch for the fallback interface as well.
>>
>> This is needed because the initial value for tp->scroll.mode is set
>> by calling tp_scroll_config_scroll_mode_get_default_mode(device).
>
> yeah, I think we need to wrap this differently. The current approach works,
> but it's a bit of a cardhouse. specifically, in a failure case the order of
> events is:
>    evdev_mt_touchpad_create() sets device->dispatch but returns NULL
>    evdev_configure_device() takes the NULL and overwrites device->dispatch
>    evdev_configure_device() calls evdev_device_destroy() which frees
>        device->dispatch
>
> so again, it works right now but if we ever rearrange
> evdev_configure_device() we'll be dealing with a freed pointer here. and the
> failure case isn't easy to test for.
>
> simple way to split this is to have an inline that takes the tp_dispatch and
> is called from get_default_mode() and tp_init_touch().

Ok, fixed as suggested for V3.

Regards,

Hans


More information about the wayland-devel mailing list