Add a configuration option to allow selecting between 2-finger / edge / none scrolling (for touchpads).
Signed-off-by: Hans de Goede <hdego...@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; + + 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. + */ + 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. + * + * @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 + * 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. + * + * @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). + * + * @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@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel