use crate::Desktop;
use crate::DesktopEventThread;
use crate::Error;
use windows::Win32::Foundation::HWND;
#[derive(Clone)]
pub enum DesktopEventSender<T>
where
T: 'static,
{
Std(std::sync::mpsc::Sender<T>),
#[cfg(feature = "crossbeam-channel")]
Crossbeam(crossbeam_channel::Sender<T>),
#[cfg(feature = "winit")]
Winit(winit::event_loop::EventLoopProxy<T>),
}
impl<T> From<std::sync::mpsc::Sender<T>> for DesktopEventSender<T>
where
T: From<DesktopEvent> + Clone + Send + 'static,
{
fn from(sender: std::sync::mpsc::Sender<T>) -> Self {
DesktopEventSender::Std(sender)
}
}
#[cfg(feature = "crossbeam-channel")]
impl<T> From<crossbeam_channel::Sender<T>> for DesktopEventSender<T>
where
T: From<DesktopEvent> + Clone + Send + 'static,
{
fn from(sender: crossbeam_channel::Sender<T>) -> Self {
DesktopEventSender::Crossbeam(sender)
}
}
#[cfg(feature = "winit")]
impl<T> From<winit::event_loop::EventLoopProxy<T>> for DesktopEventSender<T>
where
T: From<DesktopEvent> + Clone + Send + 'static,
{
fn from(sender: winit::event_loop::EventLoopProxy<T>) -> Self {
DesktopEventSender::Winit(sender)
}
}
impl<T> DesktopEventSender<T> {
pub fn try_send(&self, event: T) {
match self {
DesktopEventSender::Std(sender) => {
let _ = sender.send(event);
}
#[cfg(feature = "crossbeam-channel")]
DesktopEventSender::Crossbeam(sender) => {
let _ = sender.try_send(event);
}
#[cfg(feature = "winit")]
DesktopEventSender::Winit(sender) => {
let _ = sender.send_event(event);
}
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum DesktopEvent {
DesktopCreated(Desktop),
DesktopDestroyed {
destroyed: Desktop,
fallback: Desktop,
},
DesktopChanged {
new: Desktop,
old: Desktop,
},
DesktopNameChanged(Desktop, String),
DesktopWallpaperChanged(Desktop, String),
DesktopMoved {
desktop: Desktop,
old_index: i64,
new_index: i64,
},
WindowChanged(HWND),
}
pub fn listen_desktop_events<T, S>(sender: S) -> Result<DesktopEventThread, Error>
where
T: From<DesktopEvent> + Clone + Send + 'static,
S: Into<DesktopEventSender<T>> + Clone,
{
DesktopEventThread::new(sender.into())
}