From d5effc35ae99ddeefc8b0f0a2c7047778055539b Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 8 Mar 2019 12:45:10 -0800 Subject: [PATCH] Invert control flow. There's an issue whereby if keys are held down in the 3D mode it doesn't keep redrawing. This will be fixed in a followup. --- demo/common/src/lib.rs | 44 +++++++++++++------------------------- demo/common/src/window.rs | 2 -- demo/native/src/main.rs | 45 ++++++++++++++++++++++----------------- 3 files changed, 41 insertions(+), 50 deletions(-) diff --git a/demo/common/src/lib.rs b/demo/common/src/lib.rs index e0f28c38..31fc70f4 100644 --- a/demo/common/src/lib.rs +++ b/demo/common/src/lib.rs @@ -79,7 +79,8 @@ mod device; mod ui; pub struct DemoApp where W: Window { - window: W, + pub window: W, + pub should_exit: bool, scale_factor: f32, @@ -88,9 +89,7 @@ pub struct DemoApp where W: Window { camera: Camera, frame_counter: u32, - events: Vec, pending_screenshot_path: Option, - exit: bool, mouselook_enabled: bool, dirty: bool, expire_message_event_id: u32, @@ -147,6 +146,7 @@ impl DemoApp where W: Window { DemoApp { window, + should_exit: false, scale_factor: drawable_size.x() as f32 / window_size.x() as f32, @@ -156,8 +156,6 @@ impl DemoApp where W: Window { camera, frame_counter: 0, pending_screenshot_path: None, - events: vec![], - exit: false, mouselook_enabled: false, dirty: true, expire_message_event_id, @@ -173,19 +171,16 @@ impl DemoApp where W: Window { } } - pub fn run(&mut self) { - while !self.exit { - // Update the scene. - self.build_scene(); + pub fn run_once(&mut self, events: Vec) { + // Update the scene. + self.build_scene(); - // Handle events. - // FIXME(pcwalton): This can cause us to miss UI events if things get backed up... - let ui_event = self.handle_events(); + // Handle events. + let ui_event = self.handle_events(events); - // Draw the scene. - let render_msg = self.scene_thread_proxy.receiver.recv().unwrap(); - self.draw_scene(render_msg, ui_event); - } + // Draw the scene. + let render_msg = self.scene_thread_proxy.receiver.recv().unwrap(); + self.draw_scene(render_msg, ui_event); } fn build_scene(&mut self) { @@ -219,24 +214,15 @@ impl DemoApp where W: Window { } } - fn handle_events(&mut self) -> UIEvent { + fn handle_events(&mut self, events: Vec) -> UIEvent { let mut ui_event = UIEvent::None; + self.dirty = false; - if !self.dirty { - self.events.push(self.window.get_event()); - } else { - self.dirty = false; - } - - while let Some(event) = self.window.try_get_event() { - self.events.push(event); - } - - for event in self.events.drain(..) { + for event in events { match event { Event::Quit { .. } | Event::KeyDown(Keycode::Escape) => { - self.exit = true; + self.should_exit = true; self.dirty = true; } Event::WindowResized => { diff --git a/demo/common/src/window.rs b/demo/common/src/window.rs index eb056728..fb5a5e70 100644 --- a/demo/common/src/window.rs +++ b/demo/common/src/window.rs @@ -17,8 +17,6 @@ pub trait Window { fn size(&self) -> Point2DI32; fn drawable_size(&self) -> Point2DI32; fn mouse_position(&self) -> Point2DI32; - fn get_event(&mut self) -> Event; - fn try_get_event(&mut self) -> Option; fn present(&self); fn create_user_event_id(&self) -> u32; fn push_user_event(message_type: u32, message_data: u32); diff --git a/demo/native/src/main.rs b/demo/native/src/main.rs index 32477a9b..8f824c94 100644 --- a/demo/native/src/main.rs +++ b/demo/native/src/main.rs @@ -21,7 +21,14 @@ use sdl2_sys::{SDL_Event, SDL_UserEvent}; use std::ptr; fn main() { - DemoApp::::new().run(); + let mut app = DemoApp::::new(); + while !app.should_exit { + let mut events = vec![app.window.get_event()]; + while let Some(event) = app.window.try_get_event() { + events.push(event); + } + app.run_once(events); + } } thread_local! { @@ -81,24 +88,6 @@ impl Window for WindowImpl { Point2DI32::new(mouse_state.x(), mouse_state.y()) } - fn get_event(&mut self) -> Event { - loop { - let sdl_event = self.event_pump.wait_event(); - if let Some(event) = self.convert_sdl_event(sdl_event) { - return event; - } - } - } - - fn try_get_event(&mut self) -> Option { - loop { - let sdl_event = self.event_pump.poll_event()?; - if let Some(event) = self.convert_sdl_event(sdl_event) { - return Some(event); - } - } - } - fn present(&self) { self.window.gl_swap_window(); } @@ -123,6 +112,24 @@ impl Window for WindowImpl { } impl WindowImpl { + fn get_event(&mut self) -> Event { + loop { + let sdl_event = self.event_pump.wait_event(); + if let Some(event) = self.convert_sdl_event(sdl_event) { + return event; + } + } + } + + fn try_get_event(&mut self) -> Option { + loop { + let sdl_event = self.event_pump.poll_event()?; + if let Some(event) = self.convert_sdl_event(sdl_event) { + return Some(event); + } + } + } + fn convert_sdl_event(&self, sdl_event: SDLEvent) -> Option { match sdl_event { SDLEvent::User { type_, code, .. } => {