minpixwin/
lib.rs

1use pixels::{Error, Pixels, SurfaceTexture};
2use winit::dpi::LogicalSize;
3use winit::event::{Event, VirtualKeyCode};
4use winit::event_loop::{ControlFlow, EventLoop};
5use winit::window::WindowBuilder;
6use winit::platform::run_return::EventLoopExtRunReturn;
7use winit_input_helper::WinitInputHelper;
8
9pub struct Screen {
10    pixels: Pixels,
11    event_loop: EventLoop<()>,
12    w: usize,
13    h: usize,
14}
15
16impl Screen {
17    pub fn new<F>(w: usize, h: usize, mut draw: F)
18        where
19            F: 'static + FnMut(&mut [u8])
20    {
21        let event_loop = EventLoop::new();
22        let mut input = WinitInputHelper::new();
23        let window = {
24            let size = LogicalSize::new(w as f64, h as f64);
25            WindowBuilder::new()
26                .with_title("Hello Pixels")
27                .with_inner_size(size)
28                .with_min_inner_size(size)
29                .with_resizable(false)
30                .build(&event_loop)
31                .unwrap()
32        };
33
34        let mut pixels = {
35            let window_size = window.inner_size();
36            let surface_texture = SurfaceTexture::new(window_size.width, window_size.height, &window);
37            Pixels::new(w as u32, h as u32, surface_texture).unwrap()
38        };
39
40        event_loop.run(move |event, _, control_flow| {
41            // Draw the current frame
42            if let Event::RedrawRequested(_) = event {
43                draw(pixels.get_frame());
44                if pixels
45                    .render()
46                    .map_err(|e| eprintln!("pixels.render() failed: {:?}", e))
47                    .is_err()
48                {
49                    *control_flow = ControlFlow::Exit;
50                    return;
51                }
52            }
53
54            // Handle input events
55            if input.update(&event) {
56                // Close events
57                if input.key_pressed(VirtualKeyCode::Escape) || input.quit() {
58                    *control_flow = ControlFlow::Exit;
59                    return;
60                }
61
62                // Resize the window
63                if let Some(size) = input.window_resized() {
64                    pixels.resize_surface(size.width, size.height);
65                }
66
67                window.request_redraw();
68            }
69        });
70    }
71
72}