[PATCH 2/2] touchpad: Add edge-scrolling support
Peter Hutterer
peter.hutterer at who-t.net
Wed Nov 19 22:19:15 PST 2014
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().
Cheers,
Peter
More information about the wayland-devel
mailing list