1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
use gtk_sys; use glib::translate::*; use glib::subclass::prelude::*; use Application; use ApplicationClass; use Window; pub trait GtkApplicationImpl: GtkApplicationImplExt + gio::subclass::prelude::ApplicationImpl + 'static { fn window_added(&self, application: &Application, window: &Window) { self.parent_window_added(application, window) } fn window_removed(&self, application: &Application, window: &Window) { self.parent_window_removed(application, window) } } pub trait GtkApplicationImplExt { fn parent_window_added(&self, application: &Application, window: &Window); fn parent_window_removed(&self, application: &Application, window: &Window); } impl<T: GtkApplicationImpl + ObjectImpl> GtkApplicationImplExt for T { fn parent_window_added(&self, application: &Application, window: &Window) { unsafe { let data = self.get_type_data(); let parent_class = data.as_ref().get_parent_class() as *mut gtk_sys::GtkApplicationClass; if let Some(f) = (*parent_class).window_added { f(application.to_glib_none().0, window.to_glib_none().0) } } } fn parent_window_removed(&self, application: &Application, window: &Window) { unsafe { let data = self.get_type_data(); let parent_class = data.as_ref().get_parent_class() as *mut gtk_sys::GtkApplicationClass; if let Some(f) = (*parent_class).window_removed { f(application.to_glib_none().0, window.to_glib_none().0) } } } } unsafe impl<T: ObjectSubclass + GtkApplicationImpl> IsSubclassable<T> for ApplicationClass { fn override_vfuncs(&mut self) { unsafe extern "C" fn application_window_added<T: ObjectSubclass>( ptr: *mut gtk_sys::GtkApplication, wptr: *mut gtk_sys::GtkWindow, ) where T: GtkApplicationImpl, { let instance = &*(ptr as *mut T::Instance); let imp = instance.get_impl(); let wrap: Application = from_glib_borrow(ptr); imp.window_added(&wrap, &from_glib_borrow(wptr)) } unsafe extern "C" fn application_window_removed<T: ObjectSubclass>( ptr: *mut gtk_sys::GtkApplication, wptr: *mut gtk_sys::GtkWindow, ) where T: GtkApplicationImpl, { let instance = &*(ptr as *mut T::Instance); let imp = instance.get_impl(); let wrap: Application = from_glib_borrow(ptr); imp.window_removed(&wrap, &from_glib_borrow(wptr)) } <gio::ApplicationClass as IsSubclassable<T>>::override_vfuncs(self); unsafe { let klass = &mut *(self as *mut Self as *mut gtk_sys::GtkApplicationClass); klass.window_added = Some(application_window_added::<T>); klass.window_removed = Some(application_window_removed::<T>); } } }