Skip to main content

gtk/
application.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use crate::Application;
4use crate::{ffi, rt};
5use gio::ApplicationFlags;
6use gio::prelude::*;
7use glib::signal::SignalHandlerId;
8use glib::translate::*;
9
10use std::cell::RefCell;
11use std::rc::Rc;
12
13impl Application {
14    #[doc(alias = "gtk_application_new")]
15    pub fn new(application_id: Option<&str>, flags: ApplicationFlags) -> Application {
16        skip_assert_initialized!();
17        let app: Application = unsafe {
18            from_glib_full(ffi::gtk_application_new(
19                application_id.to_glib_none().0,
20                flags.into_glib(),
21            ))
22        };
23        Application::register_startup_hook(&app);
24        app
25    }
26
27    pub(crate) fn register_startup_hook(app: &Application) {
28        skip_assert_initialized!();
29        let signalid: Rc<RefCell<Option<SignalHandlerId>>> = Rc::new(RefCell::new(None));
30        {
31            let signalid_ = signalid.clone();
32
33            let id = app.connect_startup(move |app| {
34                app.disconnect(
35                    signalid_
36                        .borrow_mut()
37                        .take()
38                        .expect("Signal ID went missing"),
39                );
40                unsafe { rt::set_initialized() }
41            });
42            *signalid.borrow_mut() = Some(id);
43        }
44    }
45}