Files
rsi-clicker/README.md
2026-08-06 16:29:06 +00:00

150 lines
5.5 KiB
Markdown

# rsi-clicker
Scroll wheel **up** starts spamming left click. Scroll wheel **down** stops it.
Clicks are injected through `/dev/uinput`, so they enter the kernel input
stack at the same layer as your real mouse. That's why this works under
KWin/Wayland and inside Proton, where `xdotool`, `xbindkeys` and `AutoKey`
do nothing at all.
## Setup
```fish
sudo pacman -S python-evdev
install -Dm755 rsi-clicker.py ~/.local/bin/rsi-clicker
rsi-clicker --doctor
```
`--doctor` checks every requirement and prints the exact command to fix
anything that's missing. Work down its list until everything reads `[ok]`.
For reference, the full set is:
```fish
# 1. uinput at boot
echo uinput | sudo tee /etc/modules-load.d/uinput.conf
sudo modprobe uinput
# 2. let your user write to it
echo 'KERNEL=="uinput", GROUP="input", MODE="0660", OPTIONS+="static_node=uinput"' \
| sudo tee /etc/udev/rules.d/99-uinput.rules
sudo udevadm control --reload-rules && sudo udevadm trigger
# 3. let your user read real input devices
sudo usermod -aG input $USER
```
Then **log out and back in** — group membership only applies to new sessions.
No root needed after that.
## Run it
```fish
rsi-clicker
```
That's the whole thing. Wheel up, it clicks. Wheel down, it stops. It prints
`▶ clicking` / `■ stopped` so you can see the state at a glance.
## The one real gotcha: weapon swap
Darktide binds the scroll wheel to weapon swap by default. So out of the box,
wheel-up will start the clicker **and** swap your weapon. Two ways to deal
with it — pick one.
### Option A — rebind in-game (recommended)
Settings → Controls, and set weapon swap to `1` / `2` / `3` instead of the
wheel. Most players do this anyway because slot-select is faster than
cycling. Nothing else needed; run `rsi-clicker` plain.
### Option B — swallow the wheel entirely
```fish
rsi-clicker --swallow-wheel
```
This takes an exclusive kernel grab on your mouse and re-emits everything —
motion, all buttons, side buttons — through the virtual device, minus the
wheel events. The game (and everything else) simply never sees a scroll.
Worth knowing before you use it:
- Scrolling stops working **everywhere** while it runs, not just in Darktide.
That includes your browser on the other monitor. Use it for a gaming
session, not as a login service.
- If the process dies for any reason — crash, `kill -9`, power of the
universe — the kernel releases the grab automatically when the file
descriptor closes. Your mouse cannot get stuck. Ctrl+C also releases it
cleanly and prints `mouse released`.
## Options
| Flag | Does |
|---|---|
| `--doctor` | Check setup, print fixes, exit. Start here. |
| `--list` | Show input devices and which is your mouse. |
| `--button left\|right\|middle` | Which button to spam. Default `left`. |
| `--cps N` | Clicks per second. Default `11`. |
| `--jitter 0-1` | Timing variance so the cadence isn't metronomic. Default `0.12`. |
| `--hold-ms N` | How long each click is held. Default `25`. Raise to `40` if the game misses clicks. |
| `--swallow-wheel` | Option B above. |
| `--max-duration N` | Auto-stop after N seconds of continuous clicking. |
| `--panic KEY` | Instantly quit. Default `KEY_F12`. |
| `--device PATH` | Force a specific mouse if auto-detect picks wrong. |
| `-v` | Extra detail on startup. |
## Tuning for Darktide
- **11 cps** is about the ceiling of sustained human clicking and feels
natural. Higher doesn't help — most weapons have an internal fire-rate cap
and extra clicks are just discarded.
- If clicks get eaten, `--hold-ms 40`. A 25 ms press can land entirely
between two frames when framerate dips, and on the 258V's integrated Arc
graphics you'll see dips in heavy hordes.
- `--max-duration 45` is a good safety net — if you alt-tab or die while it's
running, it stops on its own instead of clicking into your desktop.
## Autostart for gaming sessions
```fish
mkdir -p ~/.config/systemd/user
printf '%s\n' \
'[Unit]' 'Description=rsi-clicker' \
'[Service]' 'ExecStart=%h/.local/bin/rsi-clicker --cps 11' \
'Restart=on-failure' \
'[Install]' 'WantedBy=default.target' \
> ~/.config/systemd/user/rsi-clicker.service
systemctl --user daemon-reload
systemctl --user start rsi-clicker
```
`systemctl --user stop rsi-clicker` when you're done. I'd avoid
`enable --now` if you're using `--swallow-wheel`, for the reason above.
## Troubleshooting
**`Permission denied` / `--list` shows nothing** — run `--doctor`. Almost
always the `input` group without a re-login. Check with `groups | grep input`.
**Wheel-up does nothing**`--list` and confirm the device marked
`MOUSE, wheel` is really your mouse; pass `--device /dev/input/eventN` if
auto-detect grabbed a touchpad or a receiver's phantom interface.
**Clicks work on desktop but not in-game**`--hold-ms 40`, and make sure the
game window has focus.
**Freespin wheel triggers erratically** — the script auto-detects high-res
wheels and accumulates to 120 units per detent, but a fully free-spinning
wheel (MX Master style) will fire multiple detents per flick. Switch the wheel
to ratcheted mode.
## Worth repeating
Fatshark's terms prohibit input automation. It's PvE so you're not affecting
anyone else's run, and kernel-level injection looks like ordinary hardware
input — but that's a risk you're choosing, not a free one. A mouse with
onboard macro firmware does the same job with nothing running at all.
And if your hand actually *hurts* rather than just getting tired, the
autoclicker is treating a symptom. Worth having someone look at it.