A top-bar widget for Omarchy that makes your touchpad precise when you move slowly and fast when you flick, for both the pointer and two-finger scrolling, with a live graph of the curves.
A single "sensitivity" setting makes every movement faster, so quickly crossing the screen and carefully selecting a line of text fight each other. libinput supports custom acceleration curves that solve this, and Hyprland exposes them, but writing the curve points by hand is fiddly. This widget gives you a few intuitive sliders instead and shows the resulting curves as you drag.
| Section | Slider | What it does |
|---|---|---|
| Pointer | Careful speed | Pointer speed when your finger moves slowly (selecting text, small moves) |
| Fast speed | Pointer speed on a quick flick across the screen | |
| Speeds up | Left = speeds up early, right = stays precise longer | |
| Two-finger scroll | Overall scroll speed | Scales all touchpad scrolling (Omarchy's scroll_factor) |
| Careful scroll / Fast scroll | Slow drag vs quick swipe | |
| Scroll speeds up | Same as above, for scrolling | |
| Terminal scroll | Touchpad scroll speed inside Alacritty / kitty / foot |
The chart shows the real curves: amplification vs finger speed, computed exactly the way libinput computes it from the points this widget generates, including the part past the last point where libinput keeps extending the curve. Each curve has three levers you can drag up and down, one per slider:
- careful (filled ring, on the curve at the first point) → Careful speed
- speeds up (ring with a bar, halfway along) → Speeds up. It shows the smooth formula's bend, so the real curve may pass slightly above or below it.
- fast (filled ring, on the curve at the last point) → Fast speed
Dragging stops only at a slider's limits, or where fast would drop below careful (the curve never slopes downwards). If the far end of the curve rises above the chart while you drag, it's clipped until you let go, then the chart rescales.
The switch in the header turns the curves off again (back to a single plain speed slider). Reset asks before restoring the defaults.
The panel behaves like Omarchy's other bar panels (clicking outside it or opening another widget closes it), but pointer movement and scrolling keep working in other windows while it's open, so you can test each change immediately. Settings apply when you let go of a slider.
omarchy plugin add https://github.com/angusforbes/omarchy-pointer-scroll --enableClick the mouse icon () in the top bar, then Set up. Setup adds one line to
~/.config/hypr/input.lua (backed up to ~/.local/share/omarchy-pointer-scroll/backups/ first):
require("hypr.pointer_scroll")Setup also creates two files of its own: ~/.config/hypr/pointer_scroll.lua (generated
Hyprland settings) and ~/.config/hypr/pointer_scroll.json (your slider values). It never replaces a
file it didn't create: if either path already exists and wasn't made by this widget, setup refuses
and changes nothing, and the panel says which file is in the way. (Its own files are recognised by a
marker: the .lua starts with a -- GENERATED by omarchy-pointer-scroll line and the .json has a
"_generator" field.)
Requirements: an Omarchy release with the Lua Hyprland config (~/.config/hypr/hyprland.lua), and python3 (standard library only; Omarchy ships it).
bin/pointer-scroll(Python, standard library only) stores your settings in~/.config/hypr/pointer_scroll.jsonand generates~/.config/hypr/pointer_scroll.lua:- a libinput
customaccel_profileandscroll_pointsfor each detected touchpad (or for all pointer devices if there is no touchpad), - the touchpad
scroll_factorand the terminal scroll multiplier, - two non-consuming mouse bindings that close the panel on a click outside it (they do nothing while the panel is closed, and the click still reaches whatever you clicked).
- a libinput
- Every change reloads Hyprland; if
hyprctl configerrorsreports a problem the change is rolled back. - Curve model: finger speed
xin libinput units/ms (1 ≈ 25 mm/s). The curve spansx = 0..8(≈ 0–200 mm/s) withnpoints, steps = 8/n:amplification(x) = carefulup to the first point, thencareful + (fast - careful) * ((x - s) / (8 - s)) ^ speeds_upup to the last point. libinput joins the points with straight lines (in output speed) and keeps extending the last segment, so hard flicks go faster still.
curve_points (default 16, range 4–32) sets how many points libinput gets per curve. More
points = a smoother curve (fewer visible corners) and a narrower flat "careful" zone at the start;
fewer points = a wider careful zone with corners. It's a settings-file option, not a slider:
~/.config/omarchy/plugins/angusforbes.pointer-scroll/bin/pointer-scroll set curve_points 8(or edit ~/.config/hypr/pointer_scroll.json and run pointer-scroll apply).
The command line works too:
~/.config/omarchy/plugins/angusforbes.pointer-scroll/bin/pointer-scroll get
~/.config/omarchy/plugins/angusforbes.pointer-scroll/bin/pointer-scroll set pointer_fast 2.2 scroll_speed 0.6~/.config/omarchy/plugins/angusforbes.pointer-scroll/bin/pointer-scroll uninstall
omarchy plugin remove angusforbes.pointer-scrolluninstall removes the require line and the generated config and reloads Hyprland; your
settings file is kept. It only deletes pointer_scroll.lua if this widget created it; if the file
is someone else's, uninstall leaves both it and the require line alone.
MIT
