update ashpd

This commit is contained in:
Ferdinand Schober
2026-02-11 17:06:09 +01:00
parent ad63b6ba20
commit c2b68376d3
3 changed files with 41 additions and 25 deletions

20
Cargo.lock generated
View File

@@ -155,6 +155,22 @@ dependencies = [
"zbus", "zbus",
] ]
[[package]]
name = "ashpd"
version = "0.13.0"
source = "git+https://github.com/feschber/ashpd#f5f407e1834501579c49e7104bcaf26d5e0e52e6"
dependencies = [
"enumflags2",
"fastrand",
"futures-channel",
"futures-util",
"serde",
"serde_repr",
"tokio",
"url",
"zbus",
]
[[package]] [[package]]
name = "asn1-rs" name = "asn1-rs"
version = "0.6.2" version = "0.6.2"
@@ -1666,7 +1682,7 @@ dependencies = [
name = "input-capture" name = "input-capture"
version = "0.3.0" version = "0.3.0"
dependencies = [ dependencies = [
"ashpd", "ashpd 0.13.0",
"async-trait", "async-trait",
"bitflags 2.9.1", "bitflags 2.9.1",
"core-foundation", "core-foundation",
@@ -1696,7 +1712,7 @@ dependencies = [
name = "input-emulation" name = "input-emulation"
version = "0.3.0" version = "0.3.0"
dependencies = [ dependencies = [
"ashpd", "ashpd 0.11.0",
"async-trait", "async-trait",
"bitflags 2.9.1", "bitflags 2.9.1",
"core-graphics", "core-graphics",

View File

@@ -41,7 +41,7 @@ wayland-protocols-wlr = { version = "0.3.1", features = [
"client", "client",
], optional = true } ], optional = true }
x11 = { version = "2.21.0", features = ["xlib", "xtest"], optional = true } x11 = { version = "2.21.0", features = ["xlib", "xtest"], optional = true }
ashpd = { version = "0.11.0", default-features = false, features = [ ashpd = { git = "https://github.com/feschber/ashpd", default-features = false, features = [
"tokio", "tokio",
], optional = true } ], optional = true }
reis = { version = "0.5.0", features = ["tokio"], optional = true } reis = { version = "0.5.0", features = ["tokio"], optional = true }

View File

@@ -58,8 +58,8 @@ enum LibeiNotifyEvent {
} }
#[allow(dead_code)] #[allow(dead_code)]
pub struct LibeiInputCapture<'a> { pub struct LibeiInputCapture {
input_capture: Pin<Box<InputCapture<'a>>>, input_capture: Pin<Box<InputCapture>>,
capture_task: JoinHandle<Result<(), CaptureError>>, capture_task: JoinHandle<Result<(), CaptureError>>,
event_rx: Receiver<(Position, CaptureEvent)>, event_rx: Receiver<(Position, CaptureEvent)>,
notify_capture: Sender<LibeiNotifyEvent>, notify_capture: Sender<LibeiNotifyEvent>,
@@ -130,8 +130,8 @@ fn select_barriers(
} }
async fn update_barriers( async fn update_barriers(
input_capture: &InputCapture<'_>, input_capture: &InputCapture,
session: &Session<'_, InputCapture<'_>>, session: &Session<InputCapture>,
active_clients: &[Position], active_clients: &[Position],
next_barrier_id: &mut NonZeroU32, next_barrier_id: &mut NonZeroU32,
) -> Result<(Vec<ICBarrier>, HashMap<BarrierID, Position>), ashpd::Error> { ) -> Result<(Vec<ICBarrier>, HashMap<BarrierID, Position>), ashpd::Error> {
@@ -151,9 +151,9 @@ async fn update_barriers(
Ok((barriers, id_map)) Ok((barriers, id_map))
} }
async fn create_session<'a>( async fn create_session(
input_capture: &'a InputCapture<'a>, input_capture: &InputCapture,
) -> std::result::Result<(Session<'a, InputCapture<'a>>, BitFlags<Capabilities>), ashpd::Error> { ) -> std::result::Result<(Session<InputCapture>, BitFlags<Capabilities>), ashpd::Error> {
log::debug!("creating input capture session"); log::debug!("creating input capture session");
input_capture input_capture
.create_session( .create_session(
@@ -164,8 +164,8 @@ async fn create_session<'a>(
} }
async fn connect_to_eis( async fn connect_to_eis(
input_capture: &InputCapture<'_>, input_capture: &InputCapture,
session: &Session<'_, InputCapture<'_>>, session: &Session<InputCapture>,
) -> Result<(ei::Context, Connection, EiConvertEventStream), CaptureError> { ) -> Result<(ei::Context, Connection, EiConvertEventStream), CaptureError> {
log::debug!("connect_to_eis"); log::debug!("connect_to_eis");
let fd = input_capture.connect_to_eis(session).await?; let fd = input_capture.connect_to_eis(session).await?;
@@ -201,10 +201,10 @@ async fn libei_event_handler(
} }
} }
impl LibeiInputCapture<'_> { impl LibeiInputCapture {
pub async fn new() -> std::result::Result<Self, LibeiCaptureCreationError> { pub async fn new() -> std::result::Result<Self, LibeiCaptureCreationError> {
let input_capture = Box::pin(InputCapture::new().await?); let input_capture = Box::pin(InputCapture::new().await?);
let input_capture_ptr = input_capture.as_ref().get_ref() as *const InputCapture<'static>; let input_capture_ptr = input_capture.as_ref().get_ref() as *const InputCapture;
let first_session = Some(create_session(unsafe { &*input_capture_ptr }).await?); let first_session = Some(create_session(unsafe { &*input_capture_ptr }).await?);
let (event_tx, event_rx) = mpsc::channel(1); let (event_tx, event_rx) = mpsc::channel(1);
@@ -238,10 +238,10 @@ impl LibeiInputCapture<'_> {
} }
async fn do_capture( async fn do_capture(
input_capture: *const InputCapture<'static>, input_capture: *const InputCapture,
mut capture_event: Receiver<LibeiNotifyEvent>, mut capture_event: Receiver<LibeiNotifyEvent>,
notify_release: Arc<Notify>, notify_release: Arc<Notify>,
session: Option<(Session<'_, InputCapture<'_>>, BitFlags<Capabilities>)>, session: Option<(Session<InputCapture>, BitFlags<Capabilities>)>,
event_tx: Sender<(Position, CaptureEvent)>, event_tx: Sender<(Position, CaptureEvent)>,
cancellation_token: CancellationToken, cancellation_token: CancellationToken,
) -> Result<(), CaptureError> { ) -> Result<(), CaptureError> {
@@ -336,8 +336,8 @@ async fn do_capture(
} }
async fn do_capture_session( async fn do_capture_session(
input_capture: &InputCapture<'_>, input_capture: &InputCapture,
session: &mut Session<'_, InputCapture<'_>>, session: &mut Session<InputCapture>,
event_tx: &Sender<(Position, CaptureEvent)>, event_tx: &Sender<(Position, CaptureEvent)>,
active_clients: &[Position], active_clients: &[Position],
next_barrier_id: &mut NonZeroU32, next_barrier_id: &mut NonZeroU32,
@@ -462,9 +462,9 @@ async fn do_capture_session(
Ok(()) Ok(())
} }
async fn release_capture<'a>( async fn release_capture(
input_capture: &InputCapture<'a>, input_capture: &InputCapture,
session: &Session<'a, InputCapture<'a>>, session: &Session<InputCapture>,
activated: Activated, activated: Activated,
current_pos: Position, current_pos: Position,
) -> Result<(), CaptureError> { ) -> Result<(), CaptureError> {
@@ -561,7 +561,7 @@ async fn handle_ei_event(
} }
#[async_trait] #[async_trait]
impl LanMouseInputCapture for LibeiInputCapture<'_> { impl LanMouseInputCapture for LibeiInputCapture {
async fn create(&mut self, pos: Position) -> Result<(), CaptureError> { async fn create(&mut self, pos: Position) -> Result<(), CaptureError> {
let _ = self let _ = self
.notify_capture .notify_capture
@@ -598,7 +598,7 @@ impl LanMouseInputCapture for LibeiInputCapture<'_> {
} }
} }
impl Drop for LibeiInputCapture<'_> { impl Drop for LibeiInputCapture {
fn drop(&mut self) { fn drop(&mut self) {
if !self.terminated { if !self.terminated {
/* this workaround is needed until async drop is stabilized */ /* this workaround is needed until async drop is stabilized */
@@ -607,10 +607,10 @@ impl Drop for LibeiInputCapture<'_> {
} }
} }
impl Stream for LibeiInputCapture<'_> { impl Stream for LibeiInputCapture {
type Item = Result<(Position, CaptureEvent), CaptureError>; type Item = Result<(Position, CaptureEvent), CaptureError>;
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> { fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
match self.capture_task.poll_unpin(cx) { match self.capture_task.poll_unpin(cx) {
Poll::Ready(r) => match r.expect("failed to join") { Poll::Ready(r) => match r.expect("failed to join") {
Ok(()) => Poll::Ready(None), Ok(()) => Poll::Ready(None),