ipc: Add pw_node_id to PipeWire Casts

This commit is contained in:
Ivan Molodetskikh
2026-01-14 17:48:30 +03:00
parent e546b339a3
commit 9015ff8e36
4 changed files with 20 additions and 1 deletions
+5
View File
@@ -1509,6 +1509,11 @@ pub struct Cast {
/// ///
/// Currently, only wlr-screencopy screencasts can have a pid. /// Currently, only wlr-screencopy screencasts can have a pid.
pub pid: Option<i32>, pub pid: Option<i32>,
/// PipeWire node ID of the screencast stream.
///
/// This is `None` for wlr-screencopy casts, and also for PipeWire casts before the node is
/// created (when the cast is just starting up).
pub pw_node_id: Option<u32>,
} }
/// Kind of screencast. /// Kind of screencast.
+4
View File
@@ -768,6 +768,10 @@ fn print_cast(cast: &Cast) {
if let Some(pid) = cast.pid { if let Some(pid) = cast.pid {
println!(" PID: {pid}"); println!(" PID: {pid}");
} }
if let Some(node_id) = cast.pw_node_id {
println!(" PipeWire node ID: {node_id}");
}
} }
fn fmt_rounded(x: f64) -> String { fn fmt_rounded(x: f64) -> String {
+7 -1
View File
@@ -830,6 +830,7 @@ impl State {
is_dynamic_target: true, is_dynamic_target: true,
is_active: false, is_active: false,
pid: None, pid: None,
pw_node_id: None,
}; };
events.push(Event::CastStartedOrChanged { cast }); events.push(Event::CastStartedOrChanged { cast });
} }
@@ -840,9 +841,12 @@ impl State {
let stream_id = cast.stream_id.get(); let stream_id = cast.stream_id.get();
seen.insert(stream_id); seen.insert(stream_id);
let pw_node_id = cast.node_id();
if state.casts.get(&stream_id).is_none_or(|existing| { if state.casts.get(&stream_id).is_none_or(|existing| {
// Only these properties can change. // Only these properties can change.
existing.is_active != cast.is_active() || !cast.target.matches(&existing.target) existing.is_active != cast.is_active()
|| !cast.target.matches(&existing.target)
|| existing.pw_node_id != pw_node_id
}) { }) {
let cast = niri_ipc::Cast { let cast = niri_ipc::Cast {
session_id: cast.session_id.get(), session_id: cast.session_id.get(),
@@ -852,6 +856,7 @@ impl State {
is_dynamic_target: cast.dynamic_target, is_dynamic_target: cast.dynamic_target,
is_active: cast.is_active(), is_active: cast.is_active(),
pid: None, pid: None,
pw_node_id,
}; };
events.push(Event::CastStartedOrChanged { cast }); events.push(Event::CastStartedOrChanged { cast });
} }
@@ -886,6 +891,7 @@ impl State {
is_dynamic_target: false, is_dynamic_target: false,
is_active: true, is_active: true,
pid: queue.credentials().map(|creds| creds.pid), pid: queue.credentials().map(|creds| creds.pid),
pw_node_id: None,
}; };
events.push(Event::CastStartedOrChanged { cast }); events.push(Event::CastStartedOrChanged { cast });
} }
+4
View File
@@ -819,6 +819,10 @@ impl Cast {
self.inner.borrow().is_active self.inner.borrow().is_active
} }
pub fn node_id(&self) -> Option<u32> {
self.inner.borrow().node_id
}
pub fn ensure_size(&self, size: Size<i32, Physical>) -> anyhow::Result<CastSizeChange> { pub fn ensure_size(&self, size: Size<i32, Physical>) -> anyhow::Result<CastSizeChange> {
let mut inner = self.inner.borrow_mut(); let mut inner = self.inner.borrow_mut();