gtk/
accel_group.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use 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 {}