fix(linux/vdisplay): mutter virtual monitor ships the cursor as SPA_META_Cursor
RecordVirtual was created with cursor-mode EMBEDDED, which never delivers cursor metadata — the cursor channel had nothing to forward (client-drawn cursor invisible) and the always-built encoder blend had nothing to composite (host-drawn cursor invisible too). Metadata mode feeds both: non-forwarding sessions get the blended pointer (same pixels Mutter would have embedded), forwarding sessions strip the overlay and send shape/state. The capturer already negotiates the meta on every stream (meta_param). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -46,8 +46,13 @@ const BUS_DC: &str = "org.gnome.Mutter.DisplayConfig";
|
|||||||
/// e.g. when our virtual output is torn down — so we never persist a layout to monitors.xml).
|
/// e.g. when our virtual output is torn down — so we never persist a layout to monitors.xml).
|
||||||
const APPLY_TEMPORARY: u32 = 1;
|
const APPLY_TEMPORARY: u32 = 1;
|
||||||
|
|
||||||
/// Mutter cursor mode: render the cursor into the stream (matches the KWin/gamescope backends).
|
/// Mutter cursor mode: ship the pointer as `SPA_META_Cursor` metadata instead of burning it into
|
||||||
const CURSOR_EMBEDDED: u32 = 1;
|
/// the frames. The capturer always negotiates the meta (pf-capture `meta_param`) and the encoder
|
||||||
|
/// blend composites it for sessions where the client does not draw the cursor itself — while a
|
||||||
|
/// cursor-forwarding session strips the overlay and sends shape/state over the cursor channel.
|
||||||
|
/// Embedded mode would leave BOTH paths blind: no metadata means nothing to forward AND nothing
|
||||||
|
/// to blend, and Mutter's own embedded painting is what the pre-channel path relied on.
|
||||||
|
const CURSOR_METADATA: u32 = 2;
|
||||||
|
|
||||||
/// Serializes, process-wide, every Mutter operation that adds/removes a virtual monitor or applies
|
/// Serializes, process-wide, every Mutter operation that adds/removes a virtual monitor or applies
|
||||||
/// a monitor configuration. Each of these makes Mutter rebuild its monitor topology, and
|
/// a monitor configuration. Each of these makes Mutter rebuild its monitor topology, and
|
||||||
@@ -424,7 +429,7 @@ async fn connect(mode: Mode, preferred_scale: Option<f64>) -> Result<MutterSessi
|
|||||||
// once gated behind PUNKTFUNK_MUTTER_VIRTUAL_REFRESH; the stop-screencast-before-any-monitor-
|
// once gated behind PUNKTFUNK_MUTTER_VIRTUAL_REFRESH; the stop-screencast-before-any-monitor-
|
||||||
// reconfig teardown below fixed the crash, so pinning the client's refresh is now the default.)
|
// reconfig teardown below fixed the crash, so pinning the client's refresh is now the default.)
|
||||||
let mut rec: HashMap<&str, Value> = HashMap::new();
|
let mut rec: HashMap<&str, Value> = HashMap::new();
|
||||||
rec.insert("cursor-mode", Value::from(CURSOR_EMBEDDED));
|
rec.insert("cursor-mode", Value::from(CURSOR_METADATA));
|
||||||
if mode.refresh_hz > 60 || preferred_scale.is_some() {
|
if mode.refresh_hz > 60 || preferred_scale.is_some() {
|
||||||
let mut vmode: HashMap<&str, Value> = HashMap::new();
|
let mut vmode: HashMap<&str, Value> = HashMap::new();
|
||||||
vmode.insert("size", Value::from((mode.width, mode.height)));
|
vmode.insert("size", Value::from((mode.width, mode.height)));
|
||||||
|
|||||||
Reference in New Issue
Block a user