Skip to main content

gtk/subclass/
cell_renderer_accel.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use libc::{c_char, c_uint};
4
5use glib::subclass::prelude::*;
6use glib::translate::*;
7use glib::{GString, object::Cast};
8
9use super::cell_renderer_text::CellRendererTextImpl;
10use crate::{CellRendererAccel, ffi};
11
12pub trait CellRendererAccelImpl: CellRendererAccelImplExt + CellRendererTextImpl {
13    fn accel_edited(
14        &self,
15        path: &str,
16        accel_key: u32,
17        accel_mods: gdk::ModifierType,
18        hardware_keycode: u32,
19    ) {
20        self.parent_accel_edited(path, accel_key, accel_mods, hardware_keycode);
21    }
22
23    fn accel_cleared(&self, path: &str) {
24        self.parent_accel_cleared(path);
25    }
26}
27
28mod sealed {
29    pub trait Sealed {}
30    impl<T: super::CellRendererAccelImpl> Sealed for T {}
31}
32
33pub trait CellRendererAccelImplExt: ObjectSubclass + sealed::Sealed {
34    fn parent_accel_edited(
35        &self,
36        path: &str,
37        accel_key: u32,
38        accel_mods: gdk::ModifierType,
39        hardware_keycode: u32,
40    ) {
41        unsafe {
42            let data = Self::type_data();
43            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkCellRendererAccelClass;
44            if let Some(f) = (*parent_class).accel_edited {
45                f(
46                    self.obj()
47                        .unsafe_cast_ref::<CellRendererAccel>()
48                        .to_glib_none()
49                        .0,
50                    path.to_glib_none().0,
51                    accel_key,
52                    accel_mods.into_glib(),
53                    hardware_keycode,
54                )
55            }
56        }
57    }
58    fn parent_accel_cleared(&self, path: &str) {
59        unsafe {
60            let data = Self::type_data();
61            let parent_class = data.as_ref().parent_class() as *mut ffi::GtkCellRendererAccelClass;
62            if let Some(f) = (*parent_class).accel_cleared {
63                f(
64                    self.obj()
65                        .unsafe_cast_ref::<CellRendererAccel>()
66                        .to_glib_none()
67                        .0,
68                    path.to_glib_none().0,
69                )
70            }
71        }
72    }
73}
74
75impl<T: CellRendererAccelImpl> CellRendererAccelImplExt for T {}
76
77unsafe impl<T: CellRendererAccelImpl> IsSubclassable<T> for CellRendererAccel {
78    fn class_init(class: &mut ::glib::Class<Self>) {
79        Self::parent_class_init::<T>(class);
80
81        if !crate::rt::is_initialized() {
82            panic!("GTK has to be initialized first");
83        }
84
85        let klass = class.as_mut();
86        klass.accel_edited = Some(cell_renderer_accel_edited::<T>);
87        klass.accel_cleared = Some(cell_renderer_accel_cleared::<T>);
88    }
89}
90
91unsafe extern "C" fn cell_renderer_accel_edited<T: CellRendererAccelImpl>(
92    ptr: *mut ffi::GtkCellRendererAccel,
93    path: *const c_char,
94    accel_key: c_uint,
95    accel_mods: gdk::ffi::GdkModifierType,
96    hardware_keycode: c_uint,
97) {
98    unsafe {
99        let instance = &*(ptr as *mut T::Instance);
100        let imp = instance.imp();
101
102        imp.accel_edited(
103            &GString::from_glib_borrow(path),
104            accel_key,
105            from_glib(accel_mods),
106            hardware_keycode,
107        )
108    }
109}
110
111unsafe extern "C" fn cell_renderer_accel_cleared<T: CellRendererAccelImpl>(
112    ptr: *mut ffi::GtkCellRendererAccel,
113    path: *const c_char,
114) {
115    unsafe {
116        let instance = &*(ptr as *mut T::Instance);
117        let imp = instance.imp();
118
119        imp.accel_cleared(&GString::from_glib_borrow(path))
120    }
121}