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}