mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-05-15 06:06:07 -06:00
[PR #425] feat(scroll): receiver natural-scroll toggle + wlroots axis_source + macOS v120 fix #417
Labels
No labels
Xorg
documentation
enhancement
macos
pull-request
question
windows
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/lan-mouse#417
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/feschber/lan-mouse/pull/425
Author: @jondkinney
Created: 5/6/2026
Status: 🔄 Open
Base:
main← Head:split/06-scroll📝 Commits (10+)
31298f2feat: cross-platform wall-press auto-release fallbackbffbef0proto: add Bounds(width, height) event variant2219f45feat(emulation): display_bounds + warp_cursor for all backends5de5016feat(emulation): send Bounds + warp cursor on Enter68fab55feat(capture): cache peer bounds and use as wall-press upper clamp944e758ui: wrap window content in GtkScrolledWindow56f7730ui: rename Auto-Release group to scope it to outgoing capturecd63f5dfix: preserve cross-axis cursor position across machine transitions2571b47fix(capture/layer_shell): report screen-space cursor position on Entercbe2ec1fix(capture): warp host cursor to guest position on release📊 Changes
50 files changed (+4457 additions, -590 deletions)
View changed files
➕
.claude/scheduled_tasks.lock(+1 -0)📝
.gitignore(+1 -0)📝
Cargo.lock(+494 -204)📝
Cargo.toml(+5 -1)📝
input-capture/Cargo.toml(+1 -0)📝
input-capture/src/dummy.rs(+2 -2)📝
input-capture/src/layer_shell.rs(+67 -17)📝
input-capture/src/lib.rs(+574 -11)📝
input-capture/src/libei.rs(+5 -2)📝
input-capture/src/macos.rs(+257 -20)📝
input-capture/src/windows.rs(+1 -1)📝
input-capture/src/windows/event_thread.rs(+66 -12)📝
input-capture/src/x11.rs(+1 -1)📝
input-emulation/src/lib.rs(+49 -0)📝
input-emulation/src/libei.rs(+49 -2)📝
input-emulation/src/macos.rs(+110 -1)📝
input-emulation/src/windows.rs(+41 -4)📝
input-emulation/src/wlroots.rs(+219 -5)📝
input-emulation/src/x11.rs(+38 -1)📝
input-emulation/src/xdg_desktop_portal.rs(+13 -1)...and 30 more files
📄 Description
Summary
Four scroll-handling fixes that together make trackpad and mouse-wheel forwarding behave correctly across natural/classic preference combinations.
macOS capture (
dc09e88): Wire convention canonicalized to classic mouse-wheel direction regardless of the user's macOS Natural Scrolling preference (read viaCFPreferencesCopyAppValue). Without a fixed wire convention, the receiver-side toggle has no stable reference. Opposite of #415, which negated unconditionally and traded the bug for the opposite-preference user.wlroots emulation (
a26ae8b): Continuous-scroll events (trackpad) were silently dropped by Hyprland/Sway/GNOME-Shell because theaxis()event lacked a companionaxis_sourcein the samewl_pointer.frame. Spec calls it a "hint"; in practice it's load-bearing for continuous scroll. One extra emit per axis frame fixes it.Receiver-side
Natural scrollingtoggle (9ed25b0): New GUI preference, off by default — wire is classic, receiver re-inverts. Mirrors libinput'snatural_scroll, applied to forwarded events specifically (which on Wayland bypass libinput).macOS line→tick mapping (
19d36bf): Capture used to map one macOS scroll-line to 40 v120 units (1/3 of a wheel tick), so receivers using the discrete count (Slack via XWayland, terminals readingaxis_value120) needed 3+ notches before any scroll registered. macOS already amplifiesSCROLL_WHEEL_EVENT_DELTAby velocity, so one line should map directly to one full v120 tick. Slow-notch and fast-flick behavior is now symmetric across native-Wayland and XWayland clients.Test plan
axis_value120 = 120event on the wireSplit out from #418, the umbrella PR collecting ~10 independent feature areas. This PR is the scroll-handling subset. See #418 for the full picture.
Stack overview
These PRs are split out from #418 and stack in this order:
Each PR's branch builds on the previous one, so until earlier PRs are merged the cumulative diff against
mainincludes all preceding work. Reviewing in order is easiest.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.