diff options
author | tomaka <pierre.krieger1708@gmail.com> | 2015-02-10 22:34:18 +0100 |
---|---|---|
committer | tomaka <pierre.krieger1708@gmail.com> | 2015-02-10 22:34:18 +0100 |
commit | 4500702a0294065f876ca10e7629fd32e213ca76 (patch) | |
tree | 0bf6f0f1580345f6441765e6e74cc64bcaf7e79a /src/android/mod.rs | |
parent | 605bd37554655436841e4cd2c4fbb3d046de2330 (diff) | |
parent | 95b1c96181e538004800942ae8ab07a81ec49454 (diff) | |
download | glutin-4500702a0294065f876ca10e7629fd32e213ca76.tar.gz glutin-4500702a0294065f876ca10e7629fd32e213ca76.zip |
Merge pull request #70 from tomaka/fix-iterators
Use platform-specific iterators instead
Diffstat (limited to 'src/android/mod.rs')
-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) { |