[PATCH 03/11] Add configuration option to select scroll mode

Peter Hutterer peter.hutterer at who-t.net
Thu Nov 6 17:59:02 PST 2014


On Thu, Nov 06, 2014 at 04:37:32PM +0100, Hans de Goede wrote:
> Add a configuration option to allow selecting between 2-finger / edge / none
> scrolling (for touchpads).
> 
> Signed-off-by: Hans de Goede <hdegoede at redhat.com>
> ---
>  src/libinput-private.h |  13 ++++
>  src/libinput.c         |  82 ++++++++++++++++++++++++
>  src/libinput.h         | 165 +++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 260 insertions(+)
> 
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index 92bd96b..5310160 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -132,6 +132,18 @@ struct libinput_device_config_left_handed {
>  	int (*get_default)(struct libinput_device *device);
>  };
>  
> +struct libinput_device_config_scroll_mode {
> +	uint32_t (*get_modes)(struct libinput_device *device);
> +	enum libinput_config_status (*set_mode)(struct libinput_device *device,
> +						enum libinput_config_scroll_mode mode);
> +	enum libinput_config_scroll_mode (*get_mode)(struct libinput_device *device);
> +	enum libinput_config_scroll_mode (*get_default_mode)(struct libinput_device *device);
> +	enum libinput_config_status (*set_button)(struct libinput_device *device,
> +						  uint32_t button);
> +	uint32_t (*get_button)(struct libinput_device *device);
> +	uint32_t (*get_default_button)(struct libinput_device *device);
> +};
> +
>  struct libinput_device_config {
>  	struct libinput_device_config_tap *tap;
>  	struct libinput_device_config_calibration *calibration;
> @@ -139,6 +151,7 @@ struct libinput_device_config {
>  	struct libinput_device_config_accel *accel;
>  	struct libinput_device_config_natural_scroll *natural_scroll;
>  	struct libinput_device_config_left_handed *left_handed;
> +	struct libinput_device_config_scroll_mode *scroll_mode;
>  };
>  
>  struct libinput_device {
> diff --git a/src/libinput.c b/src/libinput.c
> index abbfb10..930abaf 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -1531,3 +1531,85 @@ libinput_device_config_buttons_get_default_left_handed(struct libinput_device *d
>  
>  	return device->config.left_handed->get_default(device);
>  }
> +
> +LIBINPUT_EXPORT uint32_t
> +libinput_device_config_scroll_get_modes(struct libinput_device *device)
> +{
> +	if (device->config.scroll_mode)
> +		return device->config.scroll_mode->get_modes(device);
> +	else
> +		return 0;
> +}
> +
> +LIBINPUT_EXPORT enum libinput_config_status
> +libinput_device_config_scroll_set_mode(struct libinput_device *device,
> +				       enum libinput_config_scroll_mode mode)
> +{
> +	if ((libinput_device_config_scroll_get_modes(device) & mode) != mode)
> +		return LIBINPUT_CONFIG_STATUS_UNSUPPORTED;
> +
> +	/* Check mode is a single valid mode */
> +	switch (mode) {
> +	case LIBINPUT_CONFIG_SCROLL_NO_SCROLL:
> +	case LIBINPUT_CONFIG_SCROLL_2FG:
> +	case LIBINPUT_CONFIG_SCROLL_EDGE:
> +	case LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN:
> +		break;
> +	default:
> +		return LIBINPUT_CONFIG_STATUS_INVALID;
> +	}
> +
> +	if (device->config.scroll_mode)
> +		return device->config.scroll_mode->set_mode(device, mode);
> +	else /* mode must be _NO_SCROLL to get here */
> +		return LIBINPUT_CONFIG_STATUS_SUCCESS;
> +}
> +
> +LIBINPUT_EXPORT enum libinput_config_scroll_mode
> +libinput_device_config_scroll_get_mode(struct libinput_device *device)
> +{
> +	if (device->config.scroll_mode)
> +		return device->config.scroll_mode->get_mode(device);
> +	else
> +		return LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
> +}
> +
> +LIBINPUT_EXPORT enum libinput_config_scroll_mode
> +libinput_device_config_scroll_get_default_mode(struct libinput_device *device)
> +{
> +	if (device->config.scroll_mode)
> +		return device->config.scroll_mode->get_default_mode(device);
> +	else
> +		return LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
> +}
> +
> +LIBINPUT_EXPORT enum libinput_config_status
> +libinput_device_config_scroll_set_button(struct libinput_device *device,
> +					 uint32_t button)
> +{
> +	if (!(libinput_device_config_scroll_get_modes(device) &
> +	      LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN))
> +		return LIBINPUT_CONFIG_STATUS_UNSUPPORTED;

I'd prefer to do this as (get_modes() & ON_BUTTON_DOWN) == 0, that is more
in-line with the existing comparisons to != modes, and was also what we used
in the sendevents config before it updated to bitmasks.

> +
> +	return device->config.scroll_mode->set_button(device, button);
> +}
> +
> +LIBINPUT_EXPORT uint32_t
> +libinput_device_config_scroll_get_button(struct libinput_device *device)
> +{
> +	if (!(libinput_device_config_scroll_get_modes(device) &
> +	      LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN))
> +		return 0;
> +
> +	return device->config.scroll_mode->get_button(device);
> +}
> +
> +LIBINPUT_EXPORT uint32_t
> +libinput_device_config_scroll_get_default_button(struct libinput_device *device)
> +{
> +	if (!(libinput_device_config_scroll_get_modes(device) &
> +	      LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN))
> +		return 0;
> +
> +	return device->config.scroll_mode->get_default_button(device);
> +}
> diff --git a/src/libinput.h b/src/libinput.h
> index cdd8186..d43c316 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -2020,6 +2020,171 @@ libinput_device_config_buttons_get_left_handed(struct libinput_device *device);
>  int
>  libinput_device_config_buttons_get_default_left_handed(struct libinput_device *device);
>  
> +/**
> + * The scroll mode of a device selects when to generate scroll axis events
> + * instead of pointer motion events.
> + */
> +enum libinput_config_scroll_mode {
> +	/**
> +	 * Never send scroll events instead of pointer motion events.
> +	 * Note scroll wheels, etc. will still send scroll events.
> +	 */
> +	LIBINPUT_CONFIG_SCROLL_NO_SCROLL = 0,
> +	/**
> +	 * Send scroll events when 2 fingers are down on the device.
> +	 */
> +	LIBINPUT_CONFIG_SCROLL_2FG = (1 << 0),
> +	/**
> +	 * Send scroll events when a finger is moved along the bottom or
> +	 * right edge of a device.
> +	 */
> +	LIBINPUT_CONFIG_SCROLL_EDGE = (1 << 1),
> +	/**
> +	 * Send scroll events when a button is down.

.. and the device moves along a scroll-capable axis.

> +	 */
> +	LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN = (1 << 2),
> +};
> +
> +/**
> + * @ingroup config
> + *
> + * Check which scroll modes a device supports. The mode defines when to
> + * generate scroll axis events instead of pointer motion events.
> + *
> + * @param device The device to configure
> + *
> + * @return A bitmask of possible modes.
> + *
> + * @see libinput_device_config_scroll_set_mode
> + * @see libinput_device_config_scroll_get_mode
> + * @see libinput_device_config_scroll_get_default_mode
> + * @see libinput_device_config_scroll_set_button
> + * @see libinput_device_config_scroll_get_button
> + * @see libinput_device_config_scroll_get_default_button
> + */
> +uint32_t
> +libinput_device_config_scroll_get_modes(struct libinput_device *device);
> +
> +/**
> + * @ingroup config
> + *
> + * Set the scroll mode for this device. The mode defines when to
> + * generate scroll axis events instead of pointer motion events.
> + *

this needs some explanation on what happens if the mode is ON_BUTTON_DOWN
and no button has been set before.

> + * @param device The device to configure
> + * @param mode The scroll mode for this device.
> + *
> + * @return A config status code.
> + *
> + * @see libinput_device_config_scroll_get_modes
> + * @see libinput_device_config_scroll_get_mode
> + * @see libinput_device_config_scroll_get_default_mode
> + * @see libinput_device_config_scroll_set_button
> + * @see libinput_device_config_scroll_get_button
> + * @see libinput_device_config_scroll_get_default_button
> + */
> +enum libinput_config_status
> +libinput_device_config_scroll_set_mode(struct libinput_device *device,
> +				       enum libinput_config_scroll_mode mode);
> +
> +/**
> + * @ingroup config
> + *
> + * Get the scroll mode for this device. The mode defines when to
> + * generate scroll axis events instead of pointer motion events.
> + *
> + * @param device The device to configure
> + * @return The current scroll mode for this device.
> + *
> + * @see libinput_device_config_scroll_get_modes
> + * @see libinput_device_config_scroll_set_mode
> + * @see libinput_device_config_scroll_get_default_mode
> + * @see libinput_device_config_scroll_set_button
> + * @see libinput_device_config_scroll_get_button
> + * @see libinput_device_config_scroll_get_default_button
> + */
> +enum libinput_config_scroll_mode
> +libinput_device_config_scroll_get_mode(struct libinput_device *device);
> +
> +/**
> + * @ingroup config
> + *
> + * Get the default scroll mode for this device. The mode defines when to
> + * generate scroll axis events instead of pointer motion events.
> + *
> + * @param device The device to configure
> + * @return The default scroll mode for this device.
> + *
> + * @see libinput_device_config_scroll_get_modes
> + * @see libinput_device_config_scroll_set_mode
> + * @see libinput_device_config_scroll_get_mode
> + * @see libinput_device_config_scroll_set_button
> + * @see libinput_device_config_scroll_get_button
> + * @see libinput_device_config_scroll_get_default_button
> + */
> +enum libinput_config_scroll_mode
> +libinput_device_config_scroll_get_default_mode(struct libinput_device *device);
> +
> +/**
> + * @ingroup config
> + *
> + * Set the button for LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN mode for this

doxygen requires all constants to be prefixed with @ref. For functions
that's not necessary, it'll detect them if you add () to them.

There needs to be some more explanation here too to make it clear what
happens.
- is the button event still being sent to the caller? no, but needs to be
  stated here
- what is the config return value if the button doesn't exist
- what is the config return value if ON_BUTTON_DOWN isn't supported
- does setting the button enable ON_BUTTON_DOWN? no, but needs to be
  documented

> + * device.
> + *
> + * @param device The device to configure
> + * @param button The button which when pressed switches to sending scroll events 
> + *
> + * @return A config status code.
> + *
> + * @see libinput_device_config_scroll_get_modes
> + * @see libinput_device_config_scroll_set_mode
> + * @see libinput_device_config_scroll_get_mode
> + * @see libinput_device_config_scroll_get_default_mode
> + * @see libinput_device_config_scroll_get_button
> + * @see libinput_device_config_scroll_get_default_button
> + */
> +enum libinput_config_status
> +libinput_device_config_scroll_set_button(struct libinput_device *device,
> +					 uint32_t button);
> +
> +/**
> + * @ingroup config
> + *
> + * Get the button for LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN mode for this
> + * device.
> + *

what is the value if ON_BUTTON_DOWN is not supported? zero

specify that this button is independent of the _current_ scroll mode setting
(i.e. can be set without setting the mode to ON_BUTTON_DOWN)

> + * @param device The device to configure
> + * @return The button which when pressed switches to sending scroll events
> + *
> + * @see libinput_device_config_scroll_get_modes
> + * @see libinput_device_config_scroll_set_mode
> + * @see libinput_device_config_scroll_get_mode
> + * @see libinput_device_config_scroll_get_default_mode
> + * @see libinput_device_config_scroll_set_button
> + * @see libinput_device_config_scroll_get_default_button
> + */
> +uint32_t
> +libinput_device_config_scroll_get_button(struct libinput_device *device);
> +
> +/**
> + * @ingroup config
> + *
> + * Get the default button for LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN mode
> + * for this device. Note this may be 0 (not set / KEY_RESERVED).

If the device does not support the @ref LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN
scroll mode or no default button is set, this function returns 0.

fwiw, no spaces around / in English.

Cheers,
   Peter

> + *
> + * @param device The device to configure
> + * @return The default button for LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN mode
> + *
> + * @see libinput_device_config_scroll_get_modes
> + * @see libinput_device_config_scroll_set_mode
> + * @see libinput_device_config_scroll_get_mode
> + * @see libinput_device_config_scroll_get_default_mode
> + * @see libinput_device_config_scroll_set_button
> + * @see libinput_device_config_scroll_get_button
> + */
> +uint32_t
> +libinput_device_config_scroll_get_default_button(struct libinput_device *device);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> -- 
> 2.1.0
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 


More information about the wayland-devel mailing list