Implement revamped RedrawRequested on Web (#1301)

* Implement revamped `RedrawRequested` on Web

* Add `web` example
This commit is contained in:
Héctor Ramón 2019-12-03 18:16:06 +01:00 committed by Osspial
parent 5b489284e4
commit 133b11fa6d
3 changed files with 81 additions and 9 deletions

View file

@ -117,3 +117,6 @@ package = "stdweb"
version = "=0.4.20" version = "=0.4.20"
optional = true optional = true
features = ["experimental_features_which_may_break_on_minor_version_bumps"] features = ["experimental_features_which_may_break_on_minor_version_bumps"]
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
console_log = "0.1"

72
examples/web.rs Normal file
View file

@ -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();
}
}

View file

@ -1,5 +1,5 @@
use super::{backend, state::State}; use super::{backend, state::State};
use crate::event::{Event, StartCause, WindowEvent}; use crate::event::{Event, StartCause};
use crate::event_loop as root; use crate::event_loop as root;
use crate::window::WindowId; use crate::window::WindowId;
@ -127,18 +127,15 @@ impl<T: 'static> Shared<T> {
if !event_is_start { if !event_is_start {
self.handle_event(event, &mut control); 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 // 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(); let redraw_events: Vec<WindowId> = self.0.redraw_pending.borrow_mut().drain().collect();
for window_id in redraw_events { for window_id in redraw_events {
self.handle_event( self.handle_event(Event::RedrawRequested(window_id), &mut control);
Event::WindowEvent {
window_id,
event: WindowEvent::RedrawRequested,
},
&mut control,
);
} }
self.handle_event(Event::EventsCleared, &mut control); self.handle_event(Event::RedrawEventsCleared, &mut control);
self.apply_control_flow(control); self.apply_control_flow(control);
// If the event loop is closed, it has been closed this iteration and now the closing // If the event loop is closed, it has been closed this iteration and now the closing
// event should be emitted // event should be emitted