Everything from the air side of lan-mouse that was living only on that machine, plus corrections to what this repo already said. New: handoff/patch/ is a two-line source patch making the daemon forward the ACCELERATED pointer deltas. Upstream 0.11.0 forwards dx_unaccel and discards the accelerated pair in the same event, and the wlr receiver applies no curve either, so remote motion arrives with the sender's acceleration stripped and nothing replacing it -- and sensitivity / accel_profile are inert on both ends, so no config can fix it. The patch also adds LAN_MOUSE_POINTER_SCALE for the residual logical-ppi gap (0.7 for air's 140.1ppi against the LG's ~95.8). install.sh builds it per-machine; the unit now runs the result. This laptop is still unpatched, so its forwarded motion is still wrong until the handoff step runs here. New: install.sh --handoff opens 4242/udp for the peer in ufw. ufw is default-deny inbound and a dropped inbound packet presents IDENTICALLY to a bad certificate; this cost a day. Nothing in the repo covered it. Fixed: cmd_restart bypassed the systemd unit with pkill + uwsm-app, which races Restart=on-failure and can leave two daemons on 4242. It now prefers the unit, matching what cmd_log already assumed, and keeps the hand-start path only for when no unit exists. Documented, and this was the actual root cause of a day of dead crossings: fingerprints are CASE-SENSITIVE. lan-mouse generates them lowercase and compares with a plain map lookup, while openssl prints uppercase and cli authorize-key stores what it is handed. An uppercase digest is the right digest, valid TOML, non-empty, passes every guard, and never matches -- the handshake dies bad_certificate. Also documented: authorization is receiver-side only (connect.rs sets insecure_skip_verify), so each direction depends solely on the receiver's list and a sender cannot tell whether it is talking to the real peer. Corrected: README claimed the unknown-device* accel rule was needed because the receiver double-accelerates already-accelerated deltas. That is backwards and the rule is a measured no-op -- the device matches, but sensitivity and accel_profile are libinput settings and a wlr-virtual-pointer is not a libinput device. Measured on both machines: 398x198px travel at sensitivity 0 and identical at -0.9, exactly 1:1. Lines kept (harmless, and the naming note is worth having) with the real mechanism written down. ~/.config/lan-mouse/ stays out of the repo as before; handoff/config/ holds example configs carrying the backend, edge and lowercase rules instead. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LrgrMhPG8CTo9XZF326rjZ
2.7 KiB
Patched lan-mouse — forward accelerated pointer deltas
Why
Upstream lan-mouse 0.11.0 (input-capture/src/layer_shell.rs) captures pointer motion from
zwp_relative_pointer_v1 and forwards the unaccelerated deltas:
dx_unaccel: dx,
dy_unaccel: dy,
..
The .. discards the accelerated dx/dy carried in the same event. The receiving end emulates
through wlr-virtual-pointer, which is not a libinput device and therefore applies no
acceleration curve of its own. Net effect: the sender's acceleration curve is stripped in transit
and nothing replaces it, so the pointer is far too fast on the remote machine.
Critically, this also means sensitivity / accel_profile are inert for forwarded motion on
both ends — the receiver because a virtual pointer isn't a libinput device, the sender because
unaccelerated deltas bypass the curve by definition. There is no configuration fix; that is why
this patch exists.
What the patch does
- Forwards the accelerated
dx/dyinstead. This restores the sending machine's curve, and makes the sender'ssensitivity/accel_profileactually control how the remote pointer feels. - Adds
LAN_MOUSE_POINTER_SCALE(float, default1.0) as a multiplier, for the residual difference in logical pixel density between the two screens. Unset = upstream scaling.
Rebuild
git clone https://github.com/feschber/lan-mouse.git
cd lan-mouse
git checkout 0d2190e787db9e482e17d4c16fb7c00ef4841bcb # == Arch extra 0.11.0-1
git apply ~/.local/share/lan-mouse-patched/accelerated-deltas.patch
CARGO_PROFILE_RELEASE_LTO=false CARGO_PROFILE_RELEASE_CODEGEN_UNITS=16 \
cargo build --release --locked --no-default-features \
--features layer_shell_capture,wlroots_emulation
install -m755 target/release/lan-mouse ~/.local/bin/lan-mouse-patched
systemctl --user restart lan-mouse
Build deps: rust (installed from Arch extra). GTK is deliberately excluded — the daemon does
not need the GUI, and the signed package at /usr/bin/lan-mouse still provides it.
Install layout
- Patched daemon:
~/.local/bin/lan-mouse-patched(named so it cannot shadowlan-mouseon PATH) - Unit:
~/.config/systemd/user/lan-mouse.service->ExecStartpoints at the patched binary - The signed Arch package stays installed and untouched; no pacman divergence, no
IgnorePkg. - Cert/config path is unchanged (
~/.config/lan-mouse/), so the DTLS fingerprint is unchanged and the peer's[authorized_fingerprints]still matches.
Upstreaming
Worth reporting to https://github.com/feschber/lan-mouse — the unaccel choice is defensible when the receiver applies its own acceleration, but no Wayland emulation backend in lan-mouse does.