1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
use gdk_sys; use gtk_sys; use libc::{c_char, c_uint}; use glib::subclass::prelude::*; use glib::translate::*; use glib::GString; use super::cell_renderer_text::CellRendererTextImpl; use CellRendererAccel; use CellRendererAccelClass; use CellRendererTextClass; pub trait CellRendererAccelImpl: CellRendererAccelImplExt + CellRendererTextImpl + 'static { fn accel_edited( &self, renderer: &CellRendererAccel, path: &str, accel_key: u32, accel_mods: gdk::ModifierType, hardware_keycode: u32, ) { self.parent_accel_edited(renderer, path, accel_key, accel_mods, hardware_keycode); } fn accel_cleared(&self, renderer: &CellRendererAccel, path: &str) { self.parent_accel_cleared(renderer, path); } } pub trait CellRendererAccelImplExt { fn parent_accel_edited( &self, renderer: &CellRendererAccel, path: &str, accel_key: u32, accel_mods: gdk::ModifierType, hardware_keycode: u32, ); fn parent_accel_cleared(&self, renderer: &CellRendererAccel, path: &str); } impl<T: CellRendererAccelImpl + ObjectImpl> CellRendererAccelImplExt for T { fn parent_accel_edited( &self, renderer: &CellRendererAccel, path: &str, accel_key: u32, accel_mods: gdk::ModifierType, hardware_keycode: u32, ) { unsafe { let data = self.get_type_data(); let parent_class = data.as_ref().get_parent_class() as *mut gtk_sys::GtkCellRendererAccelClass; if let Some(f) = (*parent_class).accel_edited { f( renderer.to_glib_none().0, path.to_glib_none().0, accel_key, accel_mods.to_glib(), hardware_keycode, ) } } } fn parent_accel_cleared(&self, renderer: &CellRendererAccel, path: &str) { unsafe { let data = self.get_type_data(); let parent_class = data.as_ref().get_parent_class() as *mut gtk_sys::GtkCellRendererAccelClass; if let Some(f) = (*parent_class).accel_cleared { f(renderer.to_glib_none().0, path.to_glib_none().0) } } } } unsafe impl<T: ObjectSubclass + CellRendererAccelImpl> IsSubclassable<T> for CellRendererAccelClass { fn override_vfuncs(&mut self) { <CellRendererTextClass as IsSubclassable<T>>::override_vfuncs(self); unsafe { let klass = &mut *(self as *mut Self as *mut gtk_sys::GtkCellRendererAccelClass); klass.accel_edited = Some(cell_renderer_accel_edited::<T>); klass.accel_cleared = Some(cell_renderer_accel_cleared::<T>); } } } unsafe extern "C" fn cell_renderer_accel_edited<T: ObjectSubclass>( ptr: *mut gtk_sys::GtkCellRendererAccel, path: *const c_char, accel_key: c_uint, accel_mods: gdk_sys::GdkModifierType, hardware_keycode: c_uint, ) where T: CellRendererAccelImpl, { let instance = &*(ptr as *mut T::Instance); let imp = instance.get_impl(); let wrap = from_glib_borrow(ptr); imp.accel_edited( &wrap, &GString::from_glib_borrow(path), accel_key, from_glib(accel_mods), hardware_keycode, ) } unsafe extern "C" fn cell_renderer_accel_cleared<T: ObjectSubclass>( ptr: *mut gtk_sys::GtkCellRendererAccel, path: *const c_char, ) where T: CellRendererAccelImpl, { let instance = &*(ptr as *mut T::Instance); let imp = instance.get_impl(); let wrap = from_glib_borrow(ptr); imp.accel_cleared(&wrap, &GString::from_glib_borrow(path)) }