[PATCH xf86-input-libinput 2/2] Add an option to disable horizontal scrolling

Peter Hutterer peter.hutterer at who-t.net
Tue Aug 11 18:28:14 PDT 2015


libinput always has horizontal scrolling enabled and punts the decision when
to scroll horizontally to the toolkit/widget. This is the better approach, but
while we have a stack that's not ready for that, and in the X case likely
never will be fully ready provide an option to disable horizontal scrolling.

This option doesn't really disable horizontal scrolling, it merely discards
any horizontal scroll delta. libinput will still think it's scrolling.

https://bugs.freedesktop.org/show_bug.cgi?id=91589

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 include/libinput-properties.h |  4 +++
 man/libinput.man              | 10 ++++++++
 src/xf86libinput.c            | 60 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 73 insertions(+), 1 deletion(-)

diff --git a/include/libinput-properties.h b/include/libinput-properties.h
index ed009d5..06fad7f 100644
--- a/include/libinput-properties.h
+++ b/include/libinput-properties.h
@@ -120,4 +120,8 @@
    the target button number */
 #define LIBINPUT_PROP_DRAG_LOCK_BUTTONS "libinput Drag Lock Buttons"
 
+/* Horizontal scroll events enabled: BOOL, 1 value (0 or 1).
+ * If disabled, horizontal scroll events are discarded */
+#define LIBINPUT_PROP_HORIZ_SCROLL_ENABLED "libinput Horizonal Scroll Enabled"
+
 #endif /* _LIBINPUT_PROPERTIES_H_ */
diff --git a/man/libinput.man b/man/libinput.man
index ff7a411..3c35776 100644
--- a/man/libinput.man
+++ b/man/libinput.man
@@ -107,6 +107,12 @@ Enables a scroll method. Permitted values are
 Not all devices support all options, if an option is unsupported, the
 default scroll option for this device is used.
 .TP 7
+.BI "Option \*qHorizontalScrolling\*q" bool \*q
+Disables horizontal scrolling. When disabled, this driver will discard any
+horizontal scroll events from libinput. Note that this does not disable
+horizontal scrolling, it merely discards the horizontal axis from any scroll
+events.
+.TP 7
 .BI "Option \*qSendEventsMode\*q \*q" (disabled|enabled|disabled-on-external-mouse) \*q
 Sets the send events mode to disabled, enabled, or "disable when an external
 mouse is connected".
@@ -226,6 +232,10 @@ Either one 8-bit value specifying the meta drag lock button, or a list of
 button pairs. See section
 .B BUTTON DRAG LOCK
 for details.
+.TP 7
+.BI "libinput Horizontal Scrolling Enabled"
+1 boolean value (8 bit, 0 or 1). Indicates whether horizontal scrolling
+events are enabled or not.
 
 .SH BUTTON MAPPING
 X clients receive events with logical button numbers, where 1, 2, 3
diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index 8500792..8987518 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -111,6 +111,8 @@ struct xf86libinput {
 		enum libinput_config_click_method click_method;
 
 		unsigned char btnmap[MAX_BUTTONS + 1];
+
+		BOOL horiz_scrolling_enabled;
 	} options;
 
 	struct draglock draglock;
@@ -831,6 +833,10 @@ xf86libinput_handle_axis(InputInfoPtr pInfo, struct libinput_event_pointer *even
 		}
 		valuator_mask_set_double(mask, 3, value);
 	}
