app.rs

 1use super::{BoolExt as _, Dispatcher, FontSystem, Window};
 2use crate::{executor, platform};
 3use anyhow::Result;
 4use cocoa::{appkit::NSApplication, base::nil};
 5use objc::{msg_send, sel, sel_impl};
 6use std::{rc::Rc, sync::Arc};
 7
 8pub struct App {
 9    dispatcher: Arc<Dispatcher>,
10    fonts: Arc<FontSystem>,
11}
12
13impl App {
14    pub fn new() -> Self {
15        Self {
16            dispatcher: Arc::new(Dispatcher),
17            fonts: Arc::new(FontSystem::new()),
18        }
19    }
20}
21
22impl platform::App for App {
23    fn dispatcher(&self) -> Arc<dyn platform::Dispatcher> {
24        self.dispatcher.clone()
25    }
26
27    fn activate(&self, ignoring_other_apps: bool) {
28        unsafe {
29            let app = NSApplication::sharedApplication(nil);
30            app.activateIgnoringOtherApps_(ignoring_other_apps.to_objc());
31        }
32    }
33
34    fn open_window(
35        &self,
36        options: platform::WindowOptions,
37        executor: Rc<executor::Foreground>,
38    ) -> Result<Box<dyn platform::Window>> {
39        Ok(Box::new(Window::open(options, executor, self.fonts())?))
40    }
41
42    fn fonts(&self) -> Arc<dyn platform::FontSystem> {
43        self.fonts.clone()
44    }
45
46    fn quit(&self) {
47        unsafe {
48            let app = NSApplication::sharedApplication(nil);
49            let _: () = msg_send![app, terminate: nil];
50        }
51    }
52}