use std::cell::RefCell; use std::ops::Deref; use std::rc::Rc; use std::time::{Duration, Instant}; use calloop::{EventLoop, LoopHandle}; use collections::HashMap; use util::ResultExt; use crate::platform::linux::LinuxClient; use crate::platform::{LinuxCommon, PlatformWindow}; use crate::{ px, AnyWindowHandle, Bounds, CursorStyle, DisplayId, Modifiers, ModifiersChangedEvent, Pixels, PlatformDisplay, PlatformInput, Point, ScrollDelta, Size, TouchPhase, WindowParams, }; use calloop::{ generic::{FdWrapper, Generic}, RegistrationToken, }; pub struct HeadlessClientState { pub(crate) loop_handle: LoopHandle<'static, HeadlessClient>, pub(crate) event_loop: Option>, pub(crate) common: LinuxCommon, } #[derive(Clone)] pub(crate) struct HeadlessClient(Rc>); impl HeadlessClient { pub(crate) fn new() -> Self { let event_loop = EventLoop::try_new().unwrap(); let (common, main_receiver) = LinuxCommon::new(event_loop.get_signal()); let handle = event_loop.handle(); handle.insert_source(main_receiver, |event, _, _: &mut HeadlessClient| { if let calloop::channel::Event::Msg(runnable) = event { runnable.run(); } }); HeadlessClient(Rc::new(RefCell::new(HeadlessClientState { event_loop: Some(event_loop), loop_handle: handle, common, }))) } } impl LinuxClient for HeadlessClient { fn with_common(&self, f: impl FnOnce(&mut LinuxCommon) -> R) -> R { f(&mut self.0.borrow_mut().common) } fn displays(&self) -> Vec> { vec![] } fn primary_display(&self) -> Option> { None } fn display(&self, id: DisplayId) -> Option> { None } fn open_window( &self, _handle: AnyWindowHandle, params: WindowParams, ) -> Box { unimplemented!() } fn set_cursor_style(&self, _style: CursorStyle) {} fn open_uri(&self, _uri: &str) {} fn write_to_primary(&self, item: crate::ClipboardItem) {} fn write_to_clipboard(&self, item: crate::ClipboardItem) {} fn read_from_primary(&self) -> Option { None } fn read_from_clipboard(&self) -> Option { None } fn run(&self) { let mut event_loop = self .0 .borrow_mut() .event_loop .take() .expect("App is already running"); event_loop.run(None, &mut self.clone(), |_| {}).log_err(); } }