forked from unom/punktfunk
The capture-latched client (console.rs latched_mouse) never advertises CLIENT_CAP_CURSOR, so its session resolved cursor_blend=false and asked Mutter to EMBED the pointer. On a Mutter virtual stream that is a fiction: since Mutter 48 (7ff5334a, hw-cursor inhibition removed) the software cursor overlay is suppressed stage-globally whenever any physical head realizes a HW cursor — dmabuf-recorded frames blit the view without a pointer, and cursor-only motion schedules no re-record either (mutter#4939). Probed on-glass on Mutter 50.3: embedded + relative motion = frozen frame counter; SPA_META_Cursor positions kept flowing in the same setup. So the no-channel session now takes the path that was verified end to end: cursor-as-metadata + the host composites, permanently — the same arm a channel session lands in after its capture-model flip. Embedded remains only the can't-blend fallback (libav VAAPI/NVENC, software). - session_plan::cursor_blend_for grows the no-channel arm (codec + depth in, the same CUDA-payload prediction handshake makes); gamescope excluded so patch-2+ keeps its native-NV12 zero-copy shape - the encode loop's composite refresh + one-shot breadcrumbs now cover the no-channel session; the park schedule keeps retrying while its composite is starved (relative-only clients cannot park themselves) - the compositor retarget re-applies set_hw_cursor — the rebuilt display used to come up EMBEDDED even for channel sessions - the GameStream virtual source takes the same rule (it never has a channel); its stream_body blend flag mirrors the request - punktfunk-probe grows --cursor-nochannel (the latched-capture client, headless); cursor-probe grows --dump (PPM frames + a content-change counter, the pixel evidence the embedded A/B lacked) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
28 lines
1.2 KiB
TOML
28 lines
1.2 KiB
TOML
# On-glass probe for the Linux cursor-as-metadata capture path: creates a virtual output with the
|
|
# out-of-band cursor requested (exactly like a cursor-channel session), attaches the production
|
|
# PipeWire capturer, wiggles the pointer over it via the production injector, and reports whether
|
|
# `SPA_META_Cursor` ever yields an overlay (position + bitmap). Answers "does THIS compositor
|
|
# deliver cursor metadata on a virtual output" without needing a client.
|
|
[package]
|
|
name = "cursor-probe"
|
|
description = "On-glass probe: does this compositor's virtual output deliver SPA_META_Cursor?"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
rust-version.workspace = true
|
|
license.workspace = true
|
|
authors.workspace = true
|
|
repository.workspace = true
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
pf-vdisplay = { path = "../../crates/pf-vdisplay" }
|
|
pf-capture = { path = "../../crates/pf-capture" }
|
|
pf-frame = { path = "../../crates/pf-frame" }
|
|
pf-inject = { path = "../../crates/pf-inject" }
|
|
punktfunk-core = { path = "../../crates/punktfunk-core", features = ["quic"] }
|
|
anyhow = "1"
|
|
tracing = "0.1"
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
|
|
[lints]
|
|
workspace = true
|