diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54e62843f5..39ce525167 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -119,3 +119,17 @@ jobs: !contains(matrix.platform.target, 'redox') && matrix.rust_version != '1.60.0' run: cargo $CMD test --verbose --target ${{ matrix.platform.target }} $OPTIONS --features serde,$FEATURES + + # derived from https://github.com/psychon/x11rb/blob/15153e514a4e3e4c116279f76ab1c3635abc05e5/.github/workflows/CI.yml#L141-L159 + - name: Run examples + shell: bash + if: > + contains(matrix.platform.target, 'linux') && + contains(matrix.platform.features, 'x11') && + (contains(matrix.rust_version, 'stable') || contains(matrix.rust_version, 'nightly')) + run: | + for example in examples/*.rs; do + example=${example/examples\//} + example=${example/.rs/} + WINIT_EXAMPLE_TIMEOUT=1 xvfb-run -a cargo run --example "$example" || exit 1 + done diff --git a/examples/child_window.rs b/examples/child_window.rs index b1b8f95e82..8cc753b91f 100644 --- a/examples/child_window.rs +++ b/examples/child_window.rs @@ -1,3 +1,6 @@ +#[cfg(any(x11_platform, macos_platform, windows_platform))] +include!("it_util/timeout.rs"); + #[cfg(any(x11_platform, macos_platform, windows_platform))] fn main() { use std::collections::HashMap; @@ -39,6 +42,7 @@ fn main() { .with_inner_size(LogicalSize::new(640.0f32, 480.0f32)) .build(&event_loop) .unwrap(); + util::start_timeout_thread(&event_loop, ()); println!("parent window: {parent_window:?})"); @@ -70,6 +74,9 @@ fn main() { } _ => (), } + } else if let Event::UserEvent(()) = event { + windows.clear(); + *control_flow = ControlFlow::Exit; } }) } diff --git a/examples/control_flow.rs b/examples/control_flow.rs index bade79d279..aa3d9e343d 100644 --- a/examples/control_flow.rs +++ b/examples/control_flow.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use std::{thread, time}; use simple_logger::SimpleLogger; @@ -34,6 +36,8 @@ fn main() { .build(&event_loop) .unwrap(); + util::start_timeout_thread(&event_loop, ()); + let mut mode = Mode::Wait; let mut request_redraw = false; let mut wait_cancelled = false; @@ -108,6 +112,9 @@ fn main() { } }; } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/cursor.rs b/examples/cursor.rs index fdef7ef971..80377776c9 100644 --- a/examples/cursor.rs +++ b/examples/cursor.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{ElementState, Event, KeyboardInput, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new().build(&event_loop).unwrap(); window.set_title("A fantastic window!"); @@ -46,6 +49,9 @@ fn main() { } => { control_flow.set_exit(); } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/cursor_grab.rs b/examples/cursor_grab.rs index 79253e106a..14b2e4b6df 100644 --- a/examples/cursor_grab.rs +++ b/examples/cursor_grab.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{DeviceEvent, ElementState, Event, KeyboardInput, ModifiersState, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("Super Cursor Grab'n'Hide Simulator 9000") @@ -64,6 +67,7 @@ fn main() { }, _ => (), }, + Event::UserEvent(()) => control_flow.set_exit(), _ => (), } }); diff --git a/examples/custom_events.rs b/examples/custom_events.rs index b39353155a..dcde6236e7 100644 --- a/examples/custom_events.rs +++ b/examples/custom_events.rs @@ -1,5 +1,8 @@ #![allow(clippy::single_match)] +#[cfg(not(wasm_platform))] +include!("it_util/timeout.rs"); + #[cfg(not(wasm_platform))] fn main() { use simple_logger::SimpleLogger; @@ -12,10 +15,12 @@ fn main() { #[derive(Debug, Clone, Copy)] enum CustomEvent { Timer, + Timeout, } SimpleLogger::new().init().unwrap(); let event_loop = EventLoopBuilder::::with_user_event().build(); + util::start_timeout_thread(&event_loop, CustomEvent::Timeout); let _window = WindowBuilder::new() .with_title("A fantastic window!") @@ -39,7 +44,11 @@ fn main() { control_flow.set_wait(); match event { - Event::UserEvent(event) => println!("user event: {event:?}"), + Event::UserEvent(CustomEvent::Timer) => println!("user event: {event:?}"), + Event::UserEvent(CustomEvent::Timeout) => { + println!("user event: {event:?}"); + control_flow.set_exit(); + } Event::WindowEvent { event: WindowEvent::CloseRequested, .. diff --git a/examples/drag_window.rs b/examples/drag_window.rs index 813e9b00c9..9074b27ef3 100644 --- a/examples/drag_window.rs +++ b/examples/drag_window.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{ @@ -12,6 +14,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window_1 = WindowBuilder::new().build(&event_loop).unwrap(); let window_2 = WindowBuilder::new().build(&event_loop).unwrap(); @@ -59,6 +62,7 @@ fn main() { } _ => (), }, + Event::UserEvent(()) => control_flow.set_exit(), _ => (), }); } diff --git a/examples/fullscreen.rs b/examples/fullscreen.rs index 6f4d98e2da..f4ec92140d 100644 --- a/examples/fullscreen.rs +++ b/examples/fullscreen.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::event::{ElementState, Event, KeyboardInput, VirtualKeyCode, WindowEvent}; use winit::event_loop::EventLoop; @@ -8,6 +10,7 @@ use winit::window::{Fullscreen, WindowBuilder}; fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let mut decorations = true; let mut minimized = false; @@ -107,6 +110,7 @@ fn main() { }, _ => (), }, + Event::UserEvent(()) => control_flow.set_exit(), _ => {} } }); diff --git a/examples/handling_close.rs b/examples/handling_close.rs index 1fe4ad3708..b34d798130 100644 --- a/examples/handling_close.rs +++ b/examples/handling_close.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{Event, KeyboardInput, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let _window = WindowBuilder::new() .with_title("Your faithful window") @@ -80,6 +83,7 @@ fn main() { _ => (), } } + Event::UserEvent(()) => control_flow.set_exit(), _ => (), } }); diff --git a/examples/ime.rs b/examples/ime.rs index 59f43d4a33..e0ae6625b7 100644 --- a/examples/ime.rs +++ b/examples/ime.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use log::LevelFilter; use simple_logger::SimpleLogger; use winit::{ @@ -21,6 +23,7 @@ fn main() { println!("Press F3 to cycle through IME purposes."); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_inner_size(winit::dpi::LogicalSize::new(256f64, 128f64)) @@ -106,6 +109,9 @@ fn main() { println!("\nIME purpose: {ime_purpose:?}\n"); } } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/it_util/timeout.rs b/examples/it_util/timeout.rs new file mode 100644 index 0000000000..1837e686b5 --- /dev/null +++ b/examples/it_util/timeout.rs @@ -0,0 +1,42 @@ +// Spawns a timeout thread that will close the event loop after one second. + +#[cfg(not(wasm_platform))] +mod util { + use std::env; + use std::thread; + use winit::event_loop::EventLoop; + + pub(super) fn start_timeout_thread(event_loop: &EventLoop, msg_to_send: T) { + // If the WINIT_EXAMPLE_TIMEOUT environment variable is set, get the number of seconds + // to wait before closing the window. + let secs = match env::var("WINIT_EXAMPLE_TIMEOUT") + .ok() + .and_then(|s| s.parse::().ok()) + { + Some(secs) => secs, + None => return, + }; + + // Spawn a thread that will close the window after `secs` seconds. + thread::Builder::new() + .name("winit example timeout".to_string()) + .spawn({ + let proxy = event_loop.create_proxy(); + move || { + thread::sleep(std::time::Duration::from_secs(secs)); + println!("Closing window due to timeout"); + proxy.send_event(msg_to_send).unwrap_or_else(|_| panic!("Failed to send event to event loop")); + } + }) + .expect("failed to spawn timeout thread"); + } +} + +#[cfg(wasm_platform)] +mod util { + use winit::event_loop::EventLoop; + + pub(super) fn start_timeout_thread(_event_loop: &EventLoop, _msg_to_send: T) { + // Not supported on web. + } +} diff --git a/examples/mouse_wheel.rs b/examples/mouse_wheel.rs index 239f5a4ec1..192021178e 100644 --- a/examples/mouse_wheel.rs +++ b/examples/mouse_wheel.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{Event, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("Mouse Wheel events") @@ -56,6 +59,9 @@ In other words, the deltas indicate the direction in which to move the content ( }, _ => (), }, + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/multithreaded.rs b/examples/multithreaded.rs index 7e03329d83..fd0e18b905 100644 --- a/examples/multithreaded.rs +++ b/examples/multithreaded.rs @@ -1,5 +1,8 @@ #![allow(clippy::single_match)] +#[cfg(not(wasm_platform))] +include!("it_util/timeout.rs"); + #[cfg(not(wasm_platform))] fn main() { use std::{collections::HashMap, sync::mpsc, thread, time::Duration}; @@ -17,6 +20,8 @@ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); + let mut window_senders = HashMap::with_capacity(WINDOW_COUNT); for _ in 0..WINDOW_COUNT { let window = WindowBuilder::new() @@ -188,6 +193,10 @@ fn main() { } } }, + Event::UserEvent(()) => { + window_senders.clear(); + control_flow.set_exit(); + } _ => {} } }) diff --git a/examples/multiwindow.rs b/examples/multiwindow.rs index 3409af5a65..b460aea77c 100644 --- a/examples/multiwindow.rs +++ b/examples/multiwindow.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use std::collections::HashMap; use simple_logger::SimpleLogger; @@ -12,6 +14,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let mut windows = HashMap::new(); for _ in 0..3 { @@ -55,6 +58,9 @@ fn main() { _ => (), } } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }) diff --git a/examples/request_redraw.rs b/examples/request_redraw.rs index aa53050d02..44f7c4145d 100644 --- a/examples/request_redraw.rs +++ b/examples/request_redraw.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{ElementState, Event, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -35,6 +38,9 @@ fn main() { Event::RedrawRequested(_) => { println!("\nredrawing!\n"); } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/request_redraw_threaded.rs b/examples/request_redraw_threaded.rs index d92389c556..7ec537c25a 100644 --- a/examples/request_redraw_threaded.rs +++ b/examples/request_redraw_threaded.rs @@ -1,5 +1,8 @@ #![allow(clippy::single_match)] +#[cfg(not(wasm_platform))] +include!("it_util/timeout.rs"); + #[cfg(not(wasm_platform))] fn main() { use std::{thread, time}; @@ -13,6 +16,7 @@ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -37,6 +41,9 @@ fn main() { Event::RedrawRequested(_) => { println!("\nredrawing!\n"); } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/resizable.rs b/examples/resizable.rs index 8f16172fd7..d4f4f5f17a 100644 --- a/examples/resizable.rs +++ b/examples/resizable.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ dpi::LogicalSize, @@ -11,6 +13,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let mut resizable = false; @@ -44,6 +47,9 @@ fn main() { } _ => (), }, + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), }; }); diff --git a/examples/theme.rs b/examples/theme.rs index ac8854e2e3..c551b0ae4f 100644 --- a/examples/theme.rs +++ b/examples/theme.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{ElementState, Event, KeyboardInput, VirtualKeyCode, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -65,6 +68,7 @@ fn main() { } _ => (), }, + Event::UserEvent(()) => control_flow.set_exit(), _ => (), } }); diff --git a/examples/timer.rs b/examples/timer.rs index 4d609bef23..36c92a9920 100644 --- a/examples/timer.rs +++ b/examples/timer.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use instant::Instant; use std::time::Duration; @@ -13,6 +15,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let _window = WindowBuilder::new() .with_title("A fantastic window!") @@ -35,7 +38,8 @@ fn main() { Event::WindowEvent { event: WindowEvent::CloseRequested, .. - } => control_flow.set_exit(), + } + | Event::UserEvent(()) => control_flow.set_exit(), _ => (), } }); diff --git a/examples/touchpad_gestures.rs b/examples/touchpad_gestures.rs index 1a749a19a6..76ca4e1130 100644 --- a/examples/touchpad_gestures.rs +++ b/examples/touchpad_gestures.rs @@ -5,9 +5,12 @@ use winit::{ window::WindowBuilder, }; +include!("it_util/timeout.rs"); + fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let _window = WindowBuilder::new() .with_title("Touchpad gestures") @@ -41,6 +44,8 @@ fn main() { } _ => (), } + } else if let Event::UserEvent(()) = event { + control_flow.set_exit(); } }); } diff --git a/examples/transparent.rs b/examples/transparent.rs index 88c69d1b30..a82fc69bc8 100644 --- a/examples/transparent.rs +++ b/examples/transparent.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{Event, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_decorations(false) @@ -27,7 +30,8 @@ fn main() { Event::WindowEvent { event: WindowEvent::CloseRequested, .. - } => control_flow.set_exit(), + } + | Event::UserEvent(()) => control_flow.set_exit(), _ => (), } }); diff --git a/examples/video_modes.rs b/examples/video_modes.rs index 3b262c7b60..f948152d4b 100644 --- a/examples/video_modes.rs +++ b/examples/video_modes.rs @@ -6,6 +6,7 @@ use winit::event_loop::EventLoop; fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + let monitor = match event_loop.primary_monitor() { Some(monitor) => monitor, None => { diff --git a/examples/web.rs b/examples/web.rs index 5be8af29de..5857ae5962 100644 --- a/examples/web.rs +++ b/examples/web.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use winit::{ event::{Event, WindowEvent}, event_loop::EventLoop, @@ -8,6 +10,7 @@ use winit::{ pub fn main() { let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -31,6 +34,9 @@ pub fn main() { Event::MainEventsCleared => { window.request_redraw(); } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/window.rs b/examples/window.rs index e54a2f661c..2ed76525a6 100644 --- a/examples/window.rs +++ b/examples/window.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{Event, WindowEvent}, @@ -10,6 +12,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -29,6 +32,9 @@ fn main() { Event::MainEventsCleared => { window.request_redraw(); } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/window_buttons.rs b/examples/window_buttons.rs index 5d41144dbd..46922e9969 100644 --- a/examples/window_buttons.rs +++ b/examples/window_buttons.rs @@ -2,6 +2,8 @@ // This example is used by developers to test various window functions. +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ dpi::LogicalSize, @@ -13,6 +15,7 @@ use winit::{ fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -62,6 +65,9 @@ fn main() { event: WindowEvent::CloseRequested, window_id, } if window_id == window.id() => control_flow.set_exit(), + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/window_debug.rs b/examples/window_debug.rs index 01077a8b6e..26323c3fdc 100644 --- a/examples/window_debug.rs +++ b/examples/window_debug.rs @@ -10,9 +10,12 @@ use winit::{ window::{Fullscreen, WindowBuilder}, }; +include!("it_util/timeout.rs"); + fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -126,6 +129,7 @@ fn main() { event: WindowEvent::CloseRequested, window_id, } if window_id == window.id() => control_flow.set_exit(), + Event::UserEvent(()) => control_flow.set_exit(), _ => (), } }); diff --git a/examples/window_drag_resize.rs b/examples/window_drag_resize.rs index 95a6737791..870ab20c05 100644 --- a/examples/window_drag_resize.rs +++ b/examples/window_drag_resize.rs @@ -1,5 +1,7 @@ //! Demonstrates capability to create in-app draggable regions for client-side decoration support. +include!("it_util/timeout.rs"); + use simple_logger::SimpleLogger; use winit::{ event::{ @@ -14,6 +16,7 @@ const BORDER: f64 = 8.0; fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_inner_size(winit::dpi::LogicalSize::new(600.0, 400.0)) @@ -66,6 +69,7 @@ fn main() { } _ => (), }, + Event::UserEvent(()) => control_flow.set_exit(), _ => (), }); } diff --git a/examples/window_icon.rs b/examples/window_icon.rs index ed98b3d577..74351700c1 100644 --- a/examples/window_icon.rs +++ b/examples/window_icon.rs @@ -1,5 +1,7 @@ #![allow(clippy::single_match)] +include!("it_util/timeout.rs"); + use std::path::Path; use simple_logger::SimpleLogger; @@ -21,6 +23,7 @@ fn main() { let icon = load_icon(Path::new(path)); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("An iconic window!") @@ -42,6 +45,8 @@ fn main() { } _ => (), } + } else if let Event::UserEvent(()) = event { + control_flow.set_exit(); } }); } diff --git a/examples/window_option_as_alt.rs b/examples/window_option_as_alt.rs index b7d288d5bb..ed89544410 100644 --- a/examples/window_option_as_alt.rs +++ b/examples/window_option_as_alt.rs @@ -1,5 +1,8 @@ #![allow(clippy::single_match)] +#[cfg(target_os = "macos")] +include!("it_util/timeout.rs"); + #[cfg(target_os = "macos")] use winit::platform::macos::{OptionAsAlt, WindowExtMacOS}; @@ -16,6 +19,7 @@ use winit::{ #[cfg(target_os = "macos")] fn main() { let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -56,6 +60,9 @@ fn main() { Event::MainEventsCleared => { window.request_redraw(); } + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/window_resize_increments.rs b/examples/window_resize_increments.rs index ce06daf22f..a6ae8c5772 100644 --- a/examples/window_resize_increments.rs +++ b/examples/window_resize_increments.rs @@ -7,9 +7,12 @@ use winit::{ window::WindowBuilder, }; +include!("it_util/timeout.rs"); + fn main() { SimpleLogger::new().init().unwrap(); let event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); let window = WindowBuilder::new() .with_title("A fantastic window!") @@ -51,6 +54,9 @@ fn main() { window.set_resize_increments(new_increments); } Event::MainEventsCleared => window.request_redraw(), + Event::UserEvent(()) => { + control_flow.set_exit(); + } _ => (), } }); diff --git a/examples/window_run_return.rs b/examples/window_run_return.rs index f088a51437..925ba319ad 100644 --- a/examples/window_run_return.rs +++ b/examples/window_run_return.rs @@ -1,5 +1,15 @@ #![allow(clippy::single_match)] +#[cfg(any( + windows_platform, + macos_platform, + x11_platform, + wayland_platform, + android_platform, + orbital_platform, +))] +include!("it_util/timeout.rs"); + // Limit this example to only compatible platforms. #[cfg(any( windows_platform, @@ -20,6 +30,7 @@ fn main() { window::WindowBuilder, }; let mut event_loop = EventLoop::new(); + util::start_timeout_thread(&event_loop, ()); SimpleLogger::new().init().unwrap(); let _window = WindowBuilder::new() @@ -48,6 +59,10 @@ fn main() { Event::MainEventsCleared => { control_flow.set_exit(); } + Event::UserEvent(()) => { + quit = true; + control_flow.set_exit(); + } _ => (), } });