Support isolated live window ScreenCast streams
Render selected toplevels through a private portal-only capture protocol, preserve logical snapshot geometry, and renegotiate PipeWire video on window resizing. Bound outstanding snapshots and retry temporary contention; stop on source closure and session locking. Validation: portal unit tests (31), capture budget unit, private-bus portal contracts, and real nested/PipeWire isolation, workspace, resize, close and paused-lock tests pass. Independent review cleared. Monitor restore integration timed out on both this build and the unchanged previous compositor under the current nested host.
This commit is contained in:
1 parent
56a888adb3
commit
baca852ee9
26 files changed
+1307
-139
No files matched your search
@@ -7,8 +7,8 @@ rust-version.workspace = true
|
||||
|
||||
[features]
|
||||
default = ["client", "server"]
|
||||
client = ["dep:wayland-client"]
|
||||
server = ["dep:wayland-server"]
|
||||
client = ["dep:wayland-client", "wayland-protocols-wlr/client"]
|
||||
server = ["dep:wayland-server", "wayland-protocols-wlr/server"]
|
||||
|
||||
[dependencies]
|
||||
bitflags.workspace = true
|
||||
@@ -16,3 +16,4 @@ wayland-backend.workspace = true
|
||||
wayland-client = { workspace = true, optional = true }
|
||||
wayland-scanner.workspace = true
|
||||
wayland-server = { workspace = true, optional = true }
|
||||
wayland-protocols-wlr.workspace = true
|
||||
@@ -1,4 +1,6 @@
|
||||
fn main() {
|
||||
println!("cargo::rerun-if-changed=../../protocols/ferese-material-v1.xml");
|
||||
println!("cargo::rerun-if-changed=../../protocols/ferese-window-capture-v1.xml");
|
||||
println!("cargo::rerun-if-changed=../../protocols/ferese-effects-v1.xml");
|
||||
println!("cargo::rerun-if-changed=../../protocols/ferese-shell-v1.xml");
|
||||
}
|
||||
@@ -163,3 +163,69 @@ pub mod shell {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Private native portal window capture protocol.
|
||||
pub mod window_capture {
|
||||
/// Version 1 of the native portal window capture protocol.
|
||||
pub mod v1 {
|
||||
#[cfg(feature = "client")]
|
||||
pub use generated::client;
|
||||
#[cfg(feature = "server")]
|
||||
pub use generated::server;
|
||||
|
||||
mod generated {
|
||||
#![allow(
|
||||
dead_code,
|
||||
non_camel_case_types,
|
||||
non_upper_case_globals,
|
||||
non_snake_case,
|
||||
unused_imports,
|
||||
unused_unsafe,
|
||||
unused_variables,
|
||||
clippy::all
|
||||
)]
|
||||
|
||||
#[cfg(feature = "client")]
|
||||
pub mod client {
|
||||
use wayland_client;
|
||||
use wayland_client::protocol::*;
|
||||
use wayland_protocols_wlr::screencopy::v1::client::*;
|
||||
|
||||
pub mod __interfaces {
|
||||
use wayland_client::protocol::__interfaces::*;
|
||||
use wayland_protocols_wlr::screencopy::v1::client::__interfaces::*;
|
||||
|
||||
wayland_scanner::generate_interfaces!(
|
||||
"../../protocols/ferese-window-capture-v1.xml"
|
||||
);
|
||||
}
|
||||
use self::__interfaces::*;
|
||||
|
||||
wayland_scanner::generate_client_code!(
|
||||
"../../protocols/ferese-window-capture-v1.xml"
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(feature = "server")]
|
||||
pub mod server {
|
||||
use wayland_protocols_wlr::screencopy::v1::server::*;
|
||||
use wayland_server;
|
||||
use wayland_server::protocol::*;
|
||||
|
||||
pub mod __interfaces {
|
||||
use wayland_protocols_wlr::screencopy::v1::server::__interfaces::*;
|
||||
use wayland_server::protocol::__interfaces::*;
|
||||
|
||||
wayland_scanner::generate_interfaces!(
|
||||
"../../protocols/ferese-window-capture-v1.xml"
|
||||
);
|
||||
}
|
||||
use self::__interfaces::*;
|
||||
|
||||
wayland_scanner::generate_server_code!(
|
||||
"../../protocols/ferese-window-capture-v1.xml"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user