use bevy::ecs::message::Message;
use objc2::rc::Retained;
use objc2_core_foundation::{CFRetained, CGPoint};
use objc2_core_graphics::CGDirectDisplayID;
use std::sync::mpsc::{Receiver, Sender, channel};
use crate::commands::Command;
use crate::config::Config;
use crate::errors::Result;
use crate::platform::{ProcessSerialNumber, WinID, WorkspaceObserver};
use crate::util::AXUIWrapper;
#[allow(dead_code)]
#[derive(Clone, Debug, Message)]
pub enum Event {
Exit,
ProcessesLoaded,
InitialConfig(Config),
ConfigRefresh(notify::Event),
ApplicationLaunched {
psn: ProcessSerialNumber,
observer: Retained<WorkspaceObserver>,
},
ApplicationTerminated { psn: ProcessSerialNumber },
ApplicationFrontSwitched { psn: ProcessSerialNumber },
ApplicationActivated,
ApplicationDeactivated,
ApplicationVisible { pid: i32 },
ApplicationHidden { pid: i32 },
WindowCreated { element: CFRetained<AXUIWrapper> },
WindowDestroyed { window_id: WinID },
WindowFocused { window_id: WinID },
WindowMoved { window_id: WinID },
WindowResized { window_id: WinID },
WindowMinimized { window_id: WinID },
WindowDeminimized { window_id: WinID },
WindowTitleChanged { window_id: WinID },
CurrentlyFocused,
MouseDown { point: CGPoint },
MouseUp { point: CGPoint },
MouseDragged { point: CGPoint },
MouseMoved { point: CGPoint },
Swipe { deltas: Vec<f64> },
SpaceCreated,
SpaceDestroyed,
SpaceChanged,
DisplayAdded { display_id: CGDirectDisplayID },
DisplayRemoved { display_id: CGDirectDisplayID },
DisplayMoved { display_id: CGDirectDisplayID },
DisplayResized { display_id: CGDirectDisplayID },
DisplayConfigured { display_id: CGDirectDisplayID },
DisplayChanged,
MissionControlShowAllWindows,
MissionControlShowFrontWindows,
MissionControlShowDesktop,
MissionControlExit,
DockDidChangePref { msg: String },
DockDidRestart { msg: String },
MenuOpened { window_id: WinID },
MenuClosed { window_id: WinID },
MenuBarHiddenChanged { msg: String },
SystemWoke { msg: String },
Command { command: Command },
PrintState,
}
#[derive(Clone, Debug)]
pub struct EventSender {
tx: Sender<Event>,
}
impl EventSender {
pub fn new() -> (Self, Receiver<Event>) {
let (tx, rx) = channel::<Event>();
(Self { tx }, rx)
}
pub fn send(&self, event: Event) -> Result<()> {
Ok(self.tx.send(event)?)
}
}