focus-tracker 1.1.0

Cross-platform focus tracker for Linux (X11), macOS and Windows
Documentation
pub(crate) mod utils;
mod xorg_focus_tracker;

use crate::{FocusTrackerConfig, FocusTrackerError, FocusTrackerResult, FocusedWindow};
use std::future::Future;
use std::sync::atomic::AtomicBool;
use utils::wayland_detect;

fn qualify_x11_error(err: FocusTrackerError) -> FocusTrackerError {
    if matches!(err, FocusTrackerError::NoDisplay) && wayland_detect() {
        FocusTrackerError::Unsupported
    } else {
        err
    }
}

pub(crate) async fn track_focus<F, Fut>(
    on_focus: F,
    stop_signal: Option<&AtomicBool>,
    config: &FocusTrackerConfig,
) -> FocusTrackerResult<()>
where
    F: FnMut(FocusedWindow) -> Fut,
    Fut: Future<Output = FocusTrackerResult<()>>,
{
    xorg_focus_tracker::track_focus(on_focus, stop_signal, config)
        .await
        .map_err(qualify_x11_error)
}

/// Linux placeholder for [`crate::focused_document_url`].
///
/// X11/Wayland have no equivalent of the macOS Accessibility API's
/// `AXDocument` attribute, so we always report "no document URL". Callers
/// must treat `Ok(None)` as a soft signal — not an error.
#[allow(clippy::unnecessary_wraps)]
pub(crate) fn focused_document_url(_pid: u32) -> FocusTrackerResult<Option<String>> {
    Ok(None)
}