+
+	if (!driver_data->options.horiz_scrolling_enabled)
+		goto out;
+
 	axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
 	if (libinput_event_pointer_has_axis(event, axis)) {
 		if (source == LIBINPUT_POINTER_AXIS_SOURCE_WHEEL) {
@@ -842,6 +848,7 @@ xf86libinput_handle_axis(InputInfoPtr pInfo, struct libinput_event_pointer *even
 		valuator_mask_set_double(mask, 2, value);
 	}
 
+out:
 	xf86PostMotionEventM(dev, Relative, mask);
 }
 
@@ -1425,6 +1432,12 @@ xf86libinput_parse_draglock_option(InputInfoPtr pInfo,
 	free(str);
 }
 
+static inline BOOL
+xf86libinput_parse_horiz_scroll_option(InputInfoPtr pInfo)
+{
+	return xf86SetBoolOption(pInfo->options, "HorizontalScrolling", TRUE);
+}
+
 static void
 xf86libinput_parse_options(InputInfoPtr pInfo,
 			   struct xf86libinput *driver_data,
@@ -1450,8 +1463,10 @@ xf86libinput_parse_options(InputInfoPtr pInfo,
 	xf86libinput_parse_buttonmap_option(pInfo,
 					    options->btnmap,
 					    sizeof(options->btnmap));
-	if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER))
+	if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) {
 		xf86libinput_parse_draglock_option(pInfo, driver_data);
+		options->horiz_scrolling_enabled = xf86libinput_parse_horiz_scroll_option(pInfo);
+	}
 }
 
 static int
@@ -1647,6 +1662,7 @@ static Atom prop_disable_while_typing_default;
 
 /* driver properties */
 static Atom prop_draglock;
+static Atom prop_horiz_scroll;
 
 /* general properties */
 static Atom prop_float;
@@ -2166,6 +2182,33 @@ LibinputSetPropertyDragLockButtons(DeviceIntPtr dev,
 					       val->size, checkonly);
 }
 
+static inline int
+LibinputSetPropertyHorizScroll(DeviceIntPtr dev,
+			       Atom atom,
+			       XIPropertyValuePtr val,
+			       BOOL checkonly)
+{
+	InputInfoPtr pInfo = dev->public.devicePrivate;
+	struct xf86libinput *driver_data = pInfo->private;
+	BOOL enabled;
+
+	if (val->format != 8 || val->type != XA_INTEGER || val->size != 1)
+		return BadMatch;
+
+	enabled = *(BOOL*)val->data;
+	if (checkonly) {
+		if (enabled != 0 && enabled != 1)
+			return BadValue;
+
+		if (!xf86libinput_check_device (dev, atom))
+			return BadMatch;
+	} else {
+		driver_data->options.horiz_scrolling_enabled = enabled;
+	}
+
+	return Success;
+ }
+
 static int
 LibinputSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
                  BOOL checkonly)
@@ -2205,6 +2248,8 @@ LibinputSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
 		rc = LibinputSetPropertyDisableWhileTyping(dev, atom, val, checkonly);
 	else if (atom == prop_draglock)
 		rc = LibinputSetPropertyDragLockButtons(dev, atom, val, checkonly);
+	else if (atom == prop_horiz_scroll)
+		rc = LibinputSetPropertyHorizScroll(dev, atom, val, checkonly);
 	else if (atom == prop_device || atom == prop_product_id ||
 		 atom == prop_tap_default ||
 		 atom == prop_tap_drag_lock_default ||
@@ -2704,6 +2749,18 @@ LibinputInitDragLockProperty(DeviceIntPtr dev,
 }
 
 static void
+LibinputInitHorizScrollProperty(DeviceIntPtr dev,
+				struct xf86libinput *driver_data)
+{
+	BOOL enabled = driver_data->options.horiz_scrolling_enabled;
+
+	prop_horiz_scroll = LibinputMakeProperty(dev,
+						 LIBINPUT_PROP_HORIZ_SCROLL_ENABLED,
+						 XA_INTEGER, 8,
+						 1, &enabled);
+}
+
+static void
 LibinputInitProperty(DeviceIntPtr dev)
 {
 	InputInfoPtr pInfo  = dev->public.devicePrivate;
@@ -2754,4 +2811,5 @@ LibinputInitProperty(DeviceIntPtr dev)
 	XISetDevicePropertyDeletable(dev, prop_product_id, FALSE);
 
 	LibinputInitDragLockProperty(dev, driver_data);
+	LibinputInitHorizScrollProperty(dev, driver_data);
 }
-- 
2.4.3



More information about the xorg-devel mailing list