libadwaita/
application.rs

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