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
use std::cell::RefCell; use std::rc::Rc; /// Used to wait for a widget's signal. /// /// It's recommended to use it with the [`observer_new`] macro. /// /// Example: /// /// ``` /// extern crate gtk; /// #[macro_use] /// extern crate gtk_test; /// /// use gtk::GtkWindowExt; /// /// # fn main() { /// gtk::init().expect("initialization failed"); /// let window = gtk::Window::new(gtk::WindowType::Toplevel); /// /// let observer = observer_new!(window, connect_activate_focus, |_|); /// window.emit_activate_focus(); /// observer.wait(); /// # } /// ``` pub struct Observer { result: Rc<RefCell<bool>>, } impl Observer { /// Returns a new observer. /// /// It's recommended to not use it directly as is but instead to use the [`observer_new`] macro. /// /// But anyway, here's an example using it as is: /// /// ``` /// extern crate gtk; /// #[macro_use] /// extern crate gtk_test; /// /// use gtk::GtkWindowExt; /// /// # fn main() { /// gtk::init().expect("GTK init failed"); /// /// let window = gtk::Window::new(gtk::WindowType::Toplevel); /// /// let observer = gtk_test::Observer::new(); /// let inner = observer.get_inner().clone(); /// window.connect_activate_focus(move |_| { /// *inner.borrow_mut() = true; /// }); /// /// window.emit_activate_focus(); /// observer.wait(); /// # } /// ``` pub fn new() -> Observer { Observer { result: Rc::new(RefCell::new(false)), } } /// Returns the inner field. Just don't use it. pub fn get_inner(&self) -> &Rc<RefCell<bool>> { &self.result } /// Wait for the signal to be triggered. /// /// ``` /// extern crate gtk; /// #[macro_use] /// extern crate gtk_test; /// /// use gtk::GtkWindowExt; /// /// # fn main() { /// gtk::init().expect("initialization failed"); /// let window = gtk::Window::new(gtk::WindowType::Toplevel); /// /// let observer = observer_new!(window, connect_activate_focus, |_|); /// window.emit_activate_focus(); /// observer.wait(); /// # } /// ``` pub fn wait(&self) { loop { if let Ok(ref result) = self.result.try_borrow() { if **result == true { break } } ::run_loop(); } } }