Difficulty Persistently Enabling Middle-Button Scrolling in libinput on ALPS DualPoint Stick

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.

The first question that needs to be asked: Which DE, and are you running a Wayland session or an Xorg session?

Sorry, should have thought to include that in the first place. I’m running KDE Plasma in an Xorg session.

I think this should proably be more like

Option "ScrollMethod" "button"
Option "ScrollButton" "2"

AFAIU it’s usually button 2 (the middle button). Without this, libinput may ignore your ScrollMethod.

With respect to the Xorg.0.log

[  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"

Xorg tries to create a second device for /dev/input/mouse0 (the raw PS/2 mouse interface), and it fails because libinput only wants /dev/input/event* devices, hence that explains why ignored.

It would have been useful for you to share your systemd user service. Anyway, something like this might be suitable…

[Unit]
Description=Set Alps DualPoint Scroll Method
After=graphical-session.target

[Service]
Type=oneshot
ExecStart=/home/user/bin/alps-scroll.sh
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/user/.Xauthority

[Install]
WantedBy=default.target

Script as follows…

#!/bin/bash
sleep 3
xinput set-prop "AlpsPS/2 ALPS DualPoint Stick" "libinput Scroll Method Enabled" 0 0 1

Installing as a desktop autostart script would probably also suffice here.

I’ve given both of these a go, and it seems that the problem’s still present. Xorg’s logfile remains substantially similar, apart from the new line acknowledging the “ScrollButton” property being set. Output from xinput is unchanged. It seems very strange to me that the Xorg config file is seemingly working fine without having any tangible effect.

On the service:
My initial service and script were very similar, but I hadn’t specified the environment in the service. I amended that per your recommendation. Running the script manually continues to work, but the service is still not doing the trick for unclear reasons:

systemctl output
user@localhost:/etc/systemd/user> systemctl --user status trackpoint-scroll
× trackpoint-scroll.service - LibInput Trackpoint Scrolling
     Loaded: loaded (/etc/systemd/user/trackpoint-scroll.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Sun 2026-02-01 09:09:38 CST; 5s ago
 Invocation: ef5dd682218a4d36856fa9bd93b1a2e7
    Process: 2711 ExecStart=/opt/enable_trackpoint_scroll.sh (code=exited, status=1/FAILURE)
   Main PID: 2711 (code=exited, status=1/FAILURE)
        CPU: 22ms

Feb 01 09:09:33 localhost.localdomain systemd[1355]: Starting LibInput Trackpoint Scrolling...
Feb 01 09:09:38 localhost.localdomain systemd[1355]: trackpoint-scroll.service: Main process exited, code=exited, status=1/FAILURE
Feb 01 09:09:38 localhost.localdomain systemd[1355]: trackpoint-scroll.service: Failed with result 'exit-code'.
Feb 01 09:09:38 localhost.localdomain systemd[1355]: Failed to start LibInput Trackpoint Scrolling.

I had some initial difficulty as I did not have a .Xauthority file in my home directory, but I worked that out and the results are now identical when run automatically or manually. The results of systemctl status are the same as what I was seeing previously with my initial attempt.

For the sake of thoroughness, I tested Leap 15.6 and Tumbleweed. This problem is also present in Tumbleweed, but not in Leap 15. The default middle-button behavior in Leap is the scrolling functionality I’m trying to achieve in Slowroll. I have not yet found a way to get Tumbleweed or Slowroll to respect my settings without manually running xinput on every reboot.

Ok, I think what happens is that the desktop environment likely applies device settings at the start of the session, effectively overwriting any system-wide options you set via the Xorg config.

I wonder if adding this as a desktop autostart script (as hinted at previously) might be sufficient to have the desired settings applied reliably…

#!/bin/bash
xinput set-prop "AlpsPS/2 ALPS DualPoint Stick" "libinput Scroll Method Enabled" 0 0 1

Refer to System Settings > System > Autostart (Add Login Script)

That was, indeed, the first thing I tried after finding that the Xorg config wasn’t working. I set autostart back up and it actually worked this time. I’m not sure what I did incorrectly on my first attempt, but that did the trick.

Glad to know this is working for you now. :slight_smile:

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.