diff --git a/input-capture/build.rs b/input-capture/build.rs new file mode 100644 index 0000000..58320ad --- /dev/null +++ b/input-capture/build.rs @@ -0,0 +1,25 @@ +fn main() { + let unix = cfg!(unix); + let layer_shell = cfg!(feature = "layer_shell"); + let libei = cfg!(feature = "libei"); + let x11 = cfg!(feature = "x11"); + let macos = cfg!(target_os = "macos"); + + let libei = unix && !macos && libei; + let layer_shell = unix && !macos && layer_shell; + let x11 = unix && !macos && x11; + + println!("cargo::rustc-check-cfg=cfg(layer_shell)"); + println!("cargo::rustc-check-cfg=cfg(libei)"); + println!("cargo::rustc-check-cfg=cfg(x11)"); + + if layer_shell { + println!("cargo::rustc-cfg=layer_shell"); + } + if libei { + println!("cargo::rustc-cfg=libei"); + } + if x11 { + println!("cargo::rustc-cfg=x11"); + } +} diff --git a/input-capture/src/error.rs b/input-capture/src/error.rs index 7324156..592e40f 100644 --- a/input-capture/src/error.rs +++ b/input-capture/src/error.rs @@ -8,16 +8,16 @@ pub enum InputCaptureError { Capture(#[from] CaptureError), } -#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] +#[cfg(layer_shell)] use std::io; -#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] +#[cfg(layer_shell)] use wayland_client::{ ConnectError, DispatchError, backend::WaylandError, globals::{BindError, GlobalError}, }; -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] +#[cfg(libei)] use ashpd::desktop::ResponseError; #[cfg(target_os = "macos")] @@ -31,13 +31,13 @@ pub enum CaptureError { EndOfStream, #[error("io error: `{0}`")] Io(#[from] std::io::Error), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] #[error("libei error: `{0}`")] Reis(#[from] reis::Error), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] #[error(transparent)] Portal(#[from] ashpd::Error), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] #[error("libei disconnected - reason: `{0}`")] Disconnected(String), #[cfg(target_os = "macos")] @@ -61,13 +61,13 @@ pub enum CaptureError { pub enum CaptureCreationError { #[error("no backend available")] NoAvailableBackend, - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] #[error("error creating input-capture-portal backend: `{0}`")] Libei(#[from] LibeiCaptureCreationError), - #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] + #[cfg(layer_shell)] #[error("error creating layer-shell capture backend: `{0}`")] LayerShell(#[from] LayerShellCaptureCreationError), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] #[error("error creating x11 capture backend: `{0}`")] X11(#[from] X11InputCaptureCreationError), #[cfg(windows)] @@ -80,7 +80,7 @@ pub enum CaptureCreationError { impl CaptureCreationError { /// request was intentionally denied by the user - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] pub(crate) fn cancelled_by_user(&self) -> bool { matches!( self, @@ -89,20 +89,20 @@ impl CaptureCreationError { ))) ) } - #[cfg(not(all(unix, feature = "libei", not(target_os = "macos"))))] + #[cfg(not(libei))] pub(crate) fn cancelled_by_user(&self) -> bool { false } } -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] +#[cfg(libei)] #[derive(Debug, Error)] pub enum LibeiCaptureCreationError { #[error("xdg-desktop-portal: `{0}`")] Ashpd(#[from] ashpd::Error), } -#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] +#[cfg(layer_shell)] #[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 = "layer_shell", not(target_os = "macos")))] +#[cfg(layer_shell)] impl WaylandBindError { pub(crate) fn new(inner: BindError, protocol: &'static str) -> Self { Self { inner, protocol } } } -#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] +#[cfg(layer_shell)] #[derive(Debug, Error)] pub enum LayerShellCaptureCreationError { #[error(transparent)] @@ -134,7 +134,7 @@ pub enum LayerShellCaptureCreationError { Io(#[from] io::Error), } -#[cfg(all(unix, feature = "x11", not(target_os = "macos")))] +#[cfg(x11)] #[derive(Debug, Error)] pub enum X11InputCaptureCreationError { #[error("X11 input capture is not yet implemented :(")] diff --git a/input-capture/src/lib.rs b/input-capture/src/lib.rs index b1ef6c0..6a850b3 100644 --- a/input-capture/src/lib.rs +++ b/input-capture/src/lib.rs @@ -15,19 +15,19 @@ pub use error::{CaptureCreationError, CaptureError, InputCaptureError}; pub mod error; -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] +#[cfg(libei)] mod libei; #[cfg(target_os = "macos")] mod macos; -#[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] +#[cfg(layer_shell)] mod layer_shell; #[cfg(windows)] mod windows; -#[cfg(all(unix, feature = "x11", not(target_os = "macos")))] +#[cfg(x11)] mod x11; /// fallback input capture (does not produce events) @@ -85,11 +85,11 @@ impl Display for Position { #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Backend { - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] InputCapturePortal, - #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] + #[cfg(layer_shell)] LayerShell, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] X11, #[cfg(windows)] Windows, @@ -101,11 +101,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 = "libei", not(target_os = "macos")))] + #[cfg(libei)] Backend::InputCapturePortal => write!(f, "input-capture-portal"), - #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] + #[cfg(layer_shell)] Backend::LayerShell => write!(f, "layer-shell"), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] Backend::X11 => write!(f, "X11"), #[cfg(windows)] Backend::Windows => write!(f, "windows"), @@ -298,11 +298,11 @@ async fn create_backend( CaptureCreationError, > { match backend { - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] Backend::InputCapturePortal => Ok(Box::new(libei::LibeiInputCapture::new().await?)), - #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] + #[cfg(layer_shell)] Backend::LayerShell => Ok(Box::new(layer_shell::LayerShellInputCapture::new()?)), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] Backend::X11 => Ok(Box::new(x11::X11InputCapture::new()?)), #[cfg(windows)] Backend::Windows => Ok(Box::new(windows::WindowsInputCapture::new())), @@ -327,11 +327,11 @@ async fn create( } for backend in [ - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] Backend::InputCapturePortal, - #[cfg(all(unix, feature = "layer_shell", not(target_os = "macos")))] + #[cfg(layer_shell)] Backend::LayerShell, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] Backend::X11, #[cfg(windows)] Backend::Windows, diff --git a/input-emulation/build.rs b/input-emulation/build.rs new file mode 100644 index 0000000..e9b39c1 --- /dev/null +++ b/input-emulation/build.rs @@ -0,0 +1,31 @@ +fn main() { + let unix = cfg!(unix); + let libei = cfg!(feature = "libei"); + let x11 = cfg!(feature = "x11"); + let macos = cfg!(target_os = "macos"); + let wlroots = cfg!(feature = "wlroots"); + let rdp = cfg!(feature = "remote_desktop_portal"); + + let libei = unix && !macos && libei; + let wlroots = unix && !macos && wlroots; + let x11 = unix && !macos && x11; + let rdp = unix && !macos && rdp; + + println!("cargo::rustc-check-cfg=cfg(wlroots)"); + println!("cargo::rustc-check-cfg=cfg(libei)"); + println!("cargo::rustc-check-cfg=cfg(x11)"); + println!("cargo::rustc-check-cfg=cfg(rdp)"); + + if libei { + println!("cargo::rustc-cfg=libei"); + } + if x11 { + println!("cargo::rustc-cfg=x11"); + } + if wlroots { + println!("cargo::rustc-cfg=wlroots"); + } + if rdp { + println!("cargo::rustc-cfg=rdp"); + } +} diff --git a/input-emulation/src/error.rs b/input-emulation/src/error.rs index 9ba9f0e..5197dbf 100644 --- a/input-emulation/src/error.rs +++ b/input-emulation/src/error.rs @@ -6,16 +6,12 @@ pub enum InputEmulationError { Emulate(#[from] EmulationError), } -#[cfg(all( - unix, - any(feature = "remote_desktop_portal", feature = "libei"), - not(target_os = "macos") -))] +#[cfg(any(libei, rdp))] use ashpd::{Error::Response, desktop::ResponseError}; use std::io; use thiserror::Error; -#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] +#[cfg(wlroots)] use wayland_client::{ ConnectError, DispatchError, backend::WaylandError, @@ -26,17 +22,13 @@ use wayland_client::{ pub enum EmulationError { #[error("event stream closed")] EndOfStream, - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] #[error("libei error: `{0}`")] Libei(#[from] reis::Error), - #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] + #[cfg(wlroots)] #[error("wayland error: `{0}`")] Wayland(#[from] wayland_client::backend::WaylandError), - #[cfg(all( - unix, - any(feature = "remote_desktop_portal", feature = "libei"), - not(target_os = "macos") - ))] + #[cfg(any(rdp, libei))] #[error("xdg-desktop-portal: `{0}`")] Ashpd(#[from] ashpd::Error), #[error("io error: `{0}`")] @@ -45,16 +37,16 @@ pub enum EmulationError { #[derive(Debug, Error)] pub enum EmulationCreationError { - #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] + #[cfg(wlroots)] #[error("wlroots backend: `{0}`")] Wlroots(#[from] WlrootsEmulationCreationError), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] #[error("libei backend: `{0}`")] Libei(#[from] LibeiEmulationCreationError), - #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] + #[cfg(rdp)] #[error("xdg-desktop-portal: `{0}`")] Xdp(#[from] XdpEmulationCreationError), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] #[error("x11: `{0}`")] X11(#[from] X11EmulationCreationError), #[cfg(target_os = "macos")] @@ -70,7 +62,7 @@ pub enum EmulationCreationError { impl EmulationCreationError { /// request was intentionally denied by the user pub(crate) fn cancelled_by_user(&self) -> bool { - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] if matches!( self, EmulationCreationError::Libei(LibeiEmulationCreationError::Ashpd(Response( @@ -79,7 +71,7 @@ impl EmulationCreationError { ) { return true; } - #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] + #[cfg(rdp)] if matches!( self, EmulationCreationError::Xdp(XdpEmulationCreationError::Ashpd(Response( @@ -92,7 +84,7 @@ impl EmulationCreationError { } } -#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] +#[cfg(wlroots)] #[derive(Debug, Error)] pub enum WlrootsEmulationCreationError { #[error(transparent)] @@ -109,7 +101,7 @@ pub enum WlrootsEmulationCreationError { Io(#[from] std::io::Error), } -#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] +#[cfg(wlroots)] #[derive(Debug, Error)] #[error("wayland protocol \"{protocol}\" not supported: {inner}")] pub struct WaylandBindError { @@ -117,14 +109,14 @@ pub struct WaylandBindError { protocol: &'static str, } -#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] +#[cfg(wlroots)] impl WaylandBindError { pub(crate) fn new(inner: BindError, protocol: &'static str) -> Self { Self { inner, protocol } } } -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] +#[cfg(libei)] #[derive(Debug, Error)] pub enum LibeiEmulationCreationError { #[error(transparent)] @@ -135,14 +127,14 @@ pub enum LibeiEmulationCreationError { Reis(#[from] reis::Error), } -#[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] +#[cfg(rdp)] #[derive(Debug, Error)] pub enum XdpEmulationCreationError { #[error(transparent)] Ashpd(#[from] ashpd::Error), } -#[cfg(all(unix, feature = "x11", not(target_os = "macos")))] +#[cfg(x11)] #[derive(Debug, Error)] pub enum X11EmulationCreationError { #[error("could not open display")] diff --git a/input-emulation/src/lib.rs b/input-emulation/src/lib.rs index 930695f..f77c607 100644 --- a/input-emulation/src/lib.rs +++ b/input-emulation/src/lib.rs @@ -11,16 +11,16 @@ pub use self::error::{EmulationCreationError, EmulationError, InputEmulationErro #[cfg(windows)] mod windows; -#[cfg(all(unix, feature = "x11", not(target_os = "macos")))] +#[cfg(x11)] mod x11; -#[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] +#[cfg(wlroots)] mod wlroots; -#[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] +#[cfg(rdp)] mod xdg_desktop_portal; -#[cfg(all(unix, feature = "libei", not(target_os = "macos")))] +#[cfg(libei)] mod libei; #[cfg(target_os = "macos")] @@ -34,13 +34,13 @@ pub type EmulationHandle = u64; #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum Backend { - #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] + #[cfg(wlroots)] Wlroots, - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] Libei, - #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] + #[cfg(rdp)] Xdp, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] X11, #[cfg(windows)] Windows, @@ -52,13 +52,13 @@ pub enum Backend { impl Display for Backend { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] + #[cfg(wlroots)] Backend::Wlroots => write!(f, "wlroots"), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] Backend::Libei => write!(f, "libei"), - #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] + #[cfg(rdp)] Backend::Xdp => write!(f, "xdg-desktop-portal"), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] Backend::X11 => write!(f, "X11"), #[cfg(windows)] Backend::Windows => write!(f, "windows"), @@ -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 = "wlroots", not(target_os = "macos")))] + #[cfg(wlroots)] Backend::Wlroots => Box::new(wlroots::WlrootsEmulation::new()?), - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] Backend::Libei => Box::new(libei::LibeiEmulation::new().await?), - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] Backend::X11 => Box::new(x11::X11Emulation::new()?), - #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] + #[cfg(rdp)] Backend::Xdp => Box::new(xdg_desktop_portal::DesktopPortalEmulation::new().await?), #[cfg(windows)] Backend::Windows => Box::new(windows::WindowsEmulation::new()?), @@ -109,13 +109,13 @@ impl InputEmulation { } for backend in [ - #[cfg(all(unix, feature = "wlroots", not(target_os = "macos")))] + #[cfg(wlroots)] Backend::Wlroots, - #[cfg(all(unix, feature = "libei", not(target_os = "macos")))] + #[cfg(libei)] Backend::Libei, - #[cfg(all(unix, feature = "remote_desktop_portal", not(target_os = "macos")))] + #[cfg(rdp)] Backend::Xdp, - #[cfg(all(unix, feature = "x11", not(target_os = "macos")))] + #[cfg(x11)] Backend::X11, #[cfg(windows)] Backend::Windows,