update scroll patch

This commit is contained in:
Sean Buckley 2020-11-09 11:50:42 -05:00
parent 3d872c770b
commit fe1e2f705b
3 changed files with 13 additions and 181 deletions

View file

@ -1,176 +0,0 @@
diff --git a/include/libinput-properties.h b/include/libinput-properties.h
index a701316890d3d45511199f40207145bb08de4b4f..3dd659fbd157ecbe6be8382b9bf5d9bd8a8f4beb 100644
--- a/include/libinput-properties.h
+++ b/include/libinput-properties.h
@@ -109,6 +109,12 @@
only one is enabled at a time at max, read-only */
#define LIBINPUT_PROP_SCROLL_METHOD_ENABLED_DEFAULT "libinput Scroll Method Enabled Default"
+/* Scroll distance scale: FLOAT, 2 values, 32 bit */
+#define LIBINPUT_PROP_SCROLL_DISTANCE_SCALE "libinput Scroll Distance Scale"
+
+/* Scroll distance scale: FLOAT, 2 values, 32 bit, read only */
+#define LIBINPUT_PROP_SCROLL_DISTANCE_SCALE_DEFAULT "libinput Scroll Distance Scale Default"
+
/* Scroll button for button scrolling: 32-bit int, 1 value */
#define LIBINPUT_PROP_SCROLL_BUTTON "libinput Button Scrolling Button"
diff --git a/man/libinput.man b/man/libinput.man
index dbf7dee7621d1c2f463813569202896a61259cfd..008a36acba47739ff24dbe8f23f1f6e650822ab4 100644
--- a/man/libinput.man
+++ b/man/libinput.man
@@ -264,6 +264,9 @@ Indicates which scroll methods are available on this device.
3 boolean values (8 bit, 0 or 1), in order "two-finger", "edge", "button".
Indicates which scroll method is currently enabled on this device.
.TP 7
+.BI "libinput Scroll Distance Scale"
+2 32-bit float values. Scroll distance is multiplied by this before being
+passed to the client. First is vertical scale, second is horizontal scale.
.BI "libinput Send Events Modes Available"
2 boolean values (8 bit, 0 or 1), in order "disabled" and
"disabled-on-external-mouse". Indicates which send-event modes are available
diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index ff76895cbbe55ac3c5ed999cb54cefb1e7493063..05ac092615a447be19b25d47e93f476833a6d222 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -131,6 +131,7 @@ struct xf86libinput {
struct scroll_axis {
int dist;
double fraction;
+ double scale;
} v, h;
} scroll;
@@ -1651,6 +1652,18 @@ calculate_axis_value(struct xf86libinput *driver_data,
value = libinput_event_pointer_get_axis_value(event, axis);
}
+ //LogMessageVerb(X_INFO, 0, "scroll of %f on axis %d", value, axis);
+ switch (axis) {
+ case LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL:
+ //LogMessageVerb(X_INFO, 0, "scaled by %f to %f\n", driver_data->scroll.h.scale, value);
+ value *= driver_data->scroll.h.scale;
+ break;
+ case LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL:
+ //LogMessageVerb(X_INFO, 0, "scaled by %f to %f\n", driver_data->scroll.v.scale, value);
+ value *= driver_data->scroll.v.scale;
+ break;
+ }
+
*value_out = value;
return true;
@@ -3430,6 +3443,9 @@ xf86libinput_pre_init(InputDriverPtr drv,
driver_data->scroll.v.dist = 15;
driver_data->scroll.h.dist = 15;
+ driver_data->scroll.v.scale = 1;
+ driver_data->scroll.h.scale = 1;
+
if (!is_subdevice) {
if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER))
driver_data->capabilities |= CAP_POINTER;
@@ -3570,6 +3586,8 @@ static Atom prop_scroll_method_enabled;
static Atom prop_scroll_method_default;
static Atom prop_scroll_button;
static Atom prop_scroll_button_default;
+static Atom prop_scroll_distance_scale;
+static Atom prop_scroll_distance_scale_default;
static Atom prop_click_methods_available;
static Atom prop_click_method_enabled;
static Atom prop_click_method_default;
@@ -4147,6 +4165,35 @@ LibinputSetPropertyScrollButton(DeviceIntPtr dev,
return Success;
}
+static inline int
+LibinputSetPropertyScrollDistanceScale(DeviceIntPtr dev,
+ Atom atom,
+ XIPropertyValuePtr val,
+ BOOL checkonly)
+{
+ InputInfoPtr pInfo = dev->public.devicePrivate;
+ struct xf86libinput *driver_data = pInfo->private;
+ float *data;
+
+ if (val->format != 32 || val->size != 2 || val->type != prop_float) {
+ LogMessageVerb(X_INFO, 0, "bad match");
+ return BadMatch;
+ }
+
+ data = (float*)val->data;
+ LogMessageVerb(X_INFO, 0, "i want to set it to %f %f\n", data[0], data[1]);
+ if (checkonly) {
+ if (!xf86libinput_check_device(dev, atom))
+ return BadMatch;
+ } else {
+ LogMessageVerb(X_INFO, 0, "setting scroll.v.scale to %f and scroll.h.scale to %f\n", data[0], data[1]);
+ driver_data->scroll.v.scale = data[0];
+ driver_data->scroll.h.scale = data[1];
+ }
+
+ return Success;
+}
+
static inline int
LibinputSetPropertyClickMethod(DeviceIntPtr dev,
Atom atom,
@@ -4521,6 +4568,8 @@ LibinputSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
rc = LibinputSetPropertyScrollMethods(dev, atom, val, checkonly);
else if (atom == prop_scroll_button)
rc = LibinputSetPropertyScrollButton(dev, atom, val, checkonly);
+ else if (atom == prop_scroll_distance_scale)
+ rc = LibinputSetPropertyScrollDistanceScale(dev, atom, val, checkonly);
else if (atom == prop_click_method_enabled)
rc = LibinputSetPropertyClickMethod(dev, atom, val, checkonly);
else if (atom == prop_middle_emulation)
@@ -4561,6 +4610,7 @@ LibinputSetProperty(DeviceIntPtr dev, Atom atom, XIPropertyValuePtr val,
atom == prop_scroll_method_default ||
atom == prop_scroll_methods_available ||
atom == prop_scroll_button_default ||
+ atom == prop_scroll_distance_scale_default ||
atom == prop_click_method_default ||
atom == prop_click_methods_available ||
atom == prop_middle_emulation_default ||
@@ -5072,6 +5122,33 @@ LibinputInitScrollMethodsProperty(DeviceIntPtr dev,
}
}
+static void
+LibinputInitScrollDistanceScaleProperty(DeviceIntPtr dev,
+ struct xf86libinput *driver_data,
+ struct libinput_device *device)
+{
+ float scroll_distance_scale[2] = {driver_data->scroll.v.scale, driver_data->scroll.h.scale};
+
+ if (!subdevice_has_capabilities(dev, CAP_POINTER))
+ return;
+
+ LogMessageVerb(X_INFO, 0, "making %s property with %f %f\n", LIBINPUT_PROP_SCROLL_DISTANCE_SCALE, scroll_distance_scale[0], scroll_distance_scale[1]);
+ prop_scroll_distance_scale = LibinputMakeProperty(dev,
+ LIBINPUT_PROP_SCROLL_DISTANCE_SCALE,
+ prop_float, 32,
+ 2, scroll_distance_scale);
+ if (!prop_scroll_distance_scale)
+ return;
+
+ scroll_distance_scale[0] = 1;
+ scroll_distance_scale[1] = 1;
+ LogMessageVerb(X_INFO, 0, "making %s property with %f %f\n", LIBINPUT_PROP_SCROLL_DISTANCE_SCALE_DEFAULT, scroll_distance_scale[0], scroll_distance_scale[1]);
+ prop_scroll_distance_scale_default = LibinputMakeProperty(dev,
+ LIBINPUT_PROP_SCROLL_DISTANCE_SCALE_DEFAULT,
+ prop_float, 32,
+ 2, scroll_distance_scale);
+}
+
static void
LibinputInitClickMethodsProperty(DeviceIntPtr dev,
struct xf86libinput *driver_data,
@@ -5476,6 +5553,7 @@ LibinputInitProperty(DeviceIntPtr dev)
LibinputInitNaturalScrollProperty(dev, driver_data, device);
LibinputInitDisableWhileTypingProperty(dev, driver_data, device);
LibinputInitScrollMethodsProperty(dev, driver_data, device);
+ LibinputInitScrollDistanceScaleProperty(dev, driver_data, device);
LibinputInitClickMethodsProperty(dev, driver_data, device);
LibinputInitMiddleEmulationProperty(dev, driver_data, device);
LibinputInitRotationAngleProperty(dev, driver_data, device);

View file

@ -1,15 +1,11 @@
{ config, pkgs, ... }:
{
services.xserver.displayManager.sessionCommands = ''
xinput list | cut -d= -f2 | cut -f1 | xargs -i xinput set-prop {} 'libinput Scroll Distance Scale' 2 1
'';
nixpkgs.overlays = [
(self: super: {
xorg = super.xorg.overrideScope' (selfB: superB: {
inherit (super.xorg) xlibsWrapper;
xf86inputlibinput = superB.xf86inputlibinput.overrideAttrs (attr: {
patches = [ ./b7b5c5ef5f34802fc5f57e68493afaea5db7cdb4.diff ];
patches = [ ./libinput.patch ];
});
});
})

View file

@ -0,0 +1,12 @@
diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index 620af6d..d1bf974 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -1618,6 +1618,7 @@ calculate_axis_value(struct xf86libinput *driver_data,
source = libinput_event_pointer_get_axis_source(event);
if (source == LIBINPUT_POINTER_AXIS_SOURCE_WHEEL) {
value = get_wheel_scroll_value(driver_data, event, axis);
+ value *= 2;
} else {
value = libinput_event_pointer_get_axis_value(event, axis);
}