libadwaita/subclass/
message_dialog.rs

1use crate::{prelude::*, MessageDialog};
2use glib::translate::*;
3use gtk::subclass::prelude::*;
4
5pub trait MessageDialogImpl:
6    gtk::subclass::prelude::WindowImpl + ObjectSubclass<Type: IsA<MessageDialog>>
7{
8    fn response(&self, response: &str) {
9        self.parent_response(response)
10    }
11}
12
13pub trait MessageDialogImplExt: MessageDialogImpl {
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::AdwMessageDialogClass;
18            if let Some(f) = (*parent_class).response {
19                f(
20                    self.obj()
21                        .unsafe_cast_ref::<MessageDialog>()
22                        .to_glib_none()
23                        .0,
24                    response.to_glib_none().0,
25                )
26            }
27        }
28    }
29}
30
31impl<T: MessageDialogImpl> MessageDialogImplExt for T {}
32
33unsafe impl<T: MessageDialogImpl> IsSubclassable<T> for MessageDialog {
34    fn class_init(class: &mut glib::Class<Self>) {
35        Self::parent_class_init::<T>(class);
36
37        let klass = class.as_mut();
38        klass.response = Some(message_dialog_response::<T>);
39    }
40}
41
42unsafe extern "C" fn message_dialog_response<T: MessageDialogImpl>(
43    ptr: *mut ffi::AdwMessageDialog,
44    response: *const libc::c_char,
45) {
46    let instance = unsafe { &*(ptr as *mut T::Instance) };
47    let imp = instance.imp();
48
49    let response: Borrowed<glib::GString> = unsafe { from_glib_borrow(response) };
50
51    imp.response(response.as_ref())
52}