gtk/auto/
event_controller.rs1use gdk;
6use glib::object::Cast;
7use glib::object::IsA;
8use glib::signal::connect_raw;
9use glib::signal::SignalHandlerId;
10use glib::translate::*;
11use glib_sys;
12use gtk_sys;
13use std::boxed::Box as Box_;
14use std::fmt;
15use std::mem::transmute;
16use PropagationPhase;
17use Widget;
18
19glib_wrapper! {
20 pub struct EventController(Object<gtk_sys::GtkEventController, gtk_sys::GtkEventControllerClass, EventControllerClass>);
21
22 match fn {
23 get_type => || gtk_sys::gtk_event_controller_get_type(),
24 }
25}
26
27pub const NONE_EVENT_CONTROLLER: Option<&EventController> = None;
28
29pub trait EventControllerExt: 'static {
30 fn get_propagation_phase(&self) -> PropagationPhase;
31
32 fn get_widget(&self) -> Option<Widget>;
33
34 fn handle_event(&self, event: &gdk::Event) -> bool;
35
36 fn reset(&self);
37
38 fn set_propagation_phase(&self, phase: PropagationPhase);
39
40 fn connect_property_propagation_phase_notify<F: Fn(&Self) + 'static>(
41 &self,
42 f: F,
43 ) -> SignalHandlerId;
44}
45
46impl<O: IsA<EventController>> EventControllerExt for O {
47 fn get_propagation_phase(&self) -> PropagationPhase {
48 unsafe {
49 from_glib(gtk_sys::gtk_event_controller_get_propagation_phase(
50 self.as_ref().to_glib_none().0,
51 ))
52 }
53 }
54
55 fn get_widget(&self) -> Option<Widget> {
56 unsafe {
57 from_glib_none(gtk_sys::gtk_event_controller_get_widget(
58 self.as_ref().to_glib_none().0,
59 ))
60 }
61 }
62
63 fn handle_event(&self, event: &gdk::Event) -> bool {
64 unsafe {
65 from_glib(gtk_sys::gtk_event_controller_handle_event(
66 self.as_ref().to_glib_none().0,
67 event.to_glib_none().0,
68 ))
69 }
70 }
71
72 fn reset(&self) {
73 unsafe {
74 gtk_sys::gtk_event_controller_reset(self.as_ref().to_glib_none().0);
75 }
76 }
77
78 fn set_propagation_phase(&self, phase: PropagationPhase) {
79 unsafe {
80 gtk_sys::gtk_event_controller_set_propagation_phase(
81 self.as_ref().to_glib_none().0,
82 phase.to_glib(),
83 );
84 }
85 }
86
87 fn connect_property_propagation_phase_notify<F: Fn(&Self) + 'static>(
88 &self,
89 f: F,
90 ) -> SignalHandlerId {
91 unsafe extern "C" fn notify_propagation_phase_trampoline<P, F: Fn(&P) + 'static>(
92 this: *mut gtk_sys::GtkEventController,
93 _param_spec: glib_sys::gpointer,
94 f: glib_sys::gpointer,
95 ) where
96 P: IsA<EventController>,
97 {
98 let f: &F = &*(f as *const F);
99 f(&EventController::from_glib_borrow(this).unsafe_cast())
100 }
101 unsafe {
102 let f: Box_<F> = Box_::new(f);
103 connect_raw(
104 self.as_ptr() as *mut _,
105 b"notify::propagation-phase\0".as_ptr() as *const _,
106 Some(transmute(
107 notify_propagation_phase_trampoline::<Self, F> as usize,
108 )),
109 Box_::into_raw(f),
110 )
111 }
112 }
113}
114
115impl fmt::Display for EventController {
116 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
117 write!(f, "EventController")
118 }
119}