Creating window when event loop is not running generally doesn't work, since a bunch of events and sync OS requests can't be processed. This is also an issue on e.g. Android, since window can't be created outside event loop easily. Thus deprecate the window creation when event loop is not running, as well as other resource creation to running event loop. Given that all the examples use the bad pattern of creating the window when event loop is not running and also most example existence is questionable, since they show single thing and the majority of their code is window/event loop initialization, they wore merged into a single example 'window.rs' example that showcases very simple application using winit. Fixes #3399.
92 lines
3.4 KiB
Rust
92 lines
3.4 KiB
Rust
#![allow(clippy::single_match)]
|
|
|
|
// Limit this example to only compatible platforms.
|
|
#[cfg(any(windows_platform, macos_platform, x11_platform, wayland_platform,))]
|
|
fn main() -> Result<(), impl std::error::Error> {
|
|
use std::time::Duration;
|
|
|
|
use simple_logger::SimpleLogger;
|
|
|
|
use winit::{
|
|
error::EventLoopError,
|
|
event::{Event, WindowEvent},
|
|
event_loop::EventLoop,
|
|
platform::run_on_demand::EventLoopExtRunOnDemand,
|
|
window::{Window, WindowId},
|
|
};
|
|
|
|
#[path = "util/fill.rs"]
|
|
mod fill;
|
|
|
|
#[derive(Default)]
|
|
struct App {
|
|
window_id: Option<WindowId>,
|
|
window: Option<Window>,
|
|
}
|
|
|
|
SimpleLogger::new().init().unwrap();
|
|
let mut event_loop = EventLoop::new().unwrap();
|
|
|
|
fn run_app(event_loop: &mut EventLoop<()>, idx: usize) -> Result<(), EventLoopError> {
|
|
let mut app = App::default();
|
|
|
|
event_loop.run_on_demand(move |event, event_loop| {
|
|
println!("Run {idx}: {:?}", event);
|
|
|
|
if let Some(window) = &app.window {
|
|
match event {
|
|
Event::WindowEvent {
|
|
event: WindowEvent::CloseRequested,
|
|
window_id,
|
|
} if window.id() == window_id => {
|
|
println!("--------------------------------------------------------- Window {idx} CloseRequested");
|
|
fill::cleanup_window(window);
|
|
app.window = None;
|
|
}
|
|
Event::AboutToWait => window.request_redraw(),
|
|
Event::WindowEvent {
|
|
event: WindowEvent::RedrawRequested,
|
|
..
|
|
} => {
|
|
fill::fill_window(window);
|
|
}
|
|
_ => (),
|
|
}
|
|
} else if let Some(id) = app.window_id {
|
|
match event {
|
|
Event::WindowEvent {
|
|
event: WindowEvent::Destroyed,
|
|
window_id,
|
|
} if id == window_id => {
|
|
println!("--------------------------------------------------------- Window {idx} Destroyed");
|
|
app.window_id = None;
|
|
event_loop.exit();
|
|
}
|
|
_ => (),
|
|
}
|
|
} else if let Event::Resumed = event {
|
|
let window_attributes = Window::default_attributes()
|
|
.with_title("Fantastic window number one!")
|
|
.with_inner_size(winit::dpi::LogicalSize::new(128.0, 128.0));
|
|
let window = event_loop.create_window(window_attributes).unwrap();
|
|
app.window_id = Some(window.id());
|
|
app.window = Some(window);
|
|
}
|
|
})
|
|
}
|
|
|
|
run_app(&mut event_loop, 1)?;
|
|
|
|
println!("--------------------------------------------------------- Finished first loop");
|
|
println!("--------------------------------------------------------- Waiting 5 seconds");
|
|
std::thread::sleep(Duration::from_secs(5));
|
|
|
|
let ret = run_app(&mut event_loop, 2);
|
|
println!("--------------------------------------------------------- Finished second loop");
|
|
ret
|
|
}
|
|
|
|
#[cfg(not(any(windows_platform, macos_platform, x11_platform, wayland_platform,)))]
|
|
fn main() {
|
|
println!("This example is not supported on this platform");
|
|
}
|