From 53663d0ecc00b0e88b5ae0263de4c57ed243099c Mon Sep 17 00:00:00 2001 From: Bo Bakker Date: Sun, 12 Apr 2015 16:02:06 +0200 Subject: [PATCH] Fixes #358 --- src/cocoa/mod.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/cocoa/mod.rs b/src/cocoa/mod.rs index 6b979647..db3948ba 100644 --- a/src/cocoa/mod.rs +++ b/src/cocoa/mod.rs @@ -32,7 +32,7 @@ use std::sync::Mutex; use std::ascii::AsciiExt; use std::ops::Deref; -use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput, MouseWheel}; +use events::Event::{Awakened, MouseInput, MouseMoved, ReceivedCharacter, KeyboardInput, MouseWheel, Closed}; use events::ElementState::{Pressed, Released}; use events::MouseButton; use events; @@ -56,6 +56,9 @@ struct DelegateState { view: IdRef, window: IdRef, resize_handler: Option, + + /// Events that have been retreived with XLib but not dispatched with iterators yet + pending_events: Mutex>, } struct WindowDelegate { @@ -73,6 +76,8 @@ impl WindowDelegate { let state: *mut libc::c_void = *this.get_ivar("glutinState"); let state = state as *mut DelegateState; (*state).is_closed = true; + + (*state).pending_events.lock().unwrap().push_back(Closed); } YES } @@ -147,9 +152,6 @@ pub struct Window { window: IdRef, context: IdRef, delegate: WindowDelegate, - - /// Events that have been retreived with XLib but not dispatched with iterators yet - pending_events: Mutex>, } #[cfg(feature = "window")] @@ -183,7 +185,7 @@ impl<'a> Iterator for PollEventsIterator<'a> { type Item = Event; fn next(&mut self) -> Option { - if let Some(ev) = self.window.pending_events.lock().unwrap().pop_front() { + if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() { return Some(ev); } @@ -231,7 +233,7 @@ impl<'a> Iterator for PollEventsIterator<'a> { let vkey = event::vkeycode_to_element(NSEvent::keyCode(event)); events.push_back(KeyboardInput(Pressed, NSEvent::keyCode(event) as u8, vkey)); let event = events.pop_front(); - self.window.pending_events.lock().unwrap().extend(events.into_iter()); + self.window.delegate.state.pending_events.lock().unwrap().extend(events.into_iter()); event }, NSKeyUp => { @@ -261,13 +263,15 @@ impl<'a> Iterator for PollEventsIterator<'a> { events.push_back(alt_modifier.unwrap()); } let event = events.pop_front(); - self.window.pending_events.lock().unwrap().extend(events.into_iter()); + self.window.delegate.state.pending_events.lock().unwrap().extend(events.into_iter()); event }, NSScrollWheel => { Some(MouseWheel(event.scrollingDeltaY() as i32)) }, _ => { None }, }; + + event } } @@ -282,7 +286,7 @@ impl<'a> Iterator for WaitEventsIterator<'a> { fn next(&mut self) -> Option { loop { - if let Some(ev) = self.window.pending_events.lock().unwrap().pop_front() { + if let Some(ev) = self.window.delegate.state.pending_events.lock().unwrap().pop_front() { return Some(ev); } @@ -347,6 +351,7 @@ impl Window { view: view.clone(), window: window.clone(), resize_handler: None, + pending_events: Mutex::new(VecDeque::new()), }; let window = Window { @@ -354,8 +359,6 @@ impl Window { window: window, context: context, delegate: WindowDelegate::new(ds), - - pending_events: Mutex::new(VecDeque::new()), }; Ok(window)