mirror of
https://github.com/emilk/egui.git
synced 2026-06-27 07:03:14 -04:00
Previously, any frames in flight (`requestAnimationFrame`) on web were not being cancelled (`cancelAnimationFrame`) when `WebRunner::destroy` was called. If a user called `destroy`, then immediately removed the canvas from the DOM, eframe could panic with a "failed to find (canvas) element by id" error message. This PR changes two things: - The canvas element is directly referenced everywhere it's needed instead of being looked up by `canvas_id`[^1] - The RAF handle is stored in `WebRunner` and `cancelAnimationFrame` is called on it inside of `WebRunner::destroy`[^2] [^1]: The WebGL/WGPU backends were already holding onto the canvas (and associated GPU context), so the change is just converting all the `get_element_by_id` lookups to retrieve the canvas from the web runner handle. [^2]: There is only ever one frame in flight, so we store it directly as a scalar field.
30 lines
974 B
Rust
30 lines
974 B
Rust
use wasm_bindgen::JsValue;
|
|
|
|
/// Renderer for a browser canvas.
|
|
/// As of writing we're not allowing to decide on the painter at runtime,
|
|
/// therefore this trait is merely there for specifying and documenting the interface.
|
|
pub(crate) trait WebPainter {
|
|
// Create a new web painter targeting a given canvas.
|
|
// fn new(canvas_id: &str, options: &WebOptions) -> Result<Self, String>
|
|
// where
|
|
// Self: Sized;
|
|
|
|
/// Reference to the canvas in use.
|
|
fn canvas(&self) -> &web_sys::HtmlCanvasElement;
|
|
|
|
/// Maximum size of a texture in one direction.
|
|
fn max_texture_side(&self) -> usize;
|
|
|
|
/// Update all internal textures and paint gui.
|
|
fn paint_and_update_textures(
|
|
&mut self,
|
|
clear_color: [f32; 4],
|
|
clipped_primitives: &[egui::ClippedPrimitive],
|
|
pixels_per_point: f32,
|
|
textures_delta: &egui::TexturesDelta,
|
|
) -> Result<(), JsValue>;
|
|
|
|
/// Destroy all resources.
|
|
fn destroy(&mut self);
|
|
}
|