From 5a82cab03e077d98495f7679955d7b102963586b Mon Sep 17 00:00:00 2001 From: oiupoyt Date: Tue, 1 Sep 2026 16:58:34 +0530 Subject: [PATCH] Fix ashpd 0.13 API changes for Wayland screencast setup --- Cargo.lock | 1 + Cargo.toml | 2 +- src/capture/wayland.rs | 30 +++++++++++++++--------------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3a7fc37..74db665 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,6 +37,7 @@ dependencies = [ "futures-util", "getrandom", "serde", + "serde_repr", "tokio", "zbus", ] diff --git a/Cargo.toml b/Cargo.toml index 043e469..583cc90 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2024" [dependencies] -ashpd = "0.13.13" +ashpd = { version = "0.13.13", features = ["screencast"] } libc = "0.2.189" memmap2 = "0.9.11" minifb = "0.28.0" diff --git a/src/capture/wayland.rs b/src/capture/wayland.rs index b561021..78c6892 100644 --- a/src/capture/wayland.rs +++ b/src/capture/wayland.rs @@ -1,7 +1,7 @@ use crate::capture::{Frame, FrameSource}; -use ashpd::desktop::screencast::{CursorMode, PersistMode, Screencast, SourceType}; -use ashpd::WindowIdentifier; -use std::os::unix::io::RawFd; +use ashpd::desktop::screencast::{CursorMode, Screencast, SourceType}; +use ashpd::desktop::PersistMode; +use std::os::unix::io::{RawFd, IntoRawFd}; pub struct WaylandCapture { fd: RawFd, @@ -11,22 +11,22 @@ pub struct WaylandCapture { impl WaylandCapture { pub async fn new() -> Result> { let proxy = Screencast::new().await?; - let session = proxy.create_session().await?; - proxy.select_sources( - &session, - CursorMode::Hidden, - SourceType::Monitor | SourceType::Window, - true, - None, - PersistMode::DoNot, - ).await?; - let response = proxy.start(&session, &WindowIdentifier::default()).await?; + let session = proxy.create_session(Default::default()).await?; + + let select_opts = ashpd::desktop::screencast::SelectSourcesOptions::default() + .set_multiple(true) + .set_cursor_mode(CursorMode::Hidden) + .set_sources(SourceType::Monitor | SourceType::Window) + .set_persist_mode(PersistMode::DoNot); + + proxy.select_sources(&session, select_opts).await?; + + let response = proxy.start(&session, None, Default::default()).await?.response()?; - // This is as far as we go with ashpd, next we need pipewire let stream = response.streams().first().ok_or("No stream")?; let node_id = stream.pipe_wire_node_id(); - let fd = proxy.open_pipe_wire_remote(&session).await?; + let fd = proxy.open_pipe_wire_remote(&session, Default::default()).await?; Ok(Self { fd: fd.into_raw_fd(),