Fix crash on windows when window is minimized

This commit is contained in:
Simon Gellis 2024-11-10 15:03:07 -05:00
parent 5cb36d0bcc
commit 6dc3697baf
3 changed files with 30 additions and 6 deletions

View File

@ -58,6 +58,7 @@ pub struct WindowState {
pub surface_desc: wgpu::SurfaceConfiguration, pub surface_desc: wgpu::SurfaceConfiguration,
pub surface: wgpu::Surface<'static>, pub surface: wgpu::Surface<'static>,
pub hidpi_factor: f64, pub hidpi_factor: f64,
pub minimized: bool,
} }
impl WindowState { impl WindowState {
@ -105,6 +106,7 @@ impl WindowState {
surface_desc, surface_desc,
surface, surface,
hidpi_factor, hidpi_factor,
minimized: false,
} }
} }
@ -114,9 +116,14 @@ impl WindowState {
} }
pub fn handle_resize(&mut self, size: &PhysicalSize<u32>) { pub fn handle_resize(&mut self, size: &PhysicalSize<u32>) {
self.surface_desc.width = size.width; if size.width > 0 && size.height > 0 {
self.surface_desc.height = size.height; self.minimized = false;
self.surface.configure(&self.device, &self.surface_desc); self.surface_desc.width = size.width;
self.surface_desc.height = size.height;
self.surface.configure(&self.device, &self.surface_desc);
} else {
self.minimized = true;
}
} }
} }

View File

@ -30,6 +30,7 @@ pub struct GameWindow {
client: EmulatorClient, client: EmulatorClient,
input_mapper: Arc<RwLock<InputMapper>>, input_mapper: Arc<RwLock<InputMapper>>,
proxy: EventLoopProxy<UserEvent>, proxy: EventLoopProxy<UserEvent>,
paused_due_to_minimize: bool,
} }
impl GameWindow { impl GameWindow {
@ -165,6 +166,7 @@ impl GameWindow {
client, client,
input_mapper, input_mapper,
proxy, proxy,
paused_due_to_minimize: false,
} }
} }
@ -181,7 +183,9 @@ impl GameWindow {
let frame = match window.surface.get_current_texture() { let frame = match window.surface.get_current_texture() {
Ok(frame) => frame, Ok(frame) => frame,
Err(e) => { Err(e) => {
eprintln!("dropped frame: {e:?}"); if !self.window.minimized {
eprintln!("dropped frame: {e:?}");
}
return; return;
} }
}; };
@ -325,7 +329,18 @@ impl AppWindow for GameWindow {
fn handle_event(&mut self, event_loop: &ActiveEventLoop, event: &Event<UserEvent>) { fn handle_event(&mut self, event_loop: &ActiveEventLoop, event: &Event<UserEvent>) {
match event { match event {
Event::WindowEvent { event, .. } => match event { Event::WindowEvent { event, .. } => match event {
WindowEvent::Resized(size) => self.window.handle_resize(size), WindowEvent::Resized(size) => {
self.window.handle_resize(size);
if self.window.minimized {
if self.client.is_running() {
self.client.send_command(EmulatorCommand::Pause);
self.paused_due_to_minimize = true;
}
} else if self.paused_due_to_minimize {
self.client.send_command(EmulatorCommand::Resume);
self.paused_due_to_minimize = false;
}
}
WindowEvent::CloseRequested => event_loop.exit(), WindowEvent::CloseRequested => event_loop.exit(),
WindowEvent::RedrawRequested => self.draw(event_loop), WindowEvent::RedrawRequested => self.draw(event_loop),
_ => (), _ => (),

View File

@ -73,7 +73,9 @@ impl InputWindow {
let frame = match window.surface.get_current_texture() { let frame = match window.surface.get_current_texture() {
Ok(frame) => frame, Ok(frame) => frame,
Err(e) => { Err(e) => {
eprintln!("dropped frame: {e:?}"); if !self.window.minimized {
eprintln!("dropped frame: {e:?}");
}
return; return;
} }
}; };