use std::time::Duration;
use async_winit::event_loop::{EventLoop, EventLoopBuilder};
use async_winit::window::Window;
use async_winit::{DefaultThreadSafety, Timer};
use futures_lite::prelude::*;
use softbuffer::GraphicsContext;
fn main() {
main2(EventLoopBuilder::new().build())
}
fn main2(evl: EventLoop) {
let target = evl.window_target().clone();
evl.block_on(async move {
target.resumed().await;
let window = Window::<DefaultThreadSafety>::new().await.unwrap();
let print_resize = {
window.resized().wait().for_each(|new_size| {
println!("Window resized to {:?}", new_size);
})
};
let print_position = {
Timer::<DefaultThreadSafety>::interval(Duration::from_secs(1))
.then(|_| window.inner_position())
.for_each(|posn| {
println!("Window position: {:?}", posn);
})
};
let draw = {
let window = window.clone();
let mut sb = None;
let mut buf = vec![];
async move {
let mut waiter = window.redraw_requested().wait();
loop {
let _guard = waiter.hold().await;
let inner_size = window.inner_size().await;
let graphics = match &mut sb {
Some(graphics) => graphics,
sb @ None => {
let graphics =
unsafe { GraphicsContext::new(&window, &window) }.unwrap();
sb.insert(graphics)
}
};
let pixel = 0xAA11AA11;
buf.resize(
inner_size.width as usize * inner_size.height as usize,
pixel,
);
graphics.set_buffer(&buf, inner_size.width as u16, inner_size.height as u16);
}
}
};
async { window.close_requested().wait().await }
.or(print_resize)
.or(print_position)
.or(draw)
.await;
target.exit().await
});
}