Skip to content

Commit 133b11f

Browse files
hecrjOsspial
authored andcommitted
Implement revamped RedrawRequested on Web (#1301)
* Implement revamped `RedrawRequested` on Web * Add `web` example
1 parent 5b48928 commit 133b11f

3 files changed

Lines changed: 81 additions & 9 deletions

File tree

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,6 @@ package = "stdweb"
117117
version = "=0.4.20"
118118
optional = true
119119
features = ["experimental_features_which_may_break_on_minor_version_bumps"]
120+
121+
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
122+
console_log = "0.1"

examples/web.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
use winit::{
2+
event::{Event, WindowEvent},
3+
event_loop::{ControlFlow, EventLoop},
4+
window::WindowBuilder,
5+
};
6+
7+
pub fn main() {
8+
let event_loop = EventLoop::new();
9+
10+
let window = WindowBuilder::new()
11+
.with_title("A fantastic window!")
12+
.build(&event_loop)
13+
.unwrap();
14+
15+
#[cfg(feature = "web-sys")]
16+
{
17+
use winit::platform::web::WindowExtWebSys;
18+
19+
let canvas = window.canvas();
20+
21+
let window = web_sys::window().unwrap();
22+
let document = window.document().unwrap();
23+
let body = document.body().unwrap();
24+
25+
body.append_child(&canvas)
26+
.expect("Append canvas to HTML body");
27+
}
28+
29+
#[cfg(feature = "stdweb")]
30+
{
31+
use std_web::web::INode;
32+
use winit::platform::web::WindowExtStdweb;
33+
34+
let canvas = window.canvas();
35+
36+
let document = std_web::web::document();
37+
let body: std_web::web::Node = document.body().expect("Get HTML body").into();
38+
39+
body.append_child(&canvas);
40+
}
41+
42+
event_loop.run(move |event, _, control_flow| {
43+
#[cfg(feature = "web-sys")]
44+
log::debug!("{:?}", event);
45+
46+
#[cfg(feature = "stdweb")]
47+
std_web::console!(log, "%s", format!("{:?}", event));
48+
49+
match event {
50+
Event::WindowEvent {
51+
event: WindowEvent::CloseRequested,
52+
window_id,
53+
} if window_id == window.id() => *control_flow = ControlFlow::Exit,
54+
Event::MainEventsCleared => {
55+
window.request_redraw();
56+
}
57+
_ => *control_flow = ControlFlow::Wait,
58+
}
59+
});
60+
}
61+
62+
#[cfg(feature = "web-sys")]
63+
mod wasm {
64+
use wasm_bindgen::prelude::*;
65+
66+
#[wasm_bindgen(start)]
67+
pub fn run() {
68+
console_log::init_with_level(log::Level::Debug);
69+
70+
super::main();
71+
}
72+
}

src/platform_impl/web/event_loop/runner.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use super::{backend, state::State};
2-
use crate::event::{Event, StartCause, WindowEvent};
2+
use crate::event::{Event, StartCause};
33
use crate::event_loop as root;
44
use crate::window::WindowId;
55

@@ -127,18 +127,15 @@ impl<T: 'static> Shared<T> {
127127
if !event_is_start {
128128
self.handle_event(event, &mut control);
129129
}
130+
self.handle_event(Event::MainEventsCleared, &mut control);
131+
130132
// Collect all of the redraw events to avoid double-locking the RefCell
131133
let redraw_events: Vec<WindowId> = self.0.redraw_pending.borrow_mut().drain().collect();
132134
for window_id in redraw_events {
133-
self.handle_event(
134-
Event::WindowEvent {
135-
window_id,
136-
event: WindowEvent::RedrawRequested,
137-
},
138-
&mut control,
139-
);
135+
self.handle_event(Event::RedrawRequested(window_id), &mut control);
140136
}
141-
self.handle_event(Event::EventsCleared, &mut control);
137+
self.handle_event(Event::RedrawEventsCleared, &mut control);
138+
142139
self.apply_control_flow(control);
143140
// If the event loop is closed, it has been closed this iteration and now the closing
144141
// event should be emitted

0 commit comments

Comments
 (0)