diff --git a/README.md b/README.md index 8765f378..9ca5757e 100644 --- a/README.md +++ b/README.md @@ -49,12 +49,14 @@ fn main() { gl::ClearColor(0.0, 1.0, 0.0, 1.0); } - while !window.is_closed() { - window.wait_events(); - + for event in window.wait_events() { unsafe { gl::Clear(gl::COLOR_BUFFER_BIT) }; - window.swap_buffers(); + + match event { + glutin::Event::Closed => break, + _ => () + } } } ``` diff --git a/examples/cursor.rs b/examples/cursor.rs index 8b0d818e..d15deff7 100644 --- a/examples/cursor.rs +++ b/examples/cursor.rs @@ -25,25 +25,22 @@ fn main() { let cursors = [MouseCursor::Default, MouseCursor::Crosshair, MouseCursor::Hand, MouseCursor::Arrow, MouseCursor::Move, MouseCursor::Text, MouseCursor::Wait, MouseCursor::Help, MouseCursor::Progress, MouseCursor::NotAllowed, MouseCursor::ContextMenu, MouseCursor::NoneCursor, MouseCursor::Cell, MouseCursor::VerticalText, MouseCursor::Alias, MouseCursor::Copy, MouseCursor::NoDrop, MouseCursor::Grab, MouseCursor::Grabbing, MouseCursor::AllScroll, MouseCursor::ZoomIn, MouseCursor::ZoomOut, MouseCursor::EResize, MouseCursor::NResize, MouseCursor::NeResize, MouseCursor::NwResize, MouseCursor::SResize, MouseCursor::SeResize, MouseCursor::SwResize, MouseCursor::WResize, MouseCursor::EwResize, MouseCursor::NsResize, MouseCursor::NeswResize, MouseCursor::NwseResize, MouseCursor::ColResize, MouseCursor::RowResize]; let mut cursor_idx = 0; - while !window.is_closed() { + for event in window.wait_events() { + match event { + Event::KeyboardInput(ElementState::Pressed, _, _) => { + println!("Setting cursor to \"{:?}\"", cursors[cursor_idx]); + window.set_cursor(cursors[cursor_idx]); + if cursor_idx < cursors.len() - 1 { + cursor_idx += 1; + } else { + cursor_idx = 0; + } + }, + Event::Closed => break, + _ => (), + } + context.draw_frame((0.0, 1.0, 0.0, 1.0)); window.swap_buffers(); - - for event in window.wait_events() { - match event { - Event::KeyboardInput(ElementState::Pressed, _, _) => { - println!("Setting cursor to \"{:?}\"", cursors[cursor_idx]); - window.set_cursor(cursors[cursor_idx]); - if cursor_idx < cursors.len() - 1 { - cursor_idx += 1; - } else { - cursor_idx = 0; - } - }, - _ => (), - } - - } - } } diff --git a/examples/fullscreen.rs b/examples/fullscreen.rs index 246a1626..707fd7d6 100644 --- a/examples/fullscreen.rs +++ b/examples/fullscreen.rs @@ -46,10 +46,15 @@ fn main() { let context = support::load(&window); - while !window.is_closed() { + for event in window.wait_events() { context.draw_frame((0.0, 1.0, 0.0, 1.0)); window.swap_buffers(); - println!("{:?}", window.wait_events().next()); + println!("{:?}", event); + + match event { + glutin::Event::Closed => break, + _ => () + } } } diff --git a/examples/grabbing.rs b/examples/grabbing.rs index 738a939c..a0a8fdab 100644 --- a/examples/grabbing.rs +++ b/examples/grabbing.rs @@ -23,33 +23,29 @@ fn main() { let context = support::load(&window); let mut grabbed = false; - while !window.is_closed() { + for event in window.poll_events() { + match event { + Event::KeyboardInput(ElementState::Pressed, _, _) => { + if grabbed { + grabbed = false; + window.set_cursor_state(glutin::CursorState::Normal) + .ok().expect("could not ungrab mouse cursor"); + } else { + grabbed = true; + window.set_cursor_state(glutin::CursorState::Grab) + .ok().expect("could not grab mouse cursor"); + } + }, + + a @ Event::MouseMoved(_) => { + println!("{:?}", a); + }, + + _ => (), + } + context.draw_frame((0.0, 1.0, 0.0, 1.0)); window.swap_buffers(); - - for event in window.poll_events() { - match event { - Event::KeyboardInput(ElementState::Pressed, _, _) => { - if grabbed { - grabbed = false; - window.set_cursor_state(glutin::CursorState::Normal) - .ok().expect("could not ungrab mouse cursor"); - } else { - grabbed = true; - window.set_cursor_state(glutin::CursorState::Grab) - .ok().expect("could not grab mouse cursor"); - } - }, - - a @ Event::MouseMoved(_) => { - println!("{:?}", a); - }, - - _ => (), - } - - } - } } diff --git a/examples/multiwindow.rs b/examples/multiwindow.rs index 503e0a05..074fe14e 100644 --- a/examples/multiwindow.rs +++ b/examples/multiwindow.rs @@ -43,10 +43,13 @@ fn run(window: glutin::Window, color: (f32, f32, f32, f32)) { let context = support::load(&window); - while !window.is_closed() { + for event in window.wait_events() { context.draw_frame(color); window.swap_buffers(); - window.wait_events().next(); + match event { + glutin::Event::Closed => break, + _ => () + } } } diff --git a/examples/transparent.rs b/examples/transparent.rs index 01c084a6..fa6a8de8 100644 --- a/examples/transparent.rs +++ b/examples/transparent.rs @@ -31,10 +31,15 @@ fn main() { let context = support::load(&window); - while !window.is_closed() { + for event in window.wait_events() { context.draw_frame((0.0, 0.0, 0.0, 0.0)); window.swap_buffers(); - println!("{:?}", window.wait_events().next()); + println!("{:?}", event); + + match event { + glutin::Event::Closed => break, + _ => () + } } } diff --git a/examples/vsync.rs b/examples/vsync.rs deleted file mode 100644 index 4ae25984..00000000 --- a/examples/vsync.rs +++ /dev/null @@ -1,48 +0,0 @@ -#[cfg(target_os = "android")] -#[macro_use] -extern crate android_glue; - -extern crate clock_ticks; -extern crate glutin; - -mod support; - -#[cfg(target_os = "android")] -android_start!(main); - -#[cfg(not(feature = "window"))] -fn main() { println!("This example requires glutin to be compiled with the `window` feature"); } - -#[cfg(feature = "window")] -fn resize_callback(width: u32, height: u32) { - println!("Window resized to {}x{}", width, height); -} - -#[cfg(feature = "window")] -fn main() { - println!("Vsync example. This example may panic if your driver or your system forces \ - you out of vsync. This is intended when `build_strict` is used."); - - let mut window = glutin::WindowBuilder::new().with_gl_profile(glutin::GlProfile::Compatibility) - .with_vsync() - .build_strict().unwrap(); - window.set_window_resize_callback(Some(resize_callback as fn(u32, u32))); - unsafe { window.make_current() }; - - let context = support::load(&window); - - while !window.is_closed() { - let before = clock_ticks::precise_time_ns(); - - context.draw_frame((0.0, 1.0, 0.0, 1.0)); - window.swap_buffers(); - - for ev in window.poll_events() { - println!("{:?}", ev); - } - - let after = clock_ticks::precise_time_ns(); - println!("Vsync example - Time of previous frame: {}ms", - (after - before) as f32 / 1000000.0); - } -} diff --git a/examples/window.rs b/examples/window.rs index d4e1a8dc..f686a514 100644 --- a/examples/window.rs +++ b/examples/window.rs @@ -28,10 +28,15 @@ fn main() { let context = support::load(&window); - while !window.is_closed() { + for event in window.wait_events() { context.draw_frame((0.0, 1.0, 0.0, 1.0)); window.swap_buffers(); - println!("{:?}", window.wait_events().next()); + println!("{:?}", event); + + match event { + glutin::Event::Closed => break, + _ => () + } } } diff --git a/src/api/caca/mod.rs b/src/api/caca/mod.rs index 4c544348..3b4018e8 100644 --- a/src/api/caca/mod.rs +++ b/src/api/caca/mod.rs @@ -130,10 +130,6 @@ impl Window { }) } - pub fn is_closed(&self) -> bool { - false - } - pub fn set_title(&self, title: &str) { } diff --git a/src/api/cocoa/mod.rs b/src/api/cocoa/mod.rs index 5cb7edbf..772b9065 100644 --- a/src/api/cocoa/mod.rs +++ b/src/api/cocoa/mod.rs @@ -60,7 +60,6 @@ static mut win_pressed: bool = false; static mut alt_pressed: bool = false; struct DelegateState { - is_closed: bool, context: IdRef, view: IdRef, window: IdRef, @@ -84,8 +83,6 @@ impl WindowDelegate { unsafe { 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 @@ -382,7 +379,6 @@ impl Window { } let ds = DelegateState { - is_closed: false, context: context.clone(), view: view.clone(), window: window.clone(), @@ -604,10 +600,6 @@ impl Window { } } - pub fn is_closed(&self) -> bool { - self.delegate.state.is_closed - } - pub fn set_title(&self, title: &str) { unsafe { let title = IdRef::new(NSString::alloc(nil).init_str(title)); diff --git a/src/api/emscripten/mod.rs b/src/api/emscripten/mod.rs index 04746b1e..79dda6b1 100644 --- a/src/api/emscripten/mod.rs +++ b/src/api/emscripten/mod.rs @@ -109,11 +109,6 @@ impl Window { }) } - pub fn is_closed(&self) -> bool { - use std::ptr; - unsafe { ffi::emscripten_is_webgl_context_lost(ptr::null()) != 0 } - } - pub fn set_title(&self, _title: &str) { } diff --git a/src/api/wayland/mod.rs b/src/api/wayland/mod.rs index d711110a..852172bd 100644 --- a/src/api/wayland/mod.rs +++ b/src/api/wayland/mod.rs @@ -185,11 +185,6 @@ impl Window { }) } - pub fn is_closed(&self) -> bool { - // TODO - false - } - pub fn set_title(&self, title: &str) { let ctitle = CString::new(title).unwrap(); self.shell_surface.set_title(&ctitle); diff --git a/src/api/win32/init.rs b/src/api/win32/init.rs index f46c3953..7cb5433b 100644 --- a/src/api/win32/init.rs +++ b/src/api/win32/init.rs @@ -257,7 +257,6 @@ unsafe fn init(title: Vec, builder: BuilderAttribs<'static>, window: real_window, context: context, events_receiver: events_receiver, - is_closed: AtomicBool::new(false), cursor_state: cursor_state, }) } diff --git a/src/api/win32/mod.rs b/src/api/win32/mod.rs index 9efdc93f..d21f16d8 100644 --- a/src/api/win32/mod.rs +++ b/src/api/win32/mod.rs @@ -48,9 +48,6 @@ pub struct Window { /// Receiver for the events dispatched by the window callback. events_receiver: Receiver, - /// True if a `Closed` event has been received. - is_closed: AtomicBool, - /// The current cursor state. cursor_state: Arc>, } @@ -98,12 +95,6 @@ impl Window { init::new_window(builder, sharing) } - /// See the docs in the crate root file. - pub fn is_closed(&self) -> bool { - use std::sync::atomic::Ordering::Relaxed; - self.is_closed.load(Relaxed) - } - /// See the docs in the crate root file. /// /// Calls SetWindowText on the HWND. @@ -367,17 +358,7 @@ impl<'a> Iterator for PollEventsIterator<'a> { type Item = Event; fn next(&mut self) -> Option { - use events::Event::Closed; - - match self.window.events_receiver.try_recv() { - Ok(Closed) => { - use std::sync::atomic::Ordering::Relaxed; - self.window.is_closed.store(true, Relaxed); - Some(Closed) - }, - Ok(ev) => Some(ev), - Err(_) => None - } + self.window.events_receiver.try_recv().ok() } } @@ -389,17 +370,7 @@ impl<'a> Iterator for WaitEventsIterator<'a> { type Item = Event; fn next(&mut self) -> Option { - use events::Event::Closed; - - match self.window.events_receiver.recv() { - Ok(Closed) => { - use std::sync::atomic::Ordering::Relaxed; - self.window.is_closed.store(true, Relaxed); - Some(Closed) - }, - Ok(ev) => Some(ev), - Err(_) => None - } + self.window.events_receiver.recv().ok() } } diff --git a/src/api/x11/window.rs b/src/api/x11/window.rs index c0c59178..dc24e38c 100644 --- a/src/api/x11/window.rs +++ b/src/api/x11/window.rs @@ -264,9 +264,10 @@ impl<'a> Iterator for WaitEventsIterator<'a> { type Item = Event; fn next(&mut self) -> Option { + use std::sync::atomic::Ordering::Relaxed; use std::mem; - while !self.window.is_closed() { + while !self.window.is_closed.load(Relaxed) { if let Some(ev) = self.window.pending_events.lock().unwrap().pop_front() { return Some(ev); } @@ -597,11 +598,6 @@ impl Window { Ok(window) } - pub fn is_closed(&self) -> bool { - use std::sync::atomic::Ordering::Relaxed; - self.is_closed.load(Relaxed) - } - pub fn set_title(&self, title: &str) { with_c_str(title, |title| unsafe { (self.x.display.xlib.XStoreName)(self.x.display.display, self.x.window, title); diff --git a/src/platform/linux/api_dispatch.rs b/src/platform/linux/api_dispatch.rs index d21cac37..b2cd741b 100644 --- a/src/platform/linux/api_dispatch.rs +++ b/src/platform/linux/api_dispatch.rs @@ -155,13 +155,6 @@ impl Window { } } - pub fn is_closed(&self) -> bool { - match self { - &Window::X(ref w) => w.is_closed(), - &Window::Wayland(ref w) => w.is_closed() - } - } - pub fn set_title(&self, title: &str) { match self { &Window::X(ref w) => w.set_title(title), diff --git a/src/window.rs b/src/window.rs index 9f8ed488..485ba58c 100644 --- a/src/window.rs +++ b/src/window.rs @@ -225,12 +225,6 @@ impl Window { builder.build() } - /// Returns true if the window has previously been closed by the user. - #[inline] - pub fn is_closed(&self) -> bool { - self.window.is_closed() - } - /// Modifies the title of the window. /// /// This is a no-op if the window has already been closed.