gtk4/subclass/
scrollable.rs
1use glib::translate::*;
7
8use crate::{ffi, prelude::*, subclass::prelude::*, Border, Scrollable};
9
10pub trait ScrollableImpl: WidgetImpl + ObjectSubclass<Type: IsA<Scrollable>> {
11 #[doc(alias = "get_border")]
12 fn border(&self) -> Option<Border> {
13 self.parent_border()
14 }
15}
16
17pub trait ScrollableImplExt: ScrollableImpl {
18 fn parent_border(&self) -> Option<Border> {
19 unsafe {
20 let type_data = Self::type_data();
21 let parent_iface = type_data.as_ref().parent_interface::<Scrollable>()
22 as *const ffi::GtkScrollableInterface;
23
24 if let Some(func) = (*parent_iface).get_border {
25 let border = std::ptr::null_mut();
26 if from_glib(func(
27 self.obj().unsafe_cast_ref::<Scrollable>().to_glib_none().0,
28 border,
29 )) {
30 return Some(from_glib_none(border));
31 }
32 }
33 None
34 }
35 }
36}
37
38impl<T: ScrollableImpl> ScrollableImplExt for T {}
39
40unsafe impl<T: ScrollableImpl> IsImplementable<T> for Scrollable {
41 fn interface_init(iface: &mut glib::Interface<Self>) {
42 let iface = iface.as_mut();
43
44 iface.get_border = Some(scrollable_get_border::<T>);
45 }
46}
47
48unsafe extern "C" fn scrollable_get_border<T: ScrollableImpl>(
49 scrollable: *mut ffi::GtkScrollable,
50 borderptr: *mut ffi::GtkBorder,
51) -> glib::ffi::gboolean {
52 let instance = &*(scrollable as *mut T::Instance);
53 let imp = instance.imp();
54
55 if let Some(border) = imp.border() {
56 *borderptr = *IntoGlibPtr::<*mut _>::into_glib_ptr(border);
57 true.into_glib()
58 } else {
59 *borderptr = ffi::GtkBorder {
60 top: 0,
61 right: 0,
62 left: 0,
63 bottom: 0,
64 };
65 false.into_glib()
66 }
67}