diff --git a/Cargo.lock b/Cargo.lock index 772febe8..eb6abe3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -98,9 +98,9 @@ dependencies = [ [[package]] name = "ashpd" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d43c03d9e36dd40cab48435be0b09646da362c278223ca535493877b2c1dee9" +checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" dependencies = [ "enumflags2", "futures-channel", @@ -271,15 +271,6 @@ version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "blocking" version = "1.6.1" @@ -454,47 +445,18 @@ dependencies = [ "libc", ] -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - [[package]] name = "crossbeam-utils" version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - [[package]] name = "data-encoding" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -831,16 +793,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "getrandom" version = "0.2.15" @@ -1975,9 +1927,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reis" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "635de3608f72e8d067f8972f9401619ac7a3f34a0a17340fa0e3f9db57e067a3" +checksum = "827073dbe443c57fd72ae05491c6b94213218627ac6ac169850673b0cb7034f1" dependencies = [ "futures", "rustix", @@ -2098,17 +2050,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "shlex" version = "1.3.0" @@ -2404,12 +2345,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - [[package]] name = "uds_windows" version = "1.1.0" @@ -2484,12 +2419,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2918,9 +2847,9 @@ dependencies = [ [[package]] name = "zbus" -version = "4.4.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +checksum = "4e0c8d6fdd4c4ac401fd298fd169d538a386e9df3c32ff136e8745dfa443dbd8" dependencies = [ "async-broadcast", "async-process", @@ -2929,20 +2858,18 @@ dependencies = [ "enumflags2", "event-listener", "futures-core", - "futures-sink", "futures-util", "hex", "nix", "ordered-stream", - "rand", "serde", "serde_repr", - "sha1", "static_assertions", "tokio", "tracing", "uds_windows", - "windows-sys 0.52.0", + "windows-sys 0.59.0", + "winnow", "xdg-home", "zbus_macros", "zbus_names", @@ -2951,25 +2878,28 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "4.4.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +checksum = "ed1f3cc6313cbefd539b4eee6de36a990897ab6cc2c30a82b3ac29ef9099e6c0" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn", + "zbus_names", + "zvariant", "zvariant_utils", ] [[package]] name = "zbus_names" -version = "3.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +checksum = "856b7a38811f71846fd47856ceee8bccaec8399ff53fb370247e66081ace647b" dependencies = [ "serde", "static_assertions", + "winnow", "zvariant", ] @@ -3039,23 +2969,25 @@ dependencies = [ [[package]] name = "zvariant" -version = "4.2.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +checksum = "a1200ee6ac32f1e5a312e455a949a4794855515d34f9909f4a3e082d14e1a56f" dependencies = [ "endi", "enumflags2", "serde", "static_assertions", "url", + "winnow", "zvariant_derive", + "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "4.2.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +checksum = "687e3b97fae6c9104fbbd36c73d27d149abf04fb874e2efbd84838763daa8916" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3066,11 +2998,14 @@ dependencies = [ [[package]] name = "zvariant_utils" -version = "2.1.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +checksum = "20d1d011a38f12360e5fcccceeff5e2c42a8eb7f27f0dcba97a0862ede05c9c6" dependencies = [ "proc-macro2", "quote", + "serde", + "static_assertions", "syn", + "winnow", ] diff --git a/input-capture/Cargo.toml b/input-capture/Cargo.toml index fb00b6d8..9f46b93b 100644 --- a/input-capture/Cargo.toml +++ b/input-capture/Cargo.toml @@ -40,10 +40,10 @@ wayland-protocols-wlr = { version = "0.3.1", features = [ "client", ], optional = true } x11 = { version = "2.21.0", features = ["xlib", "xtest"], optional = true } -ashpd = { version = "0.9", default-features = false, features = [ +ashpd = { version = "0.10", default-features = false, features = [ "tokio", ], optional = true } -reis = { version = "0.2", features = ["tokio"], optional = true } +reis = { version = "0.4", features = ["tokio"], optional = true } [target.'cfg(target_os="macos")'.dependencies] core-graphics = { version = "0.23", features = ["highsierra"] } diff --git a/input-capture/src/error.rs b/input-capture/src/error.rs index 68eab78b..88d55b4d 100644 --- a/input-capture/src/error.rs +++ b/input-capture/src/error.rs @@ -19,26 +19,10 @@ use wayland_client::{ #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] use ashpd::desktop::ResponseError; -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] -use reis::tokio::{EiConvertEventStreamError, HandshakeError}; #[cfg(target_os = "macos")] use core_graphics::base::CGError; -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] -#[derive(Debug, Error)] -#[error("error in libei stream: {inner:?}")] -pub struct ReisConvertEventStreamError { - inner: EiConvertEventStreamError, -} - -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] -impl From for ReisConvertEventStreamError { - fn from(e: EiConvertEventStreamError) -> Self { - Self { inner: e } - } -} - #[derive(Debug, Error)] pub enum CaptureError { #[error("activation stream closed unexpectedly")] @@ -48,11 +32,8 @@ pub enum CaptureError { #[error("io error: `{0}`")] Io(#[from] std::io::Error), #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] - #[error("error in libei stream: `{0}`")] - Reis(#[from] ReisConvertEventStreamError), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] - #[error("libei handshake failed: `{0}`")] - Handshake(#[from] HandshakeError), + #[error("libei error: `{0}`")] + Reis(#[from] reis::Error), #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] #[error(transparent)] Portal(#[from] ashpd::Error), diff --git a/input-capture/src/libei.rs b/input-capture/src/libei.rs index 2e25823f..ceb02b61 100644 --- a/input-capture/src/libei.rs +++ b/input-capture/src/libei.rs @@ -1,6 +1,9 @@ use ashpd::{ desktop::{ - input_capture::{Activated, Barrier, BarrierID, Capabilities, InputCapture, Region, Zones}, + input_capture::{ + Activated, ActivatedBarrier, Barrier, BarrierID, Capabilities, InputCapture, Region, + Zones, + }, Session, }, enumflags2::BitFlags, @@ -8,14 +11,15 @@ use ashpd::{ use async_trait::async_trait; use futures::{FutureExt, StreamExt}; use reis::{ - ei, - event::{DeviceCapability, EiEvent}, - tokio::{EiConvertEventStream, EiEventStream}, + ei::{self, handshake::ContextType}, + event::{Connection, DeviceCapability, EiEvent}, + tokio::EiConvertEventStream, }; use std::{ cell::Cell, collections::HashMap, io, + num::NonZeroU32, os::unix::net::UnixStream, pin::Pin, rc::Rc, @@ -32,14 +36,13 @@ use tokio::{ use tokio_util::sync::CancellationToken; use futures_core::Stream; -use once_cell::sync::Lazy; use input_event::Event; use crate::CaptureEvent; use super::{ - error::{CaptureError, LibeiCaptureCreationError, ReisConvertEventStreamError}, + error::{CaptureError, LibeiCaptureCreationError}, Capture as LanMouseInputCapture, Position, }; @@ -65,22 +68,6 @@ pub struct LibeiInputCapture<'a> { terminated: bool, } -static INTERFACES: Lazy> = Lazy::new(|| { - let mut m = HashMap::new(); - m.insert("ei_connection", 1); - m.insert("ei_callback", 1); - m.insert("ei_pingpong", 1); - m.insert("ei_seat", 1); - m.insert("ei_device", 2); - m.insert("ei_pointer", 1); - m.insert("ei_pointer_absolute", 1); - m.insert("ei_scroll", 1); - m.insert("ei_button", 1); - m.insert("ei_keyboard", 1); - m.insert("ei_touchscreen", 1); - m -}); - /// returns (start pos, end pos), inclusive fn pos_to_barrier(r: &Region, pos: Position) -> (i32, i32, i32, i32) { let (x, y) = (r.x_offset(), r.y_offset()); @@ -118,7 +105,7 @@ impl From for Barrier { fn select_barriers( zones: &Zones, clients: &[Position], - next_barrier_id: &mut u32, + next_barrier_id: &mut NonZeroU32, ) -> (Vec, HashMap) { let mut pos_for_barrier = HashMap::new(); let mut barriers: Vec = vec![]; @@ -129,7 +116,9 @@ fn select_barriers( .iter() .map(|r| { let id = *next_barrier_id; - *next_barrier_id = id + 1; + *next_barrier_id = next_barrier_id + .checked_add(1) + .expect("barrier id out of range"); let position = pos_to_barrier(r, *pos); pos_for_barrier.insert(id, *pos); ICBarrier::new(id, position) @@ -144,7 +133,7 @@ async fn update_barriers( input_capture: &InputCapture<'_>, session: &Session<'_, InputCapture<'_>>, active_clients: &[Position], - next_barrier_id: &mut u32, + next_barrier_id: &mut NonZeroU32, ) -> Result<(Vec, HashMap), ashpd::Error> { let zones = input_capture.zones(session).await?.response()?; log::debug!("zones: {zones:?}"); @@ -168,7 +157,7 @@ async fn create_session<'a>( log::debug!("creating input capture session"); input_capture .create_session( - &ashpd::WindowIdentifier::default(), + None, Capabilities::Keyboard | Capabilities::Pointer | Capabilities::Touchscreen, ) .await @@ -177,7 +166,7 @@ async fn create_session<'a>( async fn connect_to_eis( input_capture: &InputCapture<'_>, session: &Session<'_, InputCapture<'_>>, -) -> Result<(ei::Context, EiConvertEventStream), CaptureError> { +) -> Result<(ei::Context, Connection, EiConvertEventStream), CaptureError> { log::debug!("connect_to_eis"); let fd = input_capture.connect_to_eis(session).await?; @@ -187,17 +176,11 @@ async fn connect_to_eis( // create ei context let context = ei::Context::new(stream)?; - let mut event_stream = EiEventStream::new(context.clone())?; - let response = reis::tokio::ei_handshake( - &mut event_stream, - "de.feschber.LanMouse", - ei::handshake::ContextType::Receiver, - &INTERFACES, - ) - .await?; - let event_stream = EiConvertEventStream::new(event_stream, response.serial); - - Ok((context, event_stream)) + let (conn, event_stream) = context + .handshake_tokio("de.feschber.LanMouse", ContextType::Receiver) + .await?; + + Ok((context, conn, event_stream)) } async fn libei_event_handler( @@ -211,8 +194,7 @@ async fn libei_event_handler( let ei_event = ei_event_stream .next() .await - .ok_or(CaptureError::EndOfStream)? - .map_err(ReisConvertEventStreamError::from)?; + .ok_or(CaptureError::EndOfStream)??; log::trace!("from ei: {ei_event:?}"); let client = current_pos.get(); handle_ei_event(ei_event, client, &context, &event_tx, &release_session).await?; @@ -268,7 +250,7 @@ async fn do_capture( /* safety: libei_task does not outlive Self */ let input_capture = unsafe { &*input_capture }; let mut active_clients: Vec = vec![]; - let mut next_barrier_id = 1u32; + let mut next_barrier_id = NonZeroU32::new(1).expect("id must be non-zero"); let mut zones_changed = input_capture.receive_zones_changed().await?; @@ -358,7 +340,7 @@ async fn do_capture_session( session: &mut Session<'_, InputCapture<'_>>, event_tx: &Sender<(Position, CaptureEvent)>, active_clients: &[Position], - next_barrier_id: &mut u32, + next_barrier_id: &mut NonZeroU32, notify_release: &Notify, cancel: (CancellationToken, CancellationToken), ) -> Result<(), CaptureError> { @@ -367,7 +349,7 @@ async fn do_capture_session( let current_pos = Rc::new(Cell::new(None)); // connect to eis server - let (context, ei_event_stream) = connect_to_eis(input_capture, session).await?; + let (context, _conn, ei_event_stream) = connect_to_eis(input_capture, session).await?; // set barriers let (barriers, pos_for_barrier_id) = @@ -415,9 +397,9 @@ async fn do_capture_session( // get barrier id from activation let barrier_id = match activated.barrier_id() { - Some(bid) => bid, + Some(ActivatedBarrier::Barrier(id)) => id, // workaround for KDE plasma not reporting barrier ids - None => find_corresponding_client(&barriers, activated.cursor_position().expect("no cursor position reported by compositor")), + Some(ActivatedBarrier::UnknownBarrier) | None => find_corresponding_client(&barriers, activated.cursor_position().expect("no cursor position reported by compositor")), }; // find client corresponding to barrier diff --git a/input-emulation/Cargo.toml b/input-emulation/Cargo.toml index fd1c1ead..7a59a5b6 100644 --- a/input-emulation/Cargo.toml +++ b/input-emulation/Cargo.toml @@ -38,10 +38,10 @@ wayland-protocols-misc = { version = "0.3.1", features = [ "client", ], optional = true } x11 = { version = "2.21.0", features = ["xlib", "xtest"], optional = true } -ashpd = { version = "0.9", default-features = false, features = [ +ashpd = { version = "0.10", default-features = false, features = [ "tokio", ], optional = true } -reis = { version = "0.2", features = ["tokio"], optional = true } +reis = { version = "0.4", features = ["tokio"], optional = true } [target.'cfg(target_os="macos")'.dependencies] bitflags = "2.5.0" diff --git a/input-emulation/src/error.rs b/input-emulation/src/error.rs index e2bd824e..1efa3f87 100644 --- a/input-emulation/src/error.rs +++ b/input-emulation/src/error.rs @@ -8,8 +8,6 @@ pub enum InputEmulationError { #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] use ashpd::{desktop::ResponseError, Error::Response}; -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] -use reis::tokio::EiConvertEventStreamError; use std::io; use thiserror::Error; @@ -20,33 +18,13 @@ use wayland_client::{ ConnectError, DispatchError, }; -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] -use reis::tokio::HandshakeError; - -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] -#[derive(Debug, Error)] -#[error("error in libei stream: {inner:?}")] -pub struct ReisConvertStreamError { - inner: EiConvertEventStreamError, -} - -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] -impl From for ReisConvertStreamError { - fn from(e: EiConvertEventStreamError) -> Self { - Self { inner: e } - } -} - #[derive(Debug, Error)] pub enum EmulationError { #[error("event stream closed")] EndOfStream, #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] - #[error("libei error flushing events: `{0}`")] - Libei(#[from] reis::event::Error), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] - #[error("")] - LibeiConvertStream(#[from] ReisConvertStreamError), + #[error("libei error: `{0}`")] + Libei(#[from] reis::Error), #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] #[error("wayland error: `{0}`")] Wayland(#[from] wayland_client::backend::WaylandError), @@ -150,7 +128,7 @@ pub enum LibeiEmulationCreationError { #[error(transparent)] Io(#[from] std::io::Error), #[error(transparent)] - Handshake(#[from] HandshakeError), + Reis(#[from] reis::Error), } #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] diff --git a/input-emulation/src/libei.rs b/input-emulation/src/libei.rs index 4967c83a..d59cbf33 100644 --- a/input-emulation/src/libei.rs +++ b/input-emulation/src/libei.rs @@ -1,23 +1,18 @@ use futures::{future, StreamExt}; -use once_cell::sync::Lazy; use std::{ - collections::HashMap, io, os::{fd::OwnedFd, unix::net::UnixStream}, sync::{ - atomic::{AtomicBool, AtomicU32, Ordering}, + atomic::{AtomicBool, Ordering}, Arc, Mutex, RwLock, }, time::{SystemTime, UNIX_EPOCH}, }; use tokio::task::JoinHandle; -use ashpd::{ - desktop::{ - remote_desktop::{DeviceType, RemoteDesktop}, - PersistMode, Session, - }, - WindowIdentifier, +use ashpd::desktop::{ + remote_desktop::{DeviceType, RemoteDesktop}, + PersistMode, Session, }; use async_trait::async_trait; @@ -26,32 +21,16 @@ use reis::{ self, button::ButtonState, handshake::ContextType, keyboard::KeyState, Button, Keyboard, Pointer, Scroll, }, - event::{DeviceCapability, DeviceEvent, EiEvent, SeatEvent}, - tokio::{ei_handshake, EiConvertEventStream, EiEventStream}, + event::{self, Connection, DeviceCapability, DeviceEvent, EiEvent, SeatEvent}, + tokio::EiConvertEventStream, }; use input_event::{Event, KeyboardEvent, PointerEvent}; -use crate::error::{EmulationError, ReisConvertStreamError}; +use crate::error::EmulationError; use super::{error::LibeiEmulationCreationError, Emulation, EmulationHandle}; -static INTERFACES: Lazy> = Lazy::new(|| { - let mut m = HashMap::new(); - m.insert("ei_connection", 1); - m.insert("ei_callback", 1); - m.insert("ei_pingpong", 1); - m.insert("ei_seat", 1); - m.insert("ei_device", 2); - m.insert("ei_pointer", 1); - m.insert("ei_pointer_absolute", 1); - m.insert("ei_scroll", 1); - m.insert("ei_button", 1); - m.insert("ei_keyboard", 1); - m.insert("ei_touchscreen", 1); - m -}); - #[derive(Clone, Default)] struct Devices { pointer: Arc>>, @@ -62,11 +41,11 @@ struct Devices { pub(crate) struct LibeiEmulation<'a> { context: ei::Context, + conn: event::Connection, devices: Devices, ei_task: JoinHandle<()>, error: Arc>>, libei_error: Arc, - serial: AtomicU32, _remote_desktop: RemoteDesktop<'a>, session: Session<'a, RemoteDesktop<'a>>, } @@ -89,10 +68,7 @@ async fn get_ei_fd<'a>( .await?; log::info!("requesting permission for input emulation"); - let _devices = remote_desktop - .start(&session, &WindowIdentifier::default()) - .await? - .response()?; + let _devices = remote_desktop.start(&session, None).await?.response()?; let fd = remote_desktop.connect_to_eis(&session).await?; Ok((remote_desktop, session, fd)) @@ -104,20 +80,15 @@ impl<'a> LibeiEmulation<'a> { let stream = UnixStream::from(eifd); stream.set_nonblocking(true)?; let context = ei::Context::new(stream)?; - let mut events = EiEventStream::new(context.clone())?; - let handshake = ei_handshake( - &mut events, - "de.feschber.LanMouse", - ContextType::Sender, - &INTERFACES, - ) - .await?; - let events = EiConvertEventStream::new(events, handshake.serial); + let (conn, events) = context + .handshake_tokio("de.feschber.LanMouse", ContextType::Sender) + .await?; let devices = Devices::default(); let libei_error = Arc::new(AtomicBool::default()); let error = Arc::new(Mutex::new(None)); let ei_handler = ei_task( events, + conn.clone(), context.clone(), devices.clone(), libei_error.clone(), @@ -125,15 +96,13 @@ impl<'a> LibeiEmulation<'a> { ); let ei_task = tokio::task::spawn_local(ei_handler); - let serial = AtomicU32::new(handshake.serial); - Ok(Self { context, + conn, devices, ei_task, error, libei_error, - serial, _remote_desktop, session, }) @@ -169,7 +138,7 @@ impl<'a> Emulation for LibeiEmulation<'a> { let pointer_device = self.devices.pointer.read().unwrap(); if let Some((d, p)) = pointer_device.as_ref() { p.motion_relative(dx as f32, dy as f32); - d.frame(self.serial.load(Ordering::SeqCst), now); + d.frame(self.conn.serial(), now); } } PointerEvent::Button { @@ -186,7 +155,7 @@ impl<'a> Emulation for LibeiEmulation<'a> { _ => ButtonState::Press, }, ); - d.frame(self.serial.load(Ordering::SeqCst), now); + d.frame(self.conn.serial(), now); } } PointerEvent::Axis { @@ -200,7 +169,7 @@ impl<'a> Emulation for LibeiEmulation<'a> { 0 => s.scroll(0., value as f32), _ => s.scroll(value as f32, 0.), } - d.frame(self.serial.load(Ordering::SeqCst), now); + d.frame(self.conn.serial(), now); } } PointerEvent::AxisDiscrete120 { axis, value } => { @@ -210,7 +179,7 @@ impl<'a> Emulation for LibeiEmulation<'a> { 0 => s.scroll_discrete(0, value), _ => s.scroll_discrete(value, 0), } - d.frame(self.serial.load(Ordering::SeqCst), now); + d.frame(self.conn.serial(), now); } } }, @@ -229,7 +198,7 @@ impl<'a> Emulation for LibeiEmulation<'a> { _ => KeyState::Press, }, ); - d.frame(self.serial.load(Ordering::SeqCst), now); + d.frame(self.conn.serial(), now); } } KeyboardEvent::Modifiers { .. } => {} @@ -252,6 +221,7 @@ impl<'a> Emulation for LibeiEmulation<'a> { async fn ei_task( mut events: EiConvertEventStream, + _conn: Connection, context: ei::Context, devices: Devices, libei_error: Arc, @@ -276,11 +246,7 @@ async fn ei_event_handler( devices: &Devices, ) -> Result<(), EmulationError> { loop { - let event = events - .next() - .await - .ok_or(EmulationError::EndOfStream)? - .map_err(ReisConvertStreamError::from)?; + let event = events.next().await.ok_or(EmulationError::EndOfStream)??; const CAPABILITIES: &[DeviceCapability] = &[ DeviceCapability::Pointer, DeviceCapability::PointerAbsolute, diff --git a/input-emulation/src/xdg_desktop_portal.rs b/input-emulation/src/xdg_desktop_portal.rs index 24b547e9..b14454df 100644 --- a/input-emulation/src/xdg_desktop_portal.rs +++ b/input-emulation/src/xdg_desktop_portal.rs @@ -4,7 +4,6 @@ use ashpd::{ PersistMode, Session, }, zbus::AsyncDrop, - WindowIdentifier, }; use async_trait::async_trait; @@ -43,10 +42,7 @@ impl<'a> DesktopPortalEmulation<'a> { .await?; log::info!("requesting permission for input emulation"); - let _devices = proxy - .start(&session, &WindowIdentifier::default()) - .await? - .response()?; + let _devices = proxy.start(&session, None).await?.response()?; log::debug!("started session"); let session = session; diff --git a/input-event/Cargo.toml b/input-event/Cargo.toml index f940eb8b..89451681 100644 --- a/input-event/Cargo.toml +++ b/input-event/Cargo.toml @@ -14,7 +14,7 @@ serde = { version = "1.0", features = ["derive"] } thiserror = "2.0.0" [target.'cfg(all(unix, not(target_os="macos")))'.dependencies] -reis = { version = "0.2.0", optional = true } +reis = { version = "0.4", optional = true } [features] default = ["libei"]