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