A desktop entry that was edited in place is left alone once it carries the marker, and the only thing that ever writes it again is the undo a change of flags goes through - which reads the ledger. So an entry the ledger has lost is one nothing looks at any more: it keeps whatever an older version put on its command line, and an update that moves browsers to a different flag moves every browser but that one. The copy taken before the edit is named after the path, not recorded in the ledger, and is still there. A marked entry with no ledger line is now put back from that copy and written again from scratch, which is the same thing the undo would have done, and it lands in the ledger on the way out. Only entries edited in place need this. A generated entry is built from the source entry every time and is right by construction, and a flag file has its block rewritten whenever the contents differ.
middleclick-autoscroll
Middle-click autoscroll is a CLI for Linux that enables autoscroll in every application that supports it. Works with browsers, Electron apps like Discord and Spotify, Steam, and anything else that runs on Chromium under the hood.
There is no app list. My tool just looks at what uses chromium under the hood and applies the necessary steps to get it working.
How to install
Arch
yay -S middleclick-autoscroll
Fedora
sudo curl -fsSL -o /etc/yum.repos.d/middleclick-autoscroll.repo \
https://felitendo.github.io/middleclick-autoscroll/middleclick-autoscroll.repo
sudo dnf install middleclick-autoscroll
Debian
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://felitendo.github.io/middleclick-autoscroll/KEY.gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/middleclick-autoscroll.gpg
echo "deb [signed-by=/etc/apt/keyrings/middleclick-autoscroll.gpg] https://felitendo.github.io/middleclick-autoscroll/deb ./" \
| sudo tee /etc/apt/sources.list.d/middleclick-autoscroll.list
sudo apt update && sudo apt install middleclick-autoscroll
openSUSE
sudo rpm --import https://felitendo.github.io/middleclick-autoscroll/KEY.gpg
sudo zypper addrepo --gpgcheck --refresh \
https://felitendo.github.io/middleclick-autoscroll/rpm middleclick-autoscroll
sudo zypper install middleclick-autoscroll
How to use
Just run middleclick-autoscroll. This will open the configuration TUI that looks like this:
Middle-Click Autoscroll
Autoscroll ON
Applications covered 11 of 13
Not identified 1 - see the applications list
Steam ON
New applications ON
Last applied 2 minutes ago
Applications pick this up the next time they are started.
[1] Turn autoscroll on or off
[2] Re-apply everything
[3] Applications
[4] Settings
[q] Quit
>
[1] is all you need for the normal case. [3] lists every app that was found
and what is being done with it, so you can leave a single one out or switch on
an AppImage that couldn't be identified:
Applications
▸ Steam on (Steam)
Chromium on (launcher)
Discord on (flag file)
Obsidian on (launcher)
Spotify on (launcher)
Slack off
Cursor cannot tell
Anything not identified is left alone until it is turned on here.
Up/Down select - Space turns one on or off - q goes back
[4] has the same switches per category - browsers, Electron and CEF apps,
Flatpaks, snaps, autostart entries, Steam, Spotify - plus a field for extra
Chromium arguments.
How it works
Blink (the engine in Chromium, Electron, and CEF) already has autoscroll, but it's off on Linux because middle click does primary-selection paste there. This flag turns it on:
--enable-blink-features=MiddleClickAutoscroll
But doing that for every app is kinda bothersome and it also might break with updates. That's why I created this small tool to automate that.
Browsers get the same thing asked for differently:
--enable-features=MiddleClickAutoscroll
Both mean the same feature - Blink generates a matching feature name for each of
its runtime flags - but the first one is on Chromium's list of flags worth
warning about, so a browser started with it shows a yellow "unsupported
command-line flag" bar over every page. The second one is not on that list, so
there's no bar. It only works from Chromium 124 on, which is why apps that
embed something older (Steam's CEF, older Electron) keep the first one - they
have no such bar to begin with. Helium, which carries the feature under its own
name, is asked for HeliumMiddleClickAutoscroll alongside it.
New apps are picked up by a systemd path unit that watches the
relevant directories. Without systemd, middleclick-autoscroll apply does the
same thing manually.
Steam
Steam's web UI supports autoscroll but has no way to pass extra arguments to its helper, so the program patches the script that starts it. Steam checks its own files against its manifest - by size and timestamp - and reinstalls the whole client package over anything that differs, so the patch is written to look unchanged: the bytes the argument costs are taken back out of the script's comments and the timestamp is put back.
If that can't be done - a script with no comments left to pay for the argument, or one this version doesn't recognise - nothing is written and Steam is left alone. A file of the wrong length costs the client package downloaded and installed again, and a Steam that quits at the end of it instead of coming up; no autoscroll in Steam is the smaller problem. Nothing is added to Steam's launcher entry or to the shortcuts it writes for games, and Steam keeps repairing its own installation.
Commands
| Command | |
|---|---|
middleclick-autoscroll |
Interactive menu |
… enable |
Turn on, apply, start watching |
… disable |
Undo everything |
… apply |
Apply to new apps |
… apply --rebuild |
Redo from scratch |
… status |
What's covered |
… list |
All apps and how they're handled |
Building from source
make
sudo make install
Optionally needs msgfmt (gettext) for translations and scdoc for the man
page. Supports PREFIX and DESTDIR. make check runs syntax checks and
shellcheck.
See packaging/README.md for release builds and repo signing.
License
GPL-3.0-or-later.