mod callback;
mod event_loop;
mod utils;
use std::time::Duration;
use crate::MousePosition;
pub use self::callback::*;
use self::event_loop::*;
use Keycode;
use MouseButton;
pub trait DeviceEvents {
fn on_key_down<Callback: Fn(&Keycode) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback>;
fn on_key_up<Callback: Fn(&Keycode) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback>;
fn on_mouse_move<Callback: Fn(&MousePosition) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback>;
fn on_mouse_down<Callback: Fn(&MouseButton) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback>;
fn on_mouse_up<Callback: Fn(&MouseButton) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback>;
}
pub struct DeviceEventsHandler;
impl DeviceEventsHandler {
pub fn new(sleep_dur: Duration) -> Option<Self> {
event_loop::init_event_loop(sleep_dur).then_some(DeviceEventsHandler)
}
}
macro_rules! get_event_loop {
() => {
EVENT_LOOP
.lock()
.expect("Couldn't lock EVENT_LOOP")
.as_mut()
.unwrap()
};
}
impl DeviceEvents for DeviceEventsHandler {
fn on_key_down<Callback: Fn(&Keycode) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback> {
get_event_loop!().on_key_down(callback)
}
fn on_key_up<Callback: Fn(&Keycode) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback> {
get_event_loop!().on_key_up(callback)
}
fn on_mouse_move<Callback: Fn(&MousePosition) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback> {
get_event_loop!().on_mouse_move(callback)
}
fn on_mouse_down<Callback: Fn(&MouseButton) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback> {
get_event_loop!().on_mouse_down(callback)
}
fn on_mouse_up<Callback: Fn(&MouseButton) + Sync + Send + 'static>(
&self,
callback: Callback,
) -> CallbackGuard<Callback> {
get_event_loop!().on_mouse_up(callback)
}
}