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.
This commit is contained in:
Patrick Walton 2019-03-08 12:45:10 -08:00
parent d1728dfe6d
commit d5effc35ae
3 changed files with 41 additions and 50 deletions

View File

@ -79,7 +79,8 @@ mod device;
mod ui;
pub struct DemoApp<W> where W: Window {
window: W,
pub window: W,
pub should_exit: bool,
scale_factor: f32,
@ -88,9 +89,7 @@ pub struct DemoApp<W> where W: Window {
camera: Camera,
frame_counter: u32,
events: Vec<Event>,
pending_screenshot_path: Option<PathBuf>,
exit: bool,
mouselook_enabled: bool,
dirty: bool,
expire_message_event_id: u32,
@ -147,6 +146,7 @@ impl<W> DemoApp<W> 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<W> DemoApp<W> 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,20 +171,17 @@ impl<W> DemoApp<W> where W: Window {
}
}
pub fn run(&mut self) {
while !self.exit {
pub fn run_once(&mut self, events: Vec<Event>) {
// 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();
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);
}
}
fn build_scene(&mut self) {
let drawable_size = self.window.drawable_size();
@ -219,24 +214,15 @@ impl<W> DemoApp<W> where W: Window {
}
}
fn handle_events(&mut self) -> UIEvent {
fn handle_events(&mut self, events: Vec<Event>) -> UIEvent {
let mut ui_event = UIEvent::None;
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 => {

View File

@ -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<Event>;
fn present(&self);
fn create_user_event_id(&self) -> u32;
fn push_user_event(message_type: u32, message_data: u32);

View File

@ -21,7 +21,14 @@ use sdl2_sys::{SDL_Event, SDL_UserEvent};
use std::ptr;
fn main() {
DemoApp::<WindowImpl>::new().run();
let mut app = DemoApp::<WindowImpl>::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<Event> {
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<Event> {
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<Event> {
match sdl_event {
SDLEvent::User { type_, code, .. } => {