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 <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;
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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/wayland-devel > _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel