From a870a9e3a93ebc6336e9af046c6465d8eae25758 Mon Sep 17 00:00:00 2001 From: Ferdinand Schober Date: Thu, 7 Nov 2024 12:43:42 +0100 Subject: [PATCH] split features for emulation and capture backends --- Cargo.toml | 22 +++++++--- input-capture/Cargo.toml | 4 +- input-capture/src/error.rs | 12 +++--- .../src/{wayland.rs => layer_shell.rs} | 0 input-capture/src/lib.rs | 14 +++---- input-emulation/Cargo.toml | 6 +-- input-emulation/src/error.rs | 22 +++++----- input-emulation/src/lib.rs | 20 ++++----- src/config.rs | 42 +++++++++---------- 9 files changed, 77 insertions(+), 65 deletions(-) rename input-capture/src/{wayland.rs => layer_shell.rs} (100%) diff --git a/Cargo.toml b/Cargo.toml index ff74deb1..3aa53210 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,9 +57,21 @@ local-channel = "0.1.5" libc = "0.2.148" [features] -default = ["wayland", "x11", "xdg_desktop_portal", "libei", "gtk"] -wayland = ["input-capture/wayland", "input-emulation/wayland"] -x11 = ["input-capture/x11", "input-emulation/x11"] -xdg_desktop_portal = ["input-emulation/xdg_desktop_portal"] -libei = ["input-event/libei", "input-capture/libei", "input-emulation/libei"] +default = [ + "gtk", + "layer_shell_capture", + "x11_capture", + "libei_capture", + "wlroots_emulation", + "libei_emulation", + "rdp_emulation", + "x11_emulation", +] gtk = ["dep:lan-mouse-gtk"] +layer_shell_capture = ["input-capture/layer_shell"] +x11_capture = ["input-capture/x11"] +libei_capture = ["input-event/libei", "input-capture/libei"] +libei_emulation = ["input-event/libei", "input-emulation/libei"] +wlroots_emulation = ["input-emulation/wlroots"] +x11_emulation = ["input-emulation/x11"] +rdp_emulation = ["input-emulation/remote_desktop_portal"] diff --git a/input-capture/Cargo.toml b/input-capture/Cargo.toml index 60609c21..2e354d6d 100644 --- a/input-capture/Cargo.toml +++ b/input-capture/Cargo.toml @@ -65,8 +65,8 @@ windows = { version = "0.58.0", features = [ ] } [features] -default = ["wayland", "x11", "libei"] -wayland = [ +default = ["layer_shell", "x11", "libei"] +layer_shell = [ "dep:wayland-client", "dep:wayland-protocols", "dep:wayland-protocols-wlr", diff --git a/input-capture/src/error.rs b/input-capture/src/error.rs index 88d55b4d..7e7a0e6c 100644 --- a/input-capture/src/error.rs +++ b/input-capture/src/error.rs @@ -8,9 +8,9 @@ pub enum InputCaptureError { Capture(#[from] CaptureError), } -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] use std::io; -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] use wayland_client::{ backend::WaylandError, globals::{BindError, GlobalError}, @@ -64,7 +64,7 @@ pub enum CaptureCreationError { #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] #[error("error creating input-capture-portal backend: `{0}`")] Libei(#[from] LibeiCaptureCreationError), - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] #[error("error creating layer-shell capture backend: `{0}`")] LayerShell(#[from] LayerShellCaptureCreationError), #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] @@ -102,7 +102,7 @@ pub enum LibeiCaptureCreationError { Ashpd(#[from] ashpd::Error), } -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] #[derive(Debug, Error)] #[error("{protocol} protocol not supported: {inner}")] pub struct WaylandBindError { @@ -110,14 +110,14 @@ pub struct WaylandBindError { protocol: &'static str, } -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] impl WaylandBindError { pub(crate) fn new(inner: BindError, protocol: &'static str) -> Self { Self { inner, protocol } } } -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] #[derive(Debug, Error)] pub enum LayerShellCaptureCreationError { #[error(transparent)] diff --git a/input-capture/src/wayland.rs b/input-capture/src/layer_shell.rs similarity index 100% rename from input-capture/src/wayland.rs rename to input-capture/src/layer_shell.rs diff --git a/input-capture/src/lib.rs b/input-capture/src/lib.rs index 48804877..debfd6da 100644 --- a/input-capture/src/lib.rs +++ b/input-capture/src/lib.rs @@ -21,8 +21,8 @@ mod libei; #[cfg(target_os = "macos")] mod macos; -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] -mod wayland; +#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] +mod layer_shell; #[cfg(windows)] mod windows; @@ -87,7 +87,7 @@ impl Display for Position { pub enum Backend { #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] InputCapturePortal, - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] LayerShell, #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] X11, @@ -103,7 +103,7 @@ impl Display for Backend { match self { #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] Backend::InputCapturePortal => write!(f, "input-capture-portal"), - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] Backend::LayerShell => write!(f, "layer-shell"), #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] Backend::X11 => write!(f, "X11"), @@ -287,8 +287,8 @@ async fn create_backend( match backend { #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] Backend::InputCapturePortal => Ok(Box::new(libei::LibeiInputCapture::new().await?)), - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] - Backend::LayerShell => Ok(Box::new(wayland::LayerShellInputCapture::new()?)), + #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] + Backend::LayerShell => Ok(Box::new(layer_shell::LayerShellInputCapture::new()?)), #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] Backend::X11 => Ok(Box::new(x11::X11InputCapture::new()?)), #[cfg(windows)] @@ -316,7 +316,7 @@ async fn create( for backend in [ #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] Backend::InputCapturePortal, - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] Backend::LayerShell, #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] Backend::X11, diff --git a/input-emulation/Cargo.toml b/input-emulation/Cargo.toml index b5e0ca64..d21fd817 100644 --- a/input-emulation/Cargo.toml +++ b/input-emulation/Cargo.toml @@ -60,13 +60,13 @@ windows = { version = "0.58.0", features = [ ] } [features] -default = ["wayland", "x11", "xdg_desktop_portal", "libei"] -wayland = [ +default = ["wlroots", "x11", "remote_desktop_portal", "libei"] +wlroots = [ "dep:wayland-client", "dep:wayland-protocols", "dep:wayland-protocols-wlr", "dep:wayland-protocols-misc", ] x11 = ["dep:x11"] -xdg_desktop_portal = ["dep:ashpd"] +remote_desktop_portal = ["dep:ashpd"] libei = ["dep:reis", "dep:ashpd"] diff --git a/input-emulation/src/error.rs b/input-emulation/src/error.rs index 644f864f..ae774265 100644 --- a/input-emulation/src/error.rs +++ b/input-emulation/src/error.rs @@ -8,14 +8,14 @@ pub enum InputEmulationError { #[cfg(all( unix, - any(feature = "xdg_desktop_portal", feature = "libei"), + any(feature = "remote_desktop_portal", feature = "libei"), not(target_os = "macos") ))] use ashpd::{desktop::ResponseError, Error::Response}; use std::io; use thiserror::Error; -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] use wayland_client::{ backend::WaylandError, globals::{BindError, GlobalError}, @@ -29,12 +29,12 @@ pub enum EmulationError { #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] #[error("libei error: `{0}`")] Libei(#[from] reis::Error), - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] #[error("wayland error: `{0}`")] Wayland(#[from] wayland_client::backend::WaylandError), #[cfg(all( unix, - any(feature = "xdg_desktop_portal", feature = "libei"), + any(feature = "remote_desktop_portal", feature = "libei"), not(target_os = "macos") ))] #[error("xdg-desktop-portal: `{0}`")] @@ -45,13 +45,13 @@ pub enum EmulationError { #[derive(Debug, Error)] pub enum EmulationCreationError { - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] #[error("wlroots backend: `{0}`")] Wlroots(#[from] WlrootsEmulationCreationError), #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] #[error("libei backend: `{0}`")] Libei(#[from] LibeiEmulationCreationError), - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] #[error("xdg-desktop-portal: `{0}`")] Xdp(#[from] XdpEmulationCreationError), #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] @@ -79,7 +79,7 @@ impl EmulationCreationError { ) { return true; } - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] if matches!( self, EmulationCreationError::Xdp(XdpEmulationCreationError::Ashpd(Response( @@ -92,7 +92,7 @@ impl EmulationCreationError { } } -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] #[derive(Debug, Error)] pub enum WlrootsEmulationCreationError { #[error(transparent)] @@ -109,7 +109,7 @@ pub enum WlrootsEmulationCreationError { Io(#[from] std::io::Error), } -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] #[derive(Debug, Error)] #[error("wayland protocol \"{protocol}\" not supported: {inner}")] pub struct WaylandBindError { @@ -117,7 +117,7 @@ pub struct WaylandBindError { protocol: &'static str, } -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] impl WaylandBindError { pub(crate) fn new(inner: BindError, protocol: &'static str) -> Self { Self { inner, protocol } @@ -135,7 +135,7 @@ pub enum LibeiEmulationCreationError { Reis(#[from] reis::Error), } -#[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] +#[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] #[derive(Debug, Error)] pub enum XdpEmulationCreationError { #[error(transparent)] diff --git a/input-emulation/src/lib.rs b/input-emulation/src/lib.rs index 81699ab9..930695f9 100644 --- a/input-emulation/src/lib.rs +++ b/input-emulation/src/lib.rs @@ -14,10 +14,10 @@ mod windows; #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] mod x11; -#[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] +#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] mod wlroots; -#[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] +#[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] mod xdg_desktop_portal; #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] @@ -34,11 +34,11 @@ pub type EmulationHandle = u64; #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Backend { - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] Wlroots, #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] Libei, - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] Xdp, #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] X11, @@ -52,11 +52,11 @@ pub enum Backend { impl Display for Backend { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] Backend::Wlroots => write!(f, "wlroots"), #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] Backend::Libei => write!(f, "libei"), - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] Backend::Xdp => write!(f, "xdg-desktop-portal"), #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] Backend::X11 => write!(f, "X11"), @@ -78,13 +78,13 @@ pub struct InputEmulation { impl InputEmulation { async fn with_backend(backend: Backend) -> Result { let emulation: Box = match backend { - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] Backend::Wlroots => Box::new(wlroots::WlrootsEmulation::new()?), #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] Backend::Libei => Box::new(libei::LibeiEmulation::new().await?), #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] Backend::X11 => Box::new(x11::X11Emulation::new()?), - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] Backend::Xdp => Box::new(xdg_desktop_portal::DesktopPortalEmulation::new().await?), #[cfg(windows)] Backend::Windows => Box::new(windows::WindowsEmulation::new()?), @@ -109,11 +109,11 @@ impl InputEmulation { } for backend in [ - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] Backend::Wlroots, #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] Backend::Libei, - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] Backend::Xdp, #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] Backend::X11, diff --git a/src/config.rs b/src/config.rs index 53b51153..f672d467 100644 --- a/src/config.rs +++ b/src/config.rs @@ -85,13 +85,13 @@ struct CliArgs { #[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, ValueEnum)] pub enum CaptureBackend { - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(all(unix, feature = "libei_capture", not(target_os = "macos")))] #[serde(rename = "input-capture-portal")] InputCapturePortal, - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "layer_shell_capture", not(target_os = "macos")))] #[serde(rename = "layer-shell")] LayerShell, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(all(unix, feature = "x11_capture", not(target_os = "macos")))] #[serde(rename = "x11")] X11, #[cfg(windows)] @@ -107,11 +107,11 @@ pub enum CaptureBackend { impl Display for CaptureBackend { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(all(unix, feature = "libei_capture", not(target_os = "macos")))] CaptureBackend::InputCapturePortal => write!(f, "input-capture-portal"), - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "layer_shell_capture", not(target_os = "macos")))] CaptureBackend::LayerShell => write!(f, "layer-shell"), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(all(unix, feature = "x11_capture", not(target_os = "macos")))] CaptureBackend::X11 => write!(f, "X11"), #[cfg(windows)] CaptureBackend::Windows => write!(f, "windows"), @@ -125,11 +125,11 @@ impl Display for CaptureBackend { impl From for input_capture::Backend { fn from(backend: CaptureBackend) -> Self { match backend { - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(all(unix, feature = "libei_capture", not(target_os = "macos")))] CaptureBackend::InputCapturePortal => Self::InputCapturePortal, - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "layer_shell_capture", not(target_os = "macos")))] CaptureBackend::LayerShell => Self::LayerShell, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(all(unix, feature = "x11_capture", not(target_os = "macos")))] CaptureBackend::X11 => Self::X11, #[cfg(windows)] CaptureBackend::Windows => Self::Windows, @@ -142,16 +142,16 @@ impl From for input_capture::Backend { #[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize, ValueEnum)] pub enum EmulationBackend { - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots_emulation", not(target_os = "macos")))] #[serde(rename = "wlroots")] Wlroots, - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(all(unix, feature = "libei_emulation", not(target_os = "macos")))] #[serde(rename = "libei")] Libei, - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "rdp_emulation", not(target_os = "macos")))] #[serde(rename = "xdp")] Xdp, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(all(unix, feature = "x11_emulation", not(target_os = "macos")))] #[serde(rename = "x11")] X11, #[cfg(windows)] @@ -167,13 +167,13 @@ pub enum EmulationBackend { impl From for input_emulation::Backend { fn from(backend: EmulationBackend) -> Self { match backend { - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots_emulation", not(target_os = "macos")))] EmulationBackend::Wlroots => Self::Wlroots, - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(all(unix, feature = "libei_emulation", not(target_os = "macos")))] EmulationBackend::Libei => Self::Libei, - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "rdp_emulation", not(target_os = "macos")))] EmulationBackend::Xdp => Self::Xdp, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(all(unix, feature = "x11_emulation", not(target_os = "macos")))] EmulationBackend::X11 => Self::X11, #[cfg(windows)] EmulationBackend::Windows => Self::Windows, @@ -187,13 +187,13 @@ impl From for input_emulation::Backend { impl Display for EmulationBackend { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - #[cfg(all(unix, feature = "wayland", not(target_os = "macos")))] + #[cfg(all(unix, feature = "wlroots_emulation", not(target_os = "macos")))] EmulationBackend::Wlroots => write!(f, "wlroots"), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(all(unix, feature = "libei_emulation", not(target_os = "macos")))] EmulationBackend::Libei => write!(f, "libei"), - #[cfg(all(unix, feature = "xdg_desktop_portal", not(target_os = "macos")))] + #[cfg(all(unix, feature = "rdp_emulation", not(target_os = "macos")))] EmulationBackend::Xdp => write!(f, "xdg-desktop-portal"), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(all(unix, feature = "x11_emulation", not(target_os = "macos")))] EmulationBackend::X11 => write!(f, "X11"), #[cfg(windows)] EmulationBackend::Windows => write!(f, "windows"),