diff --git a/gio/src/subclass/application.rs b/gio/src/subclass/application.rs index 4e4396a0bb5d..559233edc434 100644 --- a/gio/src/subclass/application.rs +++ b/gio/src/subclass/application.rs @@ -2,7 +2,9 @@ use std::{ffi::OsString, fmt, ops::Deref, ptr}; -use glib::{prelude::*, subclass::prelude::*, translate::*, Error, ExitCode, VariantDict}; +use glib::{ + prelude::*, subclass::prelude::*, translate::*, Error, ExitCode, Propagation, VariantDict, +}; use libc::{c_char, c_int, c_void}; use crate::{ffi, ActionGroup, ActionMap, Application, DBusConnection}; @@ -118,6 +120,10 @@ pub trait ApplicationImpl: fn dbus_unregister(&self, connection: &DBusConnection, object_path: &str) { self.parent_dbus_unregister(connection, object_path) } + + fn name_lost(&self) -> Propagation { + self.parent_name_lost() + } } pub trait ApplicationImplExt: ApplicationImpl { @@ -316,6 +322,21 @@ pub trait ApplicationImplExt: ApplicationImpl { ); } } + + fn parent_name_lost(&self) -> Propagation { + unsafe { + let data = Self::type_data(); + let parent_class = data.as_ref().parent_class() as *mut ffi::GApplicationClass; + let f = (*parent_class) + .name_lost + .expect("No parent class implementation for \"name_lost\""); + Propagation::from_glib(f(self + .obj() + .unsafe_cast_ref::() + .to_glib_none() + .0)) + } + } } impl ApplicationImplExt for T {} @@ -338,6 +359,7 @@ unsafe impl IsSubclassable for Application { klass.handle_local_options = Some(application_handle_local_options::); klass.dbus_register = Some(application_dbus_register::); klass.dbus_unregister = Some(application_dbus_unregister::); + klass.name_lost = Some(application_name_lost::); } } @@ -478,6 +500,14 @@ unsafe extern "C" fn application_dbus_unregister( ); } +unsafe extern "C" fn application_name_lost( + ptr: *mut ffi::GApplication, +) -> glib::ffi::gboolean { + let instance = &*(ptr as *mut T::Instance); + let imp = instance.imp(); + imp.name_lost().into_glib() +} + #[cfg(test)] mod tests { use super::*;