aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGlenn Watson <gw@intuitionlibrary.com>2015-02-10 13:59:20 +1000
committerPierre Krieger <pierre.krieger1708@gmail.com>2015-02-10 08:32:29 +0100
commit8b3750ec3d79e481701abdcfb9b0ca6cc863c1a4 (patch)
tree2ec270641e9b91c988705557d5fb92f14ddf6e70 /src
parent4bfcedad3eafc87cc96cd0cbf691d0025ba15c98 (diff)
downloadglutin-8b3750ec3d79e481701abdcfb9b0ca6cc863c1a4.tar.gz
glutin-8b3750ec3d79e481701abdcfb9b0ca6cc863c1a4.zip
Android: Use platform specific iterators.
Diffstat (limited to 'src')
-rw-r--r--src/android/mod.rs78
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) {