# 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.