Repository navigation
Move the cursor with the radar - #1050
Merged
Merged
Conversation
Choosing an area takes the pointer to its centre, where it stays while the beam turns. During the distance it follows the marker, at most once a tick and only when the target pixel changes, using the same display units as the final move. Back, cancel and the session ending leave it where it is. The beam no longer draws its own tip marker under the pointer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
enaboapps
marked this pull request as ready for review
October 13, 2026 17:02
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1047
What changed
scan_radar.rs: newRadar::follow()gives the pointer position only when it differs from the position last sent. During the Angle phase that is the chosen area's centre. During Distance it is the marker'starget(), the same rounded and clamped display-unit point the final move already uses. While an area is being picked it returns nothing.choose_area(back or exhaustion) clears the last sent position, so choosing an area again re-centres the pointer and nothing snaps back.point_workflow.rs:Stage::MouseRadarreturnsMouseMoveAbsolutefromhandlewhen an action moves the target. That covers picking an area and manual distance steps. The tick path (advance) sets it aspending, the same route the mouse move repeat uses, so there is at most one move per tick. An exhausted pass goes back without moving.docs/point-scan.md: describes the pointer following the radar, the tick-rate limit and unit conversion, and that back, cancel and the session ending leave the pointer where it is. The Settings status copy ("Choose an area, then a direction, then a distance, to move the pointer") is still accurate, so I left it unchanged.Judgement calls
repeat_stopped. It also corrects any drift if the physical mouse was nudged.move_pointer_pixels_absolutehas no drag guard (unlikemove_pointer_absolute), so a held button stays down and drags with each follow move. Release still happens only through the existing cleanup paths. If a follow move fails, the runtime's existingexecution_failed+cleanuppath drops the radar and releases input, the same as a failed final move.advancedoes not run then. Manual steps while paused still move the pointer, since they are explicit actions.set_mouse_areadoes not see a display change and end the radar mid-sweep.Validation (Windows, Node 24, Rust 1.97.1)
npm run lint: passnpm test: 13 files / 295 tests passed; node tests 12 passed, 0 failednpm run build: passcargo fmt --check: passcargo clippy --all-targets -D warnings: passcargo test: 773 passed, 0 failed, 5 ignored (+7 passed in the second binary). That includes 20 radar tests, 2 of them new:scan_radar::...the_pointer_follows_the_centre_then_the_marker_only_when_it_movesandscan_executor::...radar_takes_the_fake_pointer_along_and_never_snaps_it_back.Fakeinjector. They assert the exact sequence of fake moves:npm run prediction-modelwas not run: it fails locally with an EPERM rename lock that is unrelated to this change. The gitignoredsrc-tauri/resources/prediction-model,prediction-neuralandsrc-tauri/binarieswere copied from the main checkout to build.Needs a real-device check
The pointer following the radar, a held drag, and scaled or negative-coordinate displays need checking on real Windows and macOS hardware (
npm run macos:runfor Accessibility).Review- Independent review of
4dcbc3efound the code sound: no feedback loops from synthetic moves, drag released by every cleanup path, and tests use fake input only. Its one finding, a stale docs sentence, is fixed in4376f3f. A second independent review of4376f3freported no actionable findings.- Extra real-device checks: the pointer briefly touches the display edge on each automatic distance pass, which may trigger hot corners or an auto-hidden taskbar or Dock. A held drag passing over folders may trigger spring-loaded folders.🤖 Generated with Claude Code