pub use super::event_broker::Filter;
use hookmap_core::event::{ButtonEvent, NativeEventOperation};
use super::event_broker::EventBroker;
use std::sync::Arc;
use std::sync::Mutex;
use once_cell::sync::Lazy;
static BROKER: Lazy<Mutex<EventBroker>> = Lazy::new(Mutex::default);
pub(super) fn publish_event(event: ButtonEvent) -> NativeEventOperation {
BROKER.lock().unwrap().publish(event)
}
pub struct Interceptor {
filter: Arc<Filter>,
native_event_operation: NativeEventOperation,
}
impl Interceptor {
pub fn blocking(filter: Filter) -> Self {
Self {
filter: Arc::new(filter),
native_event_operation: NativeEventOperation::Block,
}
}
pub fn dispatch(filter: Filter) -> Self {
Self {
filter: Arc::new(filter),
native_event_operation: NativeEventOperation::Dispatch,
}
}
pub fn get(&self) -> ButtonEvent {
let rx = BROKER
.lock()
.unwrap()
.subscribe_once(Arc::clone(&self.filter), self.native_event_operation);
rx.recv().unwrap()
}
pub fn iter(&self) -> Iter {
Iter {
filter: Arc::clone(&self.filter),
native_event_operation: self.native_event_operation,
}
}
}
pub struct Iter {
filter: Arc<Filter>,
native_event_operation: NativeEventOperation,
}
impl Iterator for Iter {
type Item = ButtonEvent;
fn next(&mut self) -> Option<ButtonEvent> {
let rx = BROKER
.lock()
.unwrap()
.subscribe_once(Arc::clone(&self.filter), self.native_event_operation);
rx.recv().ok()
}
}