#![allow(clippy::single_match)] use winit::{ event::{Event, WindowEvent}, event_loop::EventLoop, window::WindowBuilder, }; pub fn main() { let event_loop = EventLoop::new(); let window = WindowBuilder::new() .with_title("A fantastic window!") .build(&event_loop) .unwrap(); #[cfg(target_arch = "wasm32")] let log_list = wasm::insert_canvas_and_create_log_list(&window); event_loop.run(move |event, _, control_flow| { control_flow.set_wait(); #[cfg(target_arch = "wasm32")] wasm::log_event(&log_list, &event); match event { Event::WindowEvent { event: WindowEvent::CloseRequested, window_id, } if window_id == window.id() => control_flow.set_exit(), Event::MainEventsCleared => { window.request_redraw(); } _ => (), } }); } #[cfg(target_arch = "wasm32")] mod wasm { use wasm_bindgen::prelude::*; use winit::{event::Event, window::Window}; #[wasm_bindgen(start)] pub fn run() { console_log::init_with_level(log::Level::Debug).expect("error initializing logger"); #[allow(clippy::main_recursion)] super::main(); } pub fn insert_canvas_and_create_log_list(window: &Window) -> web_sys::Element { use winit::platform::web::WindowExtWebSys; let canvas = window.canvas(); let window = web_sys::window().unwrap(); let document = window.document().unwrap(); let body = document.body().unwrap(); // Set a background color for the canvas to make it easier to tell where the canvas is for debugging purposes. canvas.style().set_css_text("background-color: crimson;"); body.append_child(&canvas).unwrap(); let log_header = document.create_element("h2").unwrap(); log_header.set_text_content(Some("Event Log")); body.append_child(&log_header).unwrap(); let log_list = document.create_element("ul").unwrap(); body.append_child(&log_list).unwrap(); log_list } pub fn log_event(log_list: &web_sys::Element, event: &Event<()>) { log::debug!("{:?}", event); // Getting access to browser logs requires a lot of setup on mobile devices. // So we implement this basic logging system into the page to give developers an easy alternative. // As a bonus its also kind of handy on desktop. if let Event::WindowEvent { event, .. } = &event { let window = web_sys::window().unwrap(); let document = window.document().unwrap(); let log = document.create_element("li").unwrap(); log.set_text_content(Some(&format!("{:?}", event))); log_list .insert_before(&log, log_list.first_child().as_ref()) .unwrap(); } } }