libadwaita/
application.rs1use 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}