gtk/subclass/
scrolled_window.rs1use glib::translate::*;
4
5use glib::subclass::prelude::*;
6
7use glib::Cast;
8
9use super::bin::BinImpl;
10use crate::DirectionType;
11use crate::ScrollType;
12use crate::ScrolledWindow;
13
14pub trait ScrolledWindowImpl: ScrolledWindowImplExt + BinImpl {
15 fn move_focus_out(&self, direction_type: DirectionType) {
16 self.parent_move_focus_out(direction_type)
17 }
18
19 fn scroll_child(&self, scroll: ScrollType, horizontal: bool) -> bool {
20 self.parent_scroll_child(scroll, horizontal)
21 }
22}
23
24mod sealed {
25 pub trait Sealed {}
26 impl<T: super::ScrolledWindowImpl> Sealed for T {}
27}
28
29pub trait ScrolledWindowImplExt: ObjectSubclass + sealed::Sealed {
30 fn parent_move_focus_out(&self, direction_type: DirectionType) {
31 unsafe {
32 let data = Self::type_data();
33 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkScrolledWindowClass;
34 if let Some(f) = (*parent_class).move_focus_out {
35 f(
36 self.obj()
37 .unsafe_cast_ref::<ScrolledWindow>()
38 .to_glib_none()
39 .0,
40 direction_type.into_glib(),
41 )
42 }
43 }
44 }
45 fn parent_scroll_child(&self, scroll: ScrollType, horizontal: bool) -> bool {
46 unsafe {
47 let data = Self::type_data();
48 let parent_class = data.as_ref().parent_class() as *mut ffi::GtkScrolledWindowClass;
49 if let Some(f) = (*parent_class).scroll_child {
50 from_glib(f(
51 self.obj()
52 .unsafe_cast_ref::<ScrolledWindow>()
53 .to_glib_none()
54 .0,
55 scroll.into_glib(),
56 horizontal.into_glib(),
57 ))
58 } else {
59 false
60 }
61 }
62 }
63}
64
65impl<T: ScrolledWindowImpl> ScrolledWindowImplExt for T {}
66
67unsafe impl<T: ScrolledWindowImpl> IsSubclassable<T> for ScrolledWindow {
68 fn class_init(class: &mut ::glib::Class<Self>) {
69 Self::parent_class_init::<T>(class);
70
71 let klass = class.as_mut();
72 klass.move_focus_out = Some(window_move_focus_out::<T>);
73 klass.scroll_child = Some(window_scroll_child::<T>);
74 }
75}
76
77unsafe extern "C" fn window_move_focus_out<T: ScrolledWindowImpl>(
78 ptr: *mut ffi::GtkScrolledWindow,
79 directiontypeptr: ffi::GtkDirectionType,
80) {
81 let instance = &*(ptr as *mut T::Instance);
82 let imp = instance.imp();
83 let direction_type: DirectionType = from_glib(directiontypeptr);
84
85 imp.move_focus_out(direction_type)
86}
87
88unsafe extern "C" fn window_scroll_child<T: ScrolledWindowImpl>(
89 ptr: *mut ffi::GtkScrolledWindow,
90 scrollptr: ffi::GtkScrollType,
91 horizontalptr: glib::ffi::gboolean,
92) -> glib::ffi::gboolean {
93 let instance = &*(ptr as *mut T::Instance);
94 let imp = instance.imp();
95 let scroll: ScrollType = from_glib(scrollptr);
96 let horizontal: bool = from_glib(horizontalptr);
97
98 imp.scroll_child(scroll, horizontal).into_glib()
99}