diff options
author | Glenn Watson <gw@intuitionlibrary.com> | 2015-02-10 13:59:20 +1000 |
---|---|---|
committer | Pierre Krieger <pierre.krieger1708@gmail.com> | 2015-02-10 08:32:29 +0100 |
commit | 8b3750ec3d79e481701abdcfb9b0ca6cc863c1a4 (patch) | |
tree | 2ec270641e9b91c988705557d5fb92f14ddf6e70 /src/android | |
parent | 4bfcedad3eafc87cc96cd0cbf691d0025ba15c98 (diff) | |
download | glutin-8b3750ec3d79e481701abdcfb9b0ca6cc863c1a4.tar.gz glutin-8b3750ec3d79e481701abdcfb9b0ca6cc863c1a4.zip |
Android: Use platform specific iterators.
Diffstat (limited to 'src/android')
-rw-r--r-- | src/android/mod.rs | 78 |
1 files changed, 53 insertions, 25 deletions
diff --git a/src/android/mod.rs b/src/android/mod.rs index ec6e1a3..5f05300 100644 --- a/src/android/mod.rs +++ b/src/android/mod.rs @@ -74,6 +74,52 @@ unsafe impl Send for HeadlessContext {} #[cfg(feature = "headless")] unsafe impl Sync for HeadlessContext {} +pub struct PollEventsIterator<'a> { + window: &'a Window, +} + +impl<'a> Iterator for PollEventsIterator<'a> { + type Item = Event; + + fn next(&mut self) -> Option<Event> { + match self.window.event_rx.try_recv() { + Ok(event) => { + Some(match event { + android_glue::Event::EventDown => MouseInput(Pressed, MouseButton::Left), + android_glue::Event::EventUp => MouseInput(Released, MouseButton::Left), + android_glue::Event::EventMove(x, y) => MouseMoved((x as i32, y as i32)), + }) + } + Err(_) => { + None + } + } + } +} + +pub struct WaitEventsIterator<'a> { + window: &'a Window, +} + +impl<'a> Iterator for WaitEventsIterator<'a> { + type Item = Event; + + fn next(&mut self) -> Option<Event> { + use std::time::Duration; + use std::old_io::timer; + + loop { + // calling poll_events() + if let Some(ev) = self.window.poll_events().next() { + return Some(ev); + } + + // TODO: Implement a proper way of sleeping on the event queue + timer::sleep(Duration::milliseconds(16)); + } + } +} + impl Window { pub fn new(builder: BuilderAttribs) -> Result<Window, CreationError> { use std::{mem, ptr}; @@ -242,34 +288,16 @@ impl Window { WindowProxy } - pub fn poll_events(&self) -> RingBuf<Event> { - let mut events = RingBuf::new(); - loop { - match self.event_rx.try_recv() { - Ok(event) => match event { - android_glue::Event::EventDown => { - events.push_back(MouseInput(Pressed, MouseButton::Left)); - }, - android_glue::Event::EventUp => { - events.push_back(MouseInput(Released, MouseButton::Left)); - }, - android_glue::Event::EventMove(x, y) => { - events.push_back(MouseMoved((x as i32, y as i32))); - }, - }, - Err(_) => { - break; - }, - } + pub fn poll_events(&self) -> PollEventsIterator { + PollEventsIterator { + window: self } - events } - pub fn wait_events(&self) -> RingBuf<Event> { - use std::time::Duration; - use std::old_io::timer; - timer::sleep(Duration::milliseconds(16)); - self.poll_events() + pub fn wait_events(&self) -> WaitEventsIterator { + WaitEventsIterator { + window: self + } } pub fn make_current(&self) { |