mirror of
https://github.com/emilk/egui.git
synced 2026-08-29 04:40:03 -04:00
Add pointer events and focus handling for apps run in a Shadow DOM (#5627)
* [x] I have followed the instructions in the PR template This PR handles pointer events and focus which did following changes: - `element_from_point` and focus is now acquired from root node object by using `get_root_node` from document or a shadow root. - `TextAgent` is appended individually in each shadow root. These changes handles pointer events and focus well in a web app that are running in a shadow dom, or else the hover pointer actions and keyboard input events are not triggered in a shadow dom. Helpful for building embeddable/multi-view web-apps.
This commit is contained in:
@@ -1,5 +1,3 @@
|
||||
use web_sys::EventTarget;
|
||||
|
||||
use crate::web::string_from_js_value;
|
||||
|
||||
use super::{
|
||||
@@ -10,6 +8,8 @@ use super::{
|
||||
DEBUG_RESIZE,
|
||||
};
|
||||
|
||||
use web_sys::{Document, EventTarget, ShadowRoot};
|
||||
|
||||
// TODO(emilk): there are more calls to `prevent_default` and `stop_propagation`
|
||||
// than what is probably needed.
|
||||
|
||||
@@ -570,10 +570,17 @@ fn install_pointerup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(),
|
||||
/// Returns true if the cursor is above the canvas, or if we're dragging something.
|
||||
/// Pass in the position in browser viewport coordinates (usually event.clientX/Y).
|
||||
fn is_interested_in_pointer_event(runner: &AppRunner, pos: egui::Pos2) -> bool {
|
||||
let document = web_sys::window().unwrap().document().unwrap();
|
||||
let is_hovering_canvas = document
|
||||
.element_from_point(pos.x, pos.y)
|
||||
.is_some_and(|element| element.eq(runner.canvas()));
|
||||
let root_node = runner.canvas().get_root_node();
|
||||
|
||||
let element_at_point = if let Some(document) = root_node.dyn_ref::<Document>() {
|
||||
document.element_from_point(pos.x, pos.y)
|
||||
} else if let Some(shadow) = root_node.dyn_ref::<ShadowRoot>() {
|
||||
shadow.element_from_point(pos.x, pos.y)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let is_hovering_canvas = element_at_point.is_some_and(|element| element.eq(runner.canvas()));
|
||||
let is_pointer_down = runner
|
||||
.egui_ctx()
|
||||
.input(|i| i.pointer.any_down() || i.any_touches());
|
||||
|
||||
Reference in New Issue
Block a user