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