[PATCH libinput] evdev: implement support for the MOUSE_WHEEL_CLICK_COUNT property

Hans de Goede hdegoede at redhat.com
Thu Nov 3 08:12:27 UTC 2016


Hi,

On 03-11-16 03:16, Peter Hutterer wrote:
> On Fri, Oct 28, 2016 at 12:57:38PM +0200, Hans de Goede wrote:
>> Hi,
>>
>> On 28-10-16 07:08, Peter Hutterer wrote:
>>> Not all mice have a click angle with integer degrees. The new
>>> MOUSE_WHEEL_CLICK_COUNT property specifies how many clicks per full rotation,
>>> the angle can be calculated from that.
>>>
>>> See https://github.com/systemd/systemd/pull/4440 for more information
>>>
>>> CLICK_COUNT overrides CLICK_ANGLE, so we check for the former first and then
>>> fall back to the angle if need be. No changes to the user-facing API.
>>>
>>> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
>>> ---
>>> src/evdev.c                                  | 51 +++++++++++++++---
>>> src/libinput-private.h                       |  2 +-
>>> src/libinput-util.c                          | 32 ++++++++++++
>>> src/libinput-util.h                          |  1 +
>>> test/Makefile.am                             |  1 +
>>> test/litest-device-mouse-wheel-click-count.c | 77 ++++++++++++++++++++++++++++
>>> test/litest.c                                |  2 +
>>> test/litest.h                                |  1 +
>>> test/misc.c                                  | 30 +++++++++++
>>> test/pointer.c                               | 49 +++++++++++++++---
>>> 10 files changed, 229 insertions(+), 17 deletions(-)
>>> create mode 100644 test/litest-device-mouse-wheel-click-count.c
>>>
>>> diff --git a/src/evdev.c b/src/evdev.c
>>> index d49b391..1c46534 100644
>>> --- a/src/evdev.c
>>> +++ b/src/evdev.c
>>> @@ -2008,7 +2008,7 @@ evdev_device_init_pointer_acceleration(struct evdev_device *device,
>>> static inline bool
>>> evdev_read_wheel_click_prop(struct evdev_device *device,
>>> 			    const char *prop,
>>> -			    int *angle)
>>> +			    double *angle)
>>> {
>>> 	int val;
>>>
>>> @@ -2032,18 +2032,53 @@ evdev_read_wheel_click_prop(struct evdev_device *device,
>>> 	return false;
>>> }
>>>
>>> +static inline bool
>>> +evdev_read_wheel_click_count_prop(struct evdev_device *device,
>>> +				  const char *prop,
>>> +				  double *angle)
>>> +{
>>> +	int val;
>>> +
>>> +	prop = udev_device_get_property_value(device->udev_device, prop);
>>> +	if (!prop)
>>> +		return false;
>>> +
>>> +	val = parse_mouse_wheel_click_angle_property(prop);
>>> +	if (val) {
>>> +		*angle = 360.0/val;
>>> +		return true;
>>> +	}
>>> +
>>> +	log_error(evdev_libinput_context(device),
>>> +		  "Mouse wheel click count '%s' is present but invalid, "
>>> +		  "using %d degrees for angle instead instead\n",
>>> +		  device->devname,
>>> +		  DEFAULT_WHEEL_CLICK_ANGLE);
>>> +	*angle = DEFAULT_WHEEL_CLICK_ANGLE;
>>> +
>>> +	return false;
>>> +}
>>> +
>>
>> This is almost a 100% copy of evdev_read_wheel_click_prop
>> how about giving evdev_read_wheel_click_prop an extra
>> "bool count" argument and then doing:
>>
>> 	if (val) {
>> 		if (count)
>> 			*angle = 360.0 / val;
>> 		else
>> 			*angle = val;
>> 		return true;
>> 	}
>>
>> Then we do not need the almost identical function.
>
> I played around with this for a few days and tbh I'm not happy any
> incarnation that I tried. Any merging together means we have to have
> conditions for the error message (or a more generic and thus less useful
> one). And with the parsing functions themselves, yes, they're 100% the same
> but most of the info is contained in the comments above to explain what the
> property does. Merging those together is also a net loss in information.
>
> Given that they're small enough and they won't see much change over time,
> I'm gonna go with the current patch after all.

Ok.

Regards,

Hans


More information about the wayland-devel mailing list