use std::sync::mpsc::Sender; use super::runner; use crate::event::Event; use crate::event_loop::EventLoopClosed; use crate::platform_impl::platform::r#async::Channel; pub struct EventLoopProxy { // used to wake the event loop handler, not to actually pass data runner: Channel, sender: Sender, } impl EventLoopProxy { pub fn new(runner: runner::Shared, sender: Sender) -> Self { Self { runner: Channel::new(runner, |runner, event| { runner.send_event(Event::UserEvent(event)) }) .unwrap(), sender, } } pub fn send_event(&self, event: T) -> Result<(), EventLoopClosed> { self.sender.send(event).unwrap(); self.runner.send(()); Ok(()) } } impl Clone for EventLoopProxy { fn clone(&self) -> Self { Self { runner: self.runner.clone(), sender: self.sender.clone(), } } }