diff --git a/Cargo.toml b/Cargo.toml index 53e56c83c9..5a84de0a50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -117,3 +117,6 @@ package = "stdweb" version = "=0.4.20" optional = true features = ["experimental_features_which_may_break_on_minor_version_bumps"] + +[target.'cfg(target_arch = "wasm32")'.dev-dependencies] +console_log = "0.1" diff --git a/examples/web.rs b/examples/web.rs new file mode 100644 index 0000000000..d5b92965af --- /dev/null +++ b/examples/web.rs @@ -0,0 +1,72 @@ +use winit::{ + event::{Event, WindowEvent}, + event_loop::{ControlFlow, 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(feature = "web-sys")] + { + 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(); + + body.append_child(&canvas) + .expect("Append canvas to HTML body"); + } + + #[cfg(feature = "stdweb")] + { + use std_web::web::INode; + use winit::platform::web::WindowExtStdweb; + + let canvas = window.canvas(); + + let document = std_web::web::document(); + let body: std_web::web::Node = document.body().expect("Get HTML body").into(); + + body.append_child(&canvas); + } + + event_loop.run(move |event, _, control_flow| { + #[cfg(feature = "web-sys")] + log::debug!("{:?}", event); + + #[cfg(feature = "stdweb")] + std_web::console!(log, "%s", format!("{:?}", event)); + + match event { + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == window.id() => *control_flow = ControlFlow::Exit, + Event::MainEventsCleared => { + window.request_redraw(); + } + _ => *control_flow = ControlFlow::Wait, + } + }); +} + +#[cfg(feature = "web-sys")] +mod wasm { + use wasm_bindgen::prelude::*; + + #[wasm_bindgen(start)] + pub fn run() { + console_log::init_with_level(log::Level::Debug); + + super::main(); + } +} diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index b3889fad2a..da7d5bad27 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -1,5 +1,5 @@ use super::{backend, state::State}; -use crate::event::{Event, StartCause, WindowEvent}; +use crate::event::{Event, StartCause}; use crate::event_loop as root; use crate::window::WindowId; @@ -127,18 +127,15 @@ impl Shared { if !event_is_start { self.handle_event(event, &mut control); } + self.handle_event(Event::MainEventsCleared, &mut control); + // Collect all of the redraw events to avoid double-locking the RefCell let redraw_events: Vec = self.0.redraw_pending.borrow_mut().drain().collect(); for window_id in redraw_events { - self.handle_event( - Event::WindowEvent { - window_id, - event: WindowEvent::RedrawRequested, - }, - &mut control, - ); + self.handle_event(Event::RedrawRequested(window_id), &mut control); } - self.handle_event(Event::EventsCleared, &mut control); + self.handle_event(Event::RedrawEventsCleared, &mut control); + self.apply_control_flow(control); // If the event loop is closed, it has been closed this iteration and now the closing // event should be emitted