Inspector Cursor tab — ED.19
In a screen recording the cursor is the only performer on stage — and like
any performer it reads better with a little grooming. Scaled up so it's
findable, its motion smoothed the way a fluid-head dolly tames handheld
jitter, a ripple on each click the way a clapperboard's snap marks the
action, and politely off-stage when it isn't doing anything. ED.19 is the
cursor's dressing room: a panel that edits one
CursorConfig on the
project.
flowchart LR CTL["size / smoothing / ripples /\nhide-static / auto-zoom"] --> OP["EditOp::SetCursor"] OP --> H["edit::History.apply"] H --> CUR["project.cursor"] CUR --> OVL["cursor overlay at render,\ndriven by the cursor track"]
The CursorInspector
exposes size (clamped to a sane 25–400 %), smoothing, and three toggles —
click ripples, hide-when-static, and auto-zoom on clicks (the switch that
feeds ED.17). Each reads the current config, changes
one field, and commits a SetCursor through the shared History. Because
CursorConfig is Copy, the op is a plain field assignment — the
by-reference apply refactor ED.18 introduced for the
non-Copy background config carries it for free.
The overlay at render
The composited cursor is a single wisp Graphics node drawn over the
framed screen by
EditorPreview::render_framed_with_cursor,
driven by the recorded cursor track (EditProject::cursor_track):
- a scaled, dark-outlined white arrow pointer (a single convex
draw_polygonquad — tip, left edge, tail point, right barb — sized bysize_pct), - expanding, fading click ripples (
draw_ellipsediscs) at each recent click, radius growing + alpha decaying across a ~0.4 s window (ripples_at), - smoothing as a pure EMA over the track
(
cursor_at), - hide-when-static: a parked pointer fades off-stage
(
cursor_is_static), but a live click ripple keeps it visible — a click is an action worth showing even when the cursor hasn't moved.
The captured position is normalized to the source frame, so the overlay is mapped through the same crop / zoom / padding transform as the screen sprite — the pointer stays glued to the exact pixel it was over and magnifies with the auto-zoom punch-in, rather than drifting off the button it clicked. A GPU test asserts the same source point lands further from centre under a zoom (rides-the-transform, not output-space pinning).
The overlay renders from a recorded or synthetic track (and is tested
with a synthetic one, so it's gate-green without real capture). The recorded
track is produced by the per-OS telemetry capture in
ED.17. The pointer is a vector arrow glyph and
hide_static is honored at render; a pixel-sampled native cursor bitmap
remains a possible future nicety, not a gap.