I recently installed Slowroll on a Dell Latitude E6400 equipped with an Alps DualPoint pointing stick. The default behavior appears to be to use the middle of three pointing stick buttons as a middle click, but I prefer wheel emulation-style scrolling on that button. Libinput supports “on-button scrolling”, so I enabled that using xinput and it corrected the issue. I’ve run into trouble getting that to persist through a system restart. Here’s what I’ve tried so far:
Setting the device behavior as follows with xinput has the desired effect:
~> xinput set-prop "AlpsPS/2 ALPS DualPoint Stick" "libinput Scroll Method Enabled" 0 0 1
Unfortunately, this doesn’t persist through a system restart. I tried solving this with a config file in /etc/X11/xorg.conf.d, as follows:
Section "InputClass"
Identifier "e6400 ALPS DualPoint Stick"
MatchProduct "Stick"
MatchIsPointer "on"
Driver "libinput"
Option "ScrollMethod" "button"
EndSection
On a reboot, this has no appreciable effect on the button behavior. Here’s the relevant part of Xorg.0.log:
Xorg.0.log
[ 3481.383] (II) config/udev: Adding input device AlpsPS/2 ALPS DualPoint Stick (/dev/input/event1)
[ 3481.383] (**) AlpsPS/2 ALPS DualPoint Stick: Applying InputClass "evdev pointer catchall"
[ 3481.383] (**) AlpsPS/2 ALPS DualPoint Stick: Applying InputClass "libinput pointer catchall"
[ 3481.383] (**) AlpsPS/2 ALPS DualPoint Stick: Applying InputClass "e6400 ALPS DualPoint Stick"
[ 3481.383] (II) Using input driver 'libinput' for 'AlpsPS/2 ALPS DualPoint Stick'
[ 3481.383] (**) AlpsPS/2 ALPS DualPoint Stick: always reports core events
[ 3481.383] (**) Option "Device" "/dev/input/event1"
[ 3481.387] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: is tagged by udev as: Mouse Pointingstick
[ 3481.387] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: trackpoint multiplier is 1.50
[ 3481.388] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: device is a pointer
[ 3481.391] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: device removed
[ 3481.397] (II) libinput: AlpsPS/2 ALPS DualPoint Stick: Step value 0 was provided, libinput Fallback acceleration function is used.
[ 3481.397] (II) libinput: AlpsPS/2 ALPS DualPoint Stick: Step value 0 was provided, libinput Fallback acceleration function is used.
[ 3481.397] (II) libinput: AlpsPS/2 ALPS DualPoint Stick: Step value 0 was provided, libinput Fallback acceleration function is used.
[ 3481.397] (**) Option "ScrollMethod" "button"
[ 3481.397] (**) Option "config_info" "udev:/sys/devices/platform/i8042/serio1/input/input3/event1"
[ 3481.397] (II) XINPUT: Adding extended input device "AlpsPS/2 ALPS DualPoint Stick" (type: MOUSE, id 12)
[ 3481.397] (**) Option "AccelerationScheme" "none"
[ 3481.397] (**) AlpsPS/2 ALPS DualPoint Stick: (accel) selected scheme none/0
[ 3481.397] (**) AlpsPS/2 ALPS DualPoint Stick: (accel) acceleration factor: 2.000
[ 3481.397] (**) AlpsPS/2 ALPS DualPoint Stick: (accel) acceleration threshold: 4
[ 3481.401] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: is tagged by udev as: Mouse Pointingstick
[ 3481.401] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: trackpoint multiplier is 1.50
[ 3481.402] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: device is a pointer
[ 3481.406] (II) config/udev: Adding input device AlpsPS/2 ALPS DualPoint Stick (/dev/input/mouse0)
[ 3481.406] (**) AlpsPS/2 ALPS DualPoint Stick: Applying InputClass "e6400 ALPS DualPoint Stick"
[ 3481.406] (II) Using input driver 'libinput' for 'AlpsPS/2 ALPS DualPoint Stick'
[ 3481.406] (**) AlpsPS/2 ALPS DualPoint Stick: always reports core events
[ 3481.406] (**) Option "Device" "/dev/input/mouse0"
[ 3481.414] (II) mouse0 - not using input device '/dev/input/mouse0'.
[ 3481.414] (EE) libinput: AlpsPS/2 ALPS DualPoint Stick: Failed to create a device for /dev/input/mouse0
[ 3481.414] (EE) PreInit returned 2 for "AlpsPS/2 ALPS DualPoint Stick"
[ 3481.414] (II) UnloadModule: "libinput"
[ 3481.415] (II) config/udev: Adding input device PC Speaker (/dev/input/event7)
[ 3481.415] (II) No input driver specified, ignoring this device.
[ 3481.415] (II) This device may have been added with another device file.
[ 3495.298] (II) event3 - Video Bus: device removed
[ 3495.317] (II) event5 - Power Button: device removed
[ 3495.321] (II) event6 - Sleep Button: device removed
[ 3495.325] (II) event8 - Dell WMI hotkeys: device removed
[ 3495.332] (II) event0 - AT Translated Set 2 keyboard: device removed
[ 3495.336] (II) event2 - AlpsPS/2 ALPS DualPoint TouchPad: device removed
[ 3495.348] (II) event1 - AlpsPS/2 ALPS DualPoint Stick: device removed
[ 3495.357] (II) AIGLX: Suspending AIGLX clients for VT switch
[ 3495.398] (EE) modeset(0): failed to set mode: Permission denied
[ 3500.288] (II) UnloadModule: "libinput"
[ 3500.288] (II) UnloadModule: "libinput"
[ 3500.288] (II) UnloadModule: "libinput"
[ 3500.288] (II) UnloadModule: "libinput"
[ 3500.288] (II) UnloadModule: "libinput"
[ 3500.288] (II) UnloadModule: "libinput"
[ 3500.289] (II) UnloadModule: "libinput"
[ 3500.300] (II) Server terminated successfully (0). Closing log file.
It looks to me like the config is correctly being applied: the matching seems to work and the specified option seems to be being applied, but the output of xinput list-props remains as follows and button scrolling is still non-working.
xinput list-props
Device 'AlpsPS/2 ALPS DualPoint Stick':
Device Enabled (176): 1
Coordinate Transformation Matrix (178): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
libinput Natural Scrolling Enabled (318): 0
libinput Natural Scrolling Enabled Default (319): 0
libinput Scroll Methods Available (322): 0, 0, 1
**libinput Scroll Method Enabled (323): 0, 0, 0**
libinput Scroll Method Enabled Default (324): 0, 0, 1
libinput Button Scrolling Button (345): 2
libinput Button Scrolling Button Default (346): 2
libinput Button Scrolling Button Lock Enabled (347): 0
libinput Button Scrolling Button Lock Enabled Default (348): 0
libinput Middle Emulation Enabled (325): 0
libinput Middle Emulation Enabled Default (326): 0
libinput Accel Speed (327): 0.000000
libinput Accel Speed Default (328): 0.000000
libinput Accel Profiles Available (329): 1, 1, 1
libinput Accel Profile Enabled (330): 0, 1, 0
libinput Accel Profile Enabled Default (331): 1, 0, 0
libinput Accel Custom Fallback Points (332): <no items>
libinput Accel Custom Fallback Step (333): 0.000000
libinput Accel Custom Motion Points (334): <no items>
libinput Accel Custom Motion Step (335): 0.000000
libinput Accel Custom Scroll Points (336): <no items>
libinput Accel Custom Scroll Step (337): 0.000000
libinput Left Handed Enabled (338): 0
libinput Left Handed Enabled Default (339): 0
libinput Send Events Modes Available (295): 1, 0
libinput Send Events Mode Enabled (296): 0, 0
libinput Send Events Mode Enabled Default (297): 0, 0
Device Node (298): "/dev/input/event1"
Device Product ID (299): 2, 8
libinput Drag Lock Buttons (340): <no items>
libinput Horizontal Scroll Enabled (341): 1
libinput Scrolling Pixel Distance (342): 15
libinput Scrolling Pixel Distance Default (343): 15
libinput High Resolution Wheel Scroll Enabled (344): 1
The expected value for Scroll Method Enabled is 0,0,1.
Having failed to get this working the right way, I decided to try a quick-and-dirty fix. I knocked together a quick shell script to set this by running xinput. That worked great when run manually, but had no appreciable effect when run automatically either through autostart or as a systemd user service. The scrolling behavior was corrected when the service was manually started, but did nothing when run automatically.
I’m not sure if I’ve missed something while trying to configure this or if there’s something running on startup that’s stepping on my configuration. It seems odd that the libinput Scroll Method Enabled Default value is 0,0,1, but I’m not familiar enough with libinput to know what, if any, relevance that has.
Any advice would be greatly appreciated.