diff --git a/CHANGELOG.md b/CHANGELOG.md index 282132388..77ef11388 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Unreleased` header. # Unreleased +- On Web, account for canvas being focused already before event loop starts. + # 0.29.9 - On X11, fix `NotSupported` error not propagated when creating event loop. diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index 2b5ddf5a7..7e269c98c 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -5,6 +5,8 @@ use std::iter; use std::marker::PhantomData; use std::rc::{Rc, Weak}; +use web_sys::Element; + use super::runner::{EventWrapper, Execution}; use super::{ super::{monitor::MonitorHandle, KeyEventExtra}, @@ -122,6 +124,25 @@ impl EventLoopWindowTarget { } }); + // It is possible that at this point the canvas has + // been focused before the callback can be called. + let focused = canvas + .document() + .active_element() + .filter(|element| { + let canvas: &Element = canvas.raw(); + element == canvas + }) + .is_some(); + + if focused { + canvas.has_focus.set(true); + self.runner.send_event(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Focused(true), + }) + } + let runner = self.runner.clone(); let modifiers = self.modifiers.clone(); canvas.on_keyboard_press(