Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
72 changes: 72 additions & 0 deletions examples/web.rs
Original file line number Diff line number Diff line change
@@ -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();
}
}
15 changes: 6 additions & 9 deletions src/platform_impl/web/event_loop/runner.rs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -127,18 +127,15 @@ impl<T: 'static> Shared<T> {
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<WindowId> = 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
Expand Down