gtk/subclass/
cell_renderer_accel.rs1use 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}