app.rs

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