| Files | Last commit | Last update |
|---|---|---|
capture: iPhone target narrated by Hex's microphone, and CaptureSnapshot.phone CaptureTarget::Phone records the first cabled iPhone through scrawl-helper's mirror with --no-microphone; the phone finish takes Hex's timeline audio (moved onto the movie's clock) and Hex's transcriber instead of the movie's. CaptureSnapshot.phone comes from a capture-phone look at each start and on CaptureCommand::FindPhone. A mirror that ends on its own finishes its capture. HEX_CAPTURE builds add NSCameraUsageDescription; validate-app refuses it. | 11 days ago | |
dev green: split capture_host routing session naming, regenerate labs link goldens (#1339) * split session naming out of capture_host/routing.rs * regenerate the mac-labs-link goldens for the live auto-scroll lab (#1334) * capture: Linux frames are pixels too in the capture size test * fmt | 2 days ago | |
Annotate on X11: record the screen and areas without a ScreenCast portal (#690) (#694) On an X11 session (DISPLAY set, WAYLAND_DISPLAY empty; never XWayland) Screen and Area are read from the X server: MIT-SHM GetImage each frame (plain GetImage without it), the pointer blended in from XFixes, 30 fps to x264 through ffmpeg. The screen is the RandR monitor under the pointer; `hex annotate start --area X,Y,W,H` records an area. i3 and other desktops without a ScreenCast backend now get video. A Window still needs the portal's picker and fails saying to record the screen or an area, never widening to the screen. When X11 capture can't start (no display, unusual depth, no ffmpeg/x264) the capture fails at once with why in the capsule instead of writing one with no picture. Checked in a headless Xvnc + i3 session on apollo with no ScreenCast portal: an 800x500 area recorded 154 frames over 5.1 s, the 1920x1080 screen 153, each with a keyframe and the cursor. Also fixes scrawl-capture's own tests, which no longer compiled (ScreenCaptureSession.failure). Reported and diagnosed by @nefthy. | 6 days ago | |
Import scrawl-capture into crates/capture Copy Scrawl's `crates/capture` from kitlangton/scrawl, branch `engine/split`, commit e351ddb28be47c77481cb6821cc72d7f8fe7c769 (e351ddb), without history, keeping the package name `scrawl-capture`, and its `docs/app-handover-spec.md` as `docs/plans/capture-handover-spec.md`. Hex depends on it by path instead of the Git pin at 86d7d6c; the Nix `outputHashes."scrawl-capture-0.3.13"` entry goes. Workspace: `crates/capture` is in `[workspace] exclude`, so `cargo build`, `cargo test`, and `--workspace` never build it (Linux, Windows, and Nix included). It compiles only as the `capture` feature's macOS dependency, sharing the root Cargo.lock and target/. The root package stays a member without being listed, since listing "." defeats `exclude`. On macOS `scripts/check` and the macOS workflow name it (`-p voice-control -p scrawl-capture --features capture`) to lint and test its 257 tests. API adaptations in capture_host: - `Finished` gains `gaps` and `missing_transcript`; the host records them and `hex capture status` (human and JSON `last`) shows them. - `Engine::new` bridges the crate's log to `Host::log` when no sink is set, so Hex's own `TracingLog` sink goes and each line is logged once. - Scrawl now writes its bundle files 0600; Hex still tightens recording.mp4, the window log, and folders. - Nothing on Hex's path reads ~/.config/scrawl or writes under Application Support/scrawl: the crate does that only after `enable_scrawl_host_defaults`/`enable_file_log`, which Hex never calls. Scrubbed (synthetic values): a file:///Users/<name> path in ax.rs, the com.kitlangton.UpDown / dev.kitlangton.UpDown test bundle IDs in handoff.rs and phone.rs (now com.example.UpDown), and a personal device name in a phone.rs test. Kept: Scrawl's own product IDs (dev.kitlangton.scrawl, .helper) and its public GitHub releases URL. fmt and clippy -D warnings, no behaviour change: `cargo fmt` on five files; `chunks_exact(N)` to `as_chunks::<N>()` (19 sites); collapsed `if let` chains in capture/macos.rs and pipeline.rs and a `match` in page.rs; `type` aliases for a drag start and two ingest hooks; explicit lower bounds on two test `match` range arms in keyframes.rs; `slice::from_ref` for two one-element slices; `and_then` for `map().flatten()`; a dropped `to_owned`; `#[allow]` for one `too_many_arguments` and one `single_range_in_vec_init`. | 12 days ago |