[PATCH libinput 2/6] touchpad: Fix sending of scroll stop events

Peter Hutterer peter.hutterer at who-t.net
Mon May 26 03:55:25 PDT 2014


On 26/05/2014 16:33 , Hans de Goede wrote:
> Hi,
>
> On 05/25/2014 02:13 PM, Jonas Ådahl wrote:
>> On Fri, May 23, 2014 at 04:06:23PM +0200, Hans de Goede wrote:
>>> Setting tp->scroll.direction = 0 before checking tp->scroll.direction
>>> to see if we need to send stop scroll events for vert / horz scrolling does
>>> not really work well.
>>>
>>> Also we need to check direction with an axis mask, not the axis number.
>>>
>>> While at it also add a tp_stop_scroll_events() helper function for this.
>>>
>>> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
>>> ---
>>>   src/evdev-mt-touchpad.c | 39 +++++++++++++++++++++++----------------
>>>   1 file changed, 23 insertions(+), 16 deletions(-)
>>>
>>> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
>>> index 040939b..2455c36 100644
>>> --- a/src/evdev-mt-touchpad.c
>>> +++ b/src/evdev-mt-touchpad.c
>>> @@ -500,6 +500,28 @@ tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time)
>>>   	}
>>>   }
>>>
>>> +static void
>>> +tp_stop_scroll_events(struct tp_dispatch *tp, uint64_t time)
>>> +{
>>> +	if (tp->scroll.state == SCROLL_STATE_NONE)
>>> +		return;
>>> +
>>> +	/* terminate scrolling with a zero scroll event */
>>> +	if (tp->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL))
>>> +		pointer_notify_axis(&tp->device->base,
>>> +				    time,
>>> +				    LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL,
>>> +				    0);
>>> +	if (tp->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_HORIZONTAL_SCROLL))
>>> +		pointer_notify_axis(&tp->device->base,
>>> +				    time,
>>> +				    LIBINPUT_POINTER_AXIS_HORIZONTAL_SCROLL,
>>> +				    0);
>>
>> I can see that you didn't introduce sending 0-valued axis events in this
>> patch, but why do we do so? weston will ignore it anyway, and if it
>> wouldn't or other compositor wouldn't, it might confuse clients assuming
>> that a scroll event will always have a direction.
>
> Another one where I'm going to let the answer up to Peter I'm afraid.

The idea is to terminate the scroll events series with a 0 event as a 
signal of "it's finished now". Especially for touch-based scrolling this 
helps with extra UI effects. if you have a physics-based scrolling, 
getting the terminating event means you can calculate v0 for the 
friction without further delay. In the user-interface you can stay in 
scrolling mode even when you don't receive events because you know the 
user still has two fingers on the pad.

I understand this isn't currently used, I think it's still a good 
addition. And yes, it needs some extra code so scroll wheels are handled 
sensibly too.

Cheers,
   Peter



More information about the wayland-devel mailing list