Add workspace screen sharing (#64)

Add workspace selection to the screen-sharing picker with pinned capture, privacy filtering and bounded capture resources. Refresh captured tab labels when title or app-ID metadata changes.
This commit is contained in:
Samuel Onoja authored and GitHub committed 2026-10-25 13:59:34 +01:00
1 parent e64ab52190
commit ab11269246
32 files changed
+2125 -165

No files matched your search

+24 -1
View File
@@ -18,6 +18,7 @@ pub(crate) mod changes;
pub(crate) struct CaptureTarget {
texture: GlesTexture,
visible: Option<smithay::backend::renderer::element::RenderElementStates>,
damage: OutputDamageTracker,
output: Output,
revision: u64,
@@ -32,9 +33,24 @@ pub(crate) struct CaptureTarget {
}
impl CaptureTarget {
pub(crate) fn surface_visible(
&self,
surface: &smithay::reexports::wayland_server::protocol::wl_surface::WlSurface,
) -> bool {
self.visible
.as_ref()
.and_then(|states| states.element_render_state(surface))
.is_some_and(crate::display_presentation::is_visible)
}
pub(crate) fn image(&self) -> (GlesTexture, u64) {
(self.texture.clone(), self.revision)
}
pub(crate) fn new(texture: GlesTexture, output: &Output) -> Self {
Self {
texture,
visible: None,
damage: OutputDamageTracker::from_output(output),
output: output.clone(),
revision: 0,
@@ -300,7 +316,7 @@ pub(super) fn render_capture<'a, E: RenderElement<GlesRenderer>>(
render_capture_with_revision(renderer, target, output, elements).map(|(target, _)| target)
}
pub(super) fn render_capture_with_revision<'a, E: RenderElement<GlesRenderer>>(
pub(crate) fn render_capture_with_revision<'a, E: RenderElement<GlesRenderer>>(
renderer: &mut GlesRenderer,
target: &'a mut Option<CaptureTarget>,
output: &Output,
@@ -349,6 +365,13 @@ pub(super) fn render_capture_with_revision<'a, E: RenderElement<GlesRenderer>>(
target.compositions += 1;
target.revision = NEXT_REVISION.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
}
if output
.user_data()
.get::<crate::handlers::workspace_capture::CaptureOutputId>()
.is_some()
{
target.visible = Some(result.states);
}
Ok((framebuffer, target.revision))
}