Plug three holes in Servo input forwarding

1. Scroll no longer wipes keyboard focus. Servo holds DOM focus across
   wheel events; the shell was clearing keyboard_focus and typed_texts
   on every scroll, so a focused input went deaf the moment the user
   scrolled. Scroll still drops the buffered click point because that
   coordinate is captured against the pre-scroll viewport.

2. Mouse-down hands focus to the shell's root focus handle (in
   addition to mouse-up's existing click forwarding). The user can now
   start typing the moment they press the page, instead of having to
   first complete a click round-trip to escape the omnibar's focus.

3. Sidecar hover() honors the requesting webview_id instead of
   defaulting to the first webview in the map, so multi-tab sidecars
   no longer pipe every hover into tab #1.
This commit is contained in:
2026-05-10 00:51:37 -04:00
parent 84ec12e471
commit eb58ce75da
7 changed files with 51 additions and 16 deletions
@@ -90,6 +90,7 @@ fn render_input_overlay(
url: String,
state_entity: Entity<ElyShell>,
) -> impl IntoElement {
let down_entity = state_entity.clone();
let click_tab_id = tab_id.clone();
let click_url = url.clone();
let click_entity = state_entity.clone();
@@ -103,6 +104,16 @@ fn render_input_overlay(
.absolute()
.size_full()
.occlude()
// Mouse-down hands focus to the shell's root focus handle so
// subsequent keystrokes route to the web surface instead of
// the omnibar Input. Doing this on mouse-down (not mouse-up)
// lets the user start typing as soon as they press, matching
// native browser focus semantics.
.on_mouse_down(MouseButton::Left, move |_event, window, cx| {
down_entity.update(cx, |shell, _cx| {
shell.focus_web_surface(window);
});
})
.capture_any_mouse_up(move |event, window, cx| {
if event.button != MouseButton::Left {
return;