libadwaita/subclass/
message_dialog.rs1use 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}