gtk4/subclass/
shortcut_manager.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3// rustdoc-stripper-ignore-next
4//! Traits intended for implementing the
5//! [`ShortcutManager`](crate::ShortcutManager) interface.
6
7use glib::translate::*;
8
9use crate::{ffi, prelude::*, subclass::prelude::*, ShortcutController, ShortcutManager};
10
11pub trait ShortcutManagerImpl: ObjectImpl {
12    fn add_controller(&self, controller: &ShortcutController) {
13        self.parent_add_controller(controller);
14    }
15
16    fn remove_controller(&self, controller: &ShortcutController) {
17        self.parent_remove_controller(controller)
18    }
19}
20
21mod sealed {
22    pub trait Sealed {}
23    impl<T: super::ShortcutManagerImplExt> Sealed for T {}
24}
25
26pub trait ShortcutManagerImplExt: sealed::Sealed + ObjectSubclass {
27    fn parent_add_controller(&self, controller: &ShortcutController) {
28        unsafe {
29            let type_data = Self::type_data();
30            let parent_iface = type_data.as_ref().parent_interface::<ShortcutManager>()
31                as *const ffi::GtkShortcutManagerInterface;
32
33            let func = (*parent_iface)
34                .add_controller
35                .expect("no parent \"add_controller\" implementation");
36
37            func(
38                self.obj()
39                    .unsafe_cast_ref::<ShortcutManager>()
40                    .to_glib_none()
41                    .0,
42                controller.to_glib_none().0,
43            )
44        }
45    }
46
47    fn parent_remove_controller(&self, controller: &ShortcutController) {
48        unsafe {
49            let type_data = Self::type_data();
50            let parent_iface = type_data.as_ref().parent_interface::<ShortcutManager>()
51                as *const ffi::GtkShortcutManagerInterface;
52
53            let func = (*parent_iface)
54                .remove_controller
55                .expect("no parent \"remove_controller\" implementation");
56
57            func(
58                self.obj()
59                    .unsafe_cast_ref::<ShortcutManager>()
60                    .to_glib_none()
61                    .0,
62                controller.to_glib_none().0,
63            )
64        }
65    }
66}
67
68impl<T: ShortcutManagerImpl> ShortcutManagerImplExt for T {}
69
70unsafe impl<T: ShortcutManagerImpl> IsImplementable<T> for ShortcutManager {
71    fn interface_init(iface: &mut glib::Interface<Self>) {
72        let iface = iface.as_mut();
73
74        assert_initialized_main_thread!();
75
76        iface.add_controller = Some(shortcut_manager_add_controller::<T>);
77        iface.remove_controller = Some(shortcut_manager_remove_controller::<T>);
78    }
79}
80
81unsafe extern "C" fn shortcut_manager_add_controller<T: ShortcutManagerImpl>(
82    shortcut_manager: *mut ffi::GtkShortcutManager,
83    controller: *mut ffi::GtkShortcutController,
84) {
85    let instance = &*(shortcut_manager as *mut T::Instance);
86    let imp = instance.imp();
87
88    imp.add_controller(&ShortcutController::from_glib_borrow(controller))
89}
90
91unsafe extern "C" fn shortcut_manager_remove_controller<T: ShortcutManagerImpl>(
92    shortcut_manager: *mut ffi::GtkShortcutManager,
93    controller: *mut ffi::GtkShortcutController,
94) {
95    let instance = &*(shortcut_manager as *mut T::Instance);
96    let imp = instance.imp();
97
98    imp.remove_controller(&ShortcutController::from_glib_borrow(controller))
99}