diff --git a/libs/scrap/src/wayland/pipewire.rs b/libs/scrap/src/wayland/pipewire.rs index 844e8eead..6277ed97c 100644 --- a/libs/scrap/src/wayland/pipewire.rs +++ b/libs/scrap/src/wayland/pipewire.rs @@ -16,9 +16,10 @@ use gstreamer as gst; use gstreamer::prelude::*; use gstreamer_app::AppSink; +use hbb_common::config; + use super::capturable::PixelProvider; use super::capturable::{Capturable, Recorder}; - use super::pipewire_dbus::{OrgFreedesktopPortalRequestResponse, OrgFreedesktopPortalScreenCast}; #[derive(Debug, Clone, Copy)] @@ -130,6 +131,7 @@ impl PipeWireRecorder { let src = gst::ElementFactory::make("pipewiresrc", None)?; src.set_property("fd", &capturable.fd.as_raw_fd())?; src.set_property("path", &format!("{}", capturable.path))?; + src.set_property("keepalive_time", &1_000.as_raw_fd())?; // For some reason pipewire blocks on destruction of AppSink if this is not set to true, // see: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/982 @@ -384,6 +386,8 @@ fn streams_from_response(response: OrgFreedesktopPortalRequestResponse) -> Vec

= 4 { + let restore_token = config::LocalConfig::get_option(RESTORE_TOKEN_CONF_KEY); + if !restore_token.is_empty() { + args.insert( + RESTORE_TOKEN.to_string(), + Variant(Box::new(restore_token)), + ); + } + // persist_mode may be configured by the user. + args.insert( + "persist_mode".to_string(), + Variant(Box::new(2u32)), + ); + } + } args.insert( "handle_token".to_string(), Variant(Box::new("u2".to_string())), @@ -476,12 +502,24 @@ fn request_screen_cast( c, path, move |r: OrgFreedesktopPortalRequestResponse, c, _| { + let portal = get_portal(c); + if let Ok(version) = portal.version() { + if version >= 4 { + if let Some(restore_token) = r.results.get(RESTORE_TOKEN) { + if let Some(restore_token) = restore_token.as_str() { + config::LocalConfig::set_option( + RESTORE_TOKEN_CONF_KEY.to_owned(), + restore_token.to_owned(), + ); + } + } + } + } streams .clone() .lock() .unwrap() .append(&mut streams_from_response(r)); - let portal = get_portal(c); fd.clone().lock().unwrap().replace( portal.open_pipe_wire_remote(session.clone(), HashMap::new())?, ); diff --git a/src/server/video_service.rs b/src/server/video_service.rs index d59c1cd5c..2fc2d2f43 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -599,18 +599,13 @@ fn run(sp: GenericService) -> ResultType<()> { } try_gdi += 1; } - #[cfg(target_os = "linux")] { would_block_count += 1; if !scrap::is_x11() { - if would_block_count >= 1000 { - // For now, the user should choose and agree screen sharing agiain. - // to-do: Remember choice, attendless... - // super::wayland::release_resouce(); - // bail!("Wayland capturer none 100 times, try restart captuere"); - log::error!("Wayland capturer none 1000 times, try restart captuere"); - would_block_count = 0; + if would_block_count >= 100 { + super::wayland::release_resouce(); + bail!("Wayland capturer none 100 times, try restart captuere"); } } } diff --git a/src/server/wayland.rs b/src/server/wayland.rs index 7fd6f106b..22134cdff 100644 --- a/src/server/wayland.rs +++ b/src/server/wayland.rs @@ -241,6 +241,7 @@ pub(super) fn get_display_num() -> ResultType { } } +#[allow(dead_code)] pub(super) fn release_resouce() { if scrap::is_x11() { return;