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

Hans de Goede hdegoede at redhat.com
Thu Nov 6 07:37:32 PST 2014


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;
+
+	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



More information about the wayland-devel mailing list