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