Fix ashpd 0.13 API changes for Wayland screencast setup

This commit is contained in:
katR 2026-09-01 16:58:34 +05:30
parent 78b50a2fde
commit 5a82cab03e
3 changed files with 17 additions and 16 deletions

1
Cargo.lock generated
View file

@ -37,6 +37,7 @@ dependencies = [
"futures-util",
"getrandom",
"serde",
"serde_repr",
"tokio",
"zbus",
]

View file

@ -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"

View file

@ -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<Self, Box<dyn std::error::Error>> {
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(),