libadwaita/subclass/
alert_dialog.rs

1use glib::subclass::prelude::*;
2use glib::translate::*;
3
4use super::dialog::AdwDialogImpl;
5use crate::{prelude::*, AlertDialog};
6
7pub trait AdwAlertDialogImpl: AdwDialogImpl + ObjectSubclass<Type: IsA<AlertDialog>> {
8    fn response(&self, response: &str) {
9        AdwAlertDialogImplExt::parent_response(self, response)
10    }
11}
12
13pub trait AdwAlertDialogImplExt: AdwAlertDialogImpl {
14    fn parent_response(&self, response: &str) {
15        unsafe {
16            let data = Self::type_data();
17            let parent_class = data.as_ref().parent_class() as *mut ffi::AdwAlertDialogClass;
18            if let Some(f) = (*parent_class).response {
19                f(
20                    self.obj().unsafe_cast_ref::<AlertDialog>().to_glib_none().0,
21                    response.to_glib_none().0,
22                )
23            }
24        }
25    }
26}
27
28impl<T: AdwAlertDialogImpl> AdwAlertDialogImplExt for T {}
29
30unsafe impl<T: AdwAlertDialogImpl> IsSubclassable<T> for AlertDialog {
31    fn class_init(class: &mut glib::Class<Self>) {
32        Self::parent_class_init::<T>(class);
33
34        let klass = class.as_mut();
35        klass.response = Some(response::<T>);
36    }
37}
38
39unsafe extern "C" fn response<T: AdwAlertDialogImpl>(
40    ptr: *mut ffi::AdwAlertDialog,
41    response: *const libc::c_char,
42) {
43    let instance = unsafe { &*(ptr as *mut T::Instance) };
44    let imp = instance.imp();
45
46    let response: Borrowed<glib::GString> = unsafe { from_glib_borrow(response) };
47
48    imp.response(response.as_ref())
49}