diff options
Diffstat (limited to 'src/desktop/window.rs')
-rw-r--r-- | src/desktop/window.rs | 117 |
1 files changed, 63 insertions, 54 deletions
diff --git a/src/desktop/window.rs b/src/desktop/window.rs index 93c5aba..0d5bd8c 100644 --- a/src/desktop/window.rs +++ b/src/desktop/window.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use std::sync::{Arc, Mutex}; use std::sync::mpsc::{channel, Receiver, Sender}; +use std::sync::{Arc, Mutex}; use std::thread; use crate::io::{Window, WindowSignal}; @@ -12,7 +12,7 @@ use winit::event::{Event, WindowEvent}; use winit::event_loop::EventLoopBuilder; use winit::keyboard::{KeyCode, PhysicalKey}; use winit::platform::wayland::EventLoopBuilderExtWayland; -use winit::window::{WindowBuilder}; +use winit::window::WindowBuilder; use winit_input_helper::WinitInputHelper; const WIDTH: u32 = 160; @@ -37,7 +37,10 @@ impl DesktopWindow { let key_eventloop = keys.clone(); thread::spawn(move || { let keys = key_eventloop; - let event_loop = EventLoopBuilder::new().with_any_thread(true).build().unwrap(); + let event_loop = EventLoopBuilder::new() + .with_any_thread(true) + .build() + .unwrap(); let mut input = WinitInputHelper::new(); let window = Arc::new({ let size = LogicalSize::new((WIDTH * 4) as f64, (HEIGHT * 4) as f64); @@ -57,68 +60,71 @@ impl DesktopWindow { }; let mut fb = Box::new([0; 160 * 144]); event_loop - .run(|event, elwt| { - if let Event::WindowEvent { - event: WindowEvent::RedrawRequested, - .. - } = event - { - loop { - if let Ok(new_fb) = fb_recv.try_recv() { - fb = new_fb; - } else { - break; - } - } - draw(pixels.frame_mut(), &fb); - if let Err(err) = pixels.render() { - elog(LogLevel::Error, format!("Error during render: {}", err)); - return; - } - } - - if let Event::WindowEvent { - window_id: _, - event: - WindowEvent::KeyboardInput { - device_id: _, - event: ref keyboard_event, - is_synthetic: _, - }, - } = event - { - if let Ok(mut keys) = keys.lock() { - if let PhysicalKey::Code(keycode) = keyboard_event.physical_key { - if keyboard_event.state.is_pressed() { - (*keys).insert(keycode); + .run(|event, elwt| { + if let Event::WindowEvent { + event: WindowEvent::RedrawRequested, + .. + } = event + { + loop { + if let Ok(new_fb) = fb_recv.try_recv() { + fb = new_fb; } else { - (*keys).remove(&keycode); + break; } } + draw(pixels.frame_mut(), &fb); + if let Err(err) = pixels.render() { + elog(LogLevel::Error, format!("Error during render: {}", err)); + return; + } } - } - if input.update(&event) { - if input.close_requested() { - elwt.exit(); - if let Err(err) = signal_send.send(WindowSignal::Exit) { - elog(LogLevel::Error, format!("window signal send failed with error {}", err)); + if let Event::WindowEvent { + window_id: _, + event: + WindowEvent::KeyboardInput { + device_id: _, + event: ref keyboard_event, + is_synthetic: _, + }, + } = event + { + if let Ok(mut keys) = keys.lock() { + if let PhysicalKey::Code(keycode) = keyboard_event.physical_key { + if keyboard_event.state.is_pressed() { + (*keys).insert(keycode); + } else { + (*keys).remove(&keycode); + } + } } - return; } - if let Some(size) = input.window_resized() { - if let Err(err) = pixels.resize_surface(size.width, size.height) { - elog(LogLevel::Error, format!("Error during resize: {}", err)); + if input.update(&event) { + if input.close_requested() { + elwt.exit(); + if let Err(err) = signal_send.send(WindowSignal::Exit) { + elog( + LogLevel::Error, + format!("window signal send failed with error {}", err), + ); + } return; } - } - window.request_redraw(); - } - }).unwrap(); - }); + if let Some(size) = input.window_resized() { + if let Err(err) = pixels.resize_surface(size.width, size.height) { + elog(LogLevel::Error, format!("Error during resize: {}", err)); + return; + } + } + window.request_redraw(); + } + }) + .unwrap(); + }); Ok(Self { fb_send, @@ -131,7 +137,10 @@ impl DesktopWindow { impl Window for DesktopWindow { fn update(&mut self, fb: Box<[u32; 160 * 144]>) -> Option<WindowSignal> { if let Err(err) = self.fb_send.send(fb) { - elog(LogLevel::Error, format!("Framebuffer channel send failed with error: {}", err)); + elog( + LogLevel::Error, + format!("Framebuffer channel send failed with error: {}", err), + ); } if let Ok(signal) = self.signal_recv.try_recv() { |