1use crate::AccelFlags;
4use crate::AccelGroup;
5use glib::object::{Cast, IsA};
6use glib::translate::*;
7use glib::ToValue;
8
9mod sealed {
10 pub trait Sealed {}
11 impl<T: glib::IsA<crate::AccelGroup>> Sealed for T {}
12}
13
14pub trait AccelGroupExtManual: IsA<AccelGroup> + sealed::Sealed + 'static {
15 fn connect_accel_group<F>(
16 &self,
17 accel_key: u32,
18 accel_mods: gdk::ModifierType,
19 accel_flags: AccelFlags,
20 func: F,
21 ) -> glib::Closure
22 where
23 F: Fn(&Self, &glib::Object, u32, gdk::ModifierType) -> bool + 'static,
24 {
25 let closure = glib::Closure::new_local(move |values| {
26 assert_eq!(values.len(), 4);
27 let s = values[0]
28 .get::<AccelGroup>()
29 .expect("Wrong argument type for first closure argument");
30 let s = s
31 .downcast::<Self>()
32 .expect("Wrong argument type for first closure argument");
33
34 let obj = values[1]
35 .get::<glib::Object>()
36 .expect("Wrong argument type for second closure argument");
37 let accel_key = values[2]
38 .get::<u32>()
39 .expect("Wrong argument type for third closure argument");
40 let accel_mods = values[3]
41 .get::<gdk::ModifierType>()
42 .expect("Wrong argument type for fourth closure argument");
43
44 let ret = func(&s, &obj, accel_key, accel_mods);
45
46 Some(ret.to_value())
47 });
48
49 unsafe {
50 ffi::gtk_accel_group_connect(
51 self.as_ref().to_glib_none().0,
52 accel_key,
53 accel_mods.into_glib(),
54 accel_flags.into_glib(),
55 closure.to_glib_none().0,
56 );
57 }
58
59 closure
60 }
61
62 fn connect_accel_group_by_path<F>(&self, accel_path: &str, func: F) -> glib::Closure
63 where
64 F: Fn(&Self, &glib::Object, u32, gdk::ModifierType) -> bool + 'static,
65 {
66 let closure = glib::Closure::new_local(move |values| {
67 assert_eq!(values.len(), 4);
68 let s = values[0]
69 .get::<AccelGroup>()
70 .expect("Wrong argument type for first closure argument");
71 let s = s
72 .downcast::<Self>()
73 .expect("Wrong argument type for first closure argument");
74 let obj = values[1]
75 .get::<glib::Object>()
76 .expect("Wrong argument type for second closure argument");
77 let accel_key = values[2]
78 .get::<u32>()
79 .expect("Wrong argument type for third closure argument");
80 let accel_mods = values[3]
81 .get::<gdk::ModifierType>()
82 .expect("Wrong argument type for fourth closure argument");
83
84 let ret = func(&s, &obj, accel_key, accel_mods);
85
86 Some(ret.to_value())
87 });
88
89 unsafe {
90 ffi::gtk_accel_group_connect_by_path(
91 self.as_ref().to_glib_none().0,
92 accel_path.to_glib_none().0,
93 closure.to_glib_none().0,
94 );
95 }
96
97 closure
98 }
99}
100
101impl<O: IsA<AccelGroup>> AccelGroupExtManual for O {}