use bon::bon;
use crate::{FocusTrackerConfig, FocusTrackerResult, FocusedWindow, platform};
use std::future::Future;
use std::sync::atomic::AtomicBool;
#[derive(Debug, Clone)]
pub struct FocusTracker {
config: FocusTrackerConfig,
}
impl Default for FocusTracker {
fn default() -> Self {
Self::builder().build()
}
}
#[bon]
impl FocusTracker {
#[builder]
#[must_use]
pub fn new(#[builder(default)] config: FocusTrackerConfig) -> Self {
Self { config }
}
#[builder]
pub async fn track_focus<F, Fut>(
&self,
on_focus: F,
stop_signal: Option<&AtomicBool>,
) -> FocusTrackerResult<()>
where
F: FnMut(FocusedWindow) -> Fut,
Fut: Future<Output = FocusTrackerResult<()>>,
{
platform::track_focus(on_focus, stop_signal, &self.config).await
}
}