From fe1e2f705ba02dc6fd0a4779512191dc6eab37f5 Mon Sep 17 00:00:00 2001 From: Sean Buckley Date: Mon, 9 Nov 2020 11:50:42 -0500 Subject: [PATCH] update scroll patch --- ...5c5ef5f34802fc5f57e68493afaea5db7cdb4.diff | 176 ------------------ modules/scroll-boost/default.nix | 6 +- modules/scroll-boost/libinput.patch | 12 ++ 3 files changed, 13 insertions(+), 181 deletions(-) delete mode 100644 modules/scroll-boost/b7b5c5ef5f34802fc5f57e68493afaea5db7cdb4.diff create mode 100644 modules/scroll-boost/libinput.patch diff --git a/modules/scroll-boost/b7b5c5ef5f34802fc5f57e68493afaea5db7cdb4.diff b/modules/scroll-boost/b7b5c5ef5f34802fc5f57e68493afaea5db7cdb4.diff deleted file mode 100644 index cf35363..0000000 --- a/modules/scroll-boost/b7b5c5ef5f34802fc5f57e68493afaea5db7cdb4.diff +++ /dev/null @@ -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); diff --git a/modules/scroll-boost/default.nix b/modules/scroll-boost/default.nix index d82ddcf..8e8f9fe 100644 --- a/modules/scroll-boost/default.nix +++ b/modules/scroll-boost/default.nix @@ -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 ]; }); }); }) diff --git a/modules/scroll-boost/libinput.patch b/modules/scroll-boost/libinput.patch new file mode 100644 index 0000000..a0df4f9 --- /dev/null +++ b/modules/scroll-boost/libinput.patch @@ -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); + }