diff --git a/crates/ely_servo_host/src/host.rs b/crates/ely_servo_host/src/host.rs index 14fcf90..5e21096 100644 --- a/crates/ely_servo_host/src/host.rs +++ b/crates/ely_servo_host/src/host.rs @@ -318,6 +318,8 @@ pub trait ServoHost { fn click(&mut self, request: MouseClickRequest) -> Result<(), ServoHostError>; + fn hover(&mut self, request: MouseHoverRequest) -> Result<(), ServoHostError>; + fn drag(&mut self, request: MouseDragRequest) -> Result<(), ServoHostError>; fn touch_tap(&mut self, request: TouchTapRequest) -> Result<(), ServoHostError>; diff --git a/crates/ely_servo_host/src/keyboard.rs b/crates/ely_servo_host/src/keyboard.rs index 2c33546..677f8d3 100644 --- a/crates/ely_servo_host/src/keyboard.rs +++ b/crates/ely_servo_host/src/keyboard.rs @@ -1,20 +1,20 @@ -use servo::{Code, Key}; +use servo::{Code, Key, NamedKey}; pub(crate) fn key_and_code_for_character(character: char) -> (Key, Code) { match character { - '\n' | '\r' => (Key::Enter, Code::Enter), - '\x08' => (Key::Backspace, Code::Backspace), - '\t' => (Key::Tab, Code::Tab), - '\x1b' => (Key::Escape, Code::Escape), - '\x7f' => (Key::Delete, Code::Delete), - '\u{F700}' => (Key::ArrowUp, Code::ArrowUp), - '\u{F701}' => (Key::ArrowDown, Code::ArrowDown), - '\u{F702}' => (Key::ArrowLeft, Code::ArrowLeft), - '\u{F703}' => (Key::ArrowRight, Code::ArrowRight), - '\u{F729}' => (Key::Home, Code::Home), - '\u{F72B}' => (Key::End, Code::End), - '\u{F72C}' => (Key::PageUp, Code::PageUp), - '\u{F72D}' => (Key::PageDown, Code::PageDown), + '\n' | '\r' => (Key::Named(NamedKey::Enter), Code::Enter), + '\x08' => (Key::Named(NamedKey::Backspace), Code::Backspace), + '\t' => (Key::Named(NamedKey::Tab), Code::Tab), + '\x1b' => (Key::Named(NamedKey::Escape), Code::Escape), + '\x7f' => (Key::Named(NamedKey::Delete), Code::Delete), + '\u{F700}' => (Key::Named(NamedKey::ArrowUp), Code::ArrowUp), + '\u{F701}' => (Key::Named(NamedKey::ArrowDown), Code::ArrowDown), + '\u{F702}' => (Key::Named(NamedKey::ArrowLeft), Code::ArrowLeft), + '\u{F703}' => (Key::Named(NamedKey::ArrowRight), Code::ArrowRight), + '\u{F729}' => (Key::Named(NamedKey::Home), Code::Home), + '\u{F72B}' => (Key::Named(NamedKey::End), Code::End), + '\u{F72C}' => (Key::Named(NamedKey::PageUp), Code::PageUp), + '\u{F72D}' => (Key::Named(NamedKey::PageDown), Code::PageDown), _ => (Key::Character(character.to_string()), printable_code(character)), } } diff --git a/crates/ely_servo_host/src/runtime.rs b/crates/ely_servo_host/src/runtime.rs index d4fc892..fa95614 100644 --- a/crates/ely_servo_host/src/runtime.rs +++ b/crates/ely_servo_host/src/runtime.rs @@ -148,6 +148,14 @@ impl ServoHost for SoftwareServoHost { .delegate(webview.delegate.clone()) .url(url) .build(); + // Fresh WebView is hidden+unfocused by default; without this + // pair Servo's hit-test silently drops every input event. + // Existing WebViews keep their visibility/focus across loads + // — calling focus() here every navigation would let a + // background tab finishing a load steal focus from the + // foreground tab. + webview.webview.show(); + webview.webview.focus(); } else { webview.webview.load(url); } @@ -357,6 +365,8 @@ impl SoftwareServoHost { let webview = WebViewBuilder::new(&self.servo, rendering_context.clone()) .delegate(delegate.clone()) .build(); + webview.show(); + webview.focus(); self.webviews.insert( webview_id.clone(),