[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