mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-24 22:31:30 +11:00
Implement Canvas::request_redraw
This commit is contained in:
parent
9c5657b86c
commit
d5368d7979
|
@ -9,6 +9,7 @@ use web_sys::{HtmlCanvasElement, PointerEvent, WheelEvent};
|
||||||
|
|
||||||
pub struct Canvas {
|
pub struct Canvas {
|
||||||
raw: HtmlCanvasElement,
|
raw: HtmlCanvasElement,
|
||||||
|
on_redraw: Closure<dyn Fn()>,
|
||||||
on_mouse_out: Option<Closure<dyn FnMut(PointerEvent)>>,
|
on_mouse_out: Option<Closure<dyn FnMut(PointerEvent)>>,
|
||||||
on_mouse_over: Option<Closure<dyn FnMut(PointerEvent)>>,
|
on_mouse_over: Option<Closure<dyn FnMut(PointerEvent)>>,
|
||||||
on_mouse_up: Option<Closure<dyn FnMut(PointerEvent)>>,
|
on_mouse_up: Option<Closure<dyn FnMut(PointerEvent)>>,
|
||||||
|
@ -24,7 +25,10 @@ impl Drop for Canvas {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Canvas {
|
impl Canvas {
|
||||||
pub fn create() -> Result<Self, RootOE> {
|
pub fn create<F>(on_redraw: F) -> Result<Self, RootOE>
|
||||||
|
where
|
||||||
|
F: 'static + Fn(),
|
||||||
|
{
|
||||||
let window = web_sys::window().expect("Failed to obtain window");
|
let window = web_sys::window().expect("Failed to obtain window");
|
||||||
let document = window.document().expect("Failed to obtain document");
|
let document = window.document().expect("Failed to obtain document");
|
||||||
|
|
||||||
|
@ -41,6 +45,7 @@ impl Canvas {
|
||||||
|
|
||||||
Ok(Canvas {
|
Ok(Canvas {
|
||||||
raw: canvas,
|
raw: canvas,
|
||||||
|
on_redraw: Closure::wrap(Box::new(on_redraw) as Box<dyn Fn()>),
|
||||||
on_mouse_out: None,
|
on_mouse_out: None,
|
||||||
on_mouse_over: None,
|
on_mouse_over: None,
|
||||||
on_mouse_up: None,
|
on_mouse_up: None,
|
||||||
|
@ -79,6 +84,11 @@ impl Canvas {
|
||||||
&self.raw
|
&self.raw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn request_redraw(&self) {
|
||||||
|
let window = web_sys::window().expect("Failed to obtain window");
|
||||||
|
window.request_animation_frame(&self.on_redraw.as_ref().unchecked_ref());
|
||||||
|
}
|
||||||
|
|
||||||
pub fn on_mouse_out<F>(&mut self, mut handler: F)
|
pub fn on_mouse_out<F>(&mut self, mut handler: F)
|
||||||
where
|
where
|
||||||
F: 'static + FnMut(i32),
|
F: 'static + FnMut(i32),
|
||||||
|
|
|
@ -11,12 +11,6 @@ use crate::platform::web::WindowExtWebSys;
|
||||||
use crate::window::Window;
|
use crate::window::Window;
|
||||||
use web_sys::HtmlCanvasElement;
|
use web_sys::HtmlCanvasElement;
|
||||||
|
|
||||||
pub fn request_animation_frame<F>(f: F)
|
|
||||||
where
|
|
||||||
F: Fn(),
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn throw(msg: &str) {
|
pub fn throw(msg: &str) {
|
||||||
wasm_bindgen::throw_str(msg);
|
wasm_bindgen::throw_str(msg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ use std::collections::VecDeque;
|
||||||
|
|
||||||
pub struct Window {
|
pub struct Window {
|
||||||
canvas: backend::Canvas,
|
canvas: backend::Canvas,
|
||||||
redraw: Box<dyn Fn()>,
|
|
||||||
previous_pointer: RefCell<&'static str>,
|
previous_pointer: RefCell<&'static str>,
|
||||||
position: RefCell<LogicalPosition>,
|
position: RefCell<LogicalPosition>,
|
||||||
}
|
}
|
||||||
|
@ -24,24 +23,19 @@ impl Window {
|
||||||
attr: WindowAttributes,
|
attr: WindowAttributes,
|
||||||
_: PlatformSpecificBuilderAttributes,
|
_: PlatformSpecificBuilderAttributes,
|
||||||
) -> Result<Self, RootOE> {
|
) -> Result<Self, RootOE> {
|
||||||
let mut canvas = backend::Canvas::create()?;
|
let runner = target.runner.clone();
|
||||||
|
|
||||||
|
let mut canvas = backend::Canvas::create(move || {
|
||||||
|
runner.send_event(Event::WindowEvent {
|
||||||
|
window_id: RootWI(Id),
|
||||||
|
event: WindowEvent::RedrawRequested,
|
||||||
|
})
|
||||||
|
})?;
|
||||||
|
|
||||||
target.register(&mut canvas);
|
target.register(&mut canvas);
|
||||||
|
|
||||||
let runner = target.runner.clone();
|
|
||||||
let redraw = Box::new(move || {
|
|
||||||
let runner = runner.clone();
|
|
||||||
backend::request_animation_frame(move || {
|
|
||||||
runner.send_event(Event::WindowEvent {
|
|
||||||
window_id: RootWI(Id),
|
|
||||||
event: WindowEvent::RedrawRequested,
|
|
||||||
})
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
let window = Window {
|
let window = Window {
|
||||||
canvas,
|
canvas,
|
||||||
redraw,
|
|
||||||
previous_pointer: RefCell::new("auto"),
|
previous_pointer: RefCell::new("auto"),
|
||||||
position: RefCell::new(LogicalPosition { x: 0.0, y: 0.0 }),
|
position: RefCell::new(LogicalPosition { x: 0.0, y: 0.0 }),
|
||||||
};
|
};
|
||||||
|
@ -71,7 +65,7 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn request_redraw(&self) {
|
pub fn request_redraw(&self) {
|
||||||
(self.redraw)();
|
self.canvas.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn outer_position(&self) -> Result<LogicalPosition, NotSupportedError> {
|
pub fn outer_position(&self) -> Result<LogicalPosition, NotSupportedError> {
|
||||||
|
|
Loading…
Reference in a new issue