summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2015-08-12 10:15:31 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2015-08-13 07:53:19 +1000
commitf139f1424936abdc43b2c8611d569b496ffa4a68 (patch)
treee9499d6d30b1fea7d4211aa341caa2a5beca3455
parente3a888c3ab0f4cc42943b0216852cba110c3dad2 (diff)
Add an option to disable horizontal scrolling
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@who-t.net> Reviewed-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r--include/libinput-properties.h4
-rw-r--r--man/libinput.man10
-rw-r--r--src/xf86libinput.c60
3 files changed, 73 insertions, 1 deletions
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);
}