Add keyboard special key support for web content interaction
Enter, Backspace, Tab, Escape, Delete, arrow keys, Home, End, PageUp, PageDown now forward to Servo. Previously only printable characters reached the web engine, making forms unusable.
This commit is contained in:
@@ -1,6 +1,25 @@
|
||||
use servo::Code;
|
||||
use servo::{Code, Key};
|
||||
|
||||
pub(crate) fn keyboard_code_for_character(character: char) -> Code {
|
||||
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),
|
||||
_ => (Key::Character(character.to_string()), printable_code(character)),
|
||||
}
|
||||
}
|
||||
|
||||
fn printable_code(character: char) -> Code {
|
||||
match character {
|
||||
'a' | 'A' => Code::KeyA,
|
||||
'b' | 'B' => Code::KeyB,
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
use servo::{
|
||||
DevicePoint, InputEvent, Key, KeyState, KeyboardEvent, Location, Modifiers, MouseButton,
|
||||
DevicePoint, InputEvent, KeyState, KeyboardEvent, Location, Modifiers, MouseButton,
|
||||
MouseButtonAction, MouseButtonEvent, MouseMoveEvent, TouchEvent, TouchEventType, TouchId,
|
||||
WebView, WebViewPoint,
|
||||
};
|
||||
|
||||
use crate::keyboard::keyboard_code_for_character;
|
||||
use crate::keyboard::key_and_code_for_character;
|
||||
|
||||
pub(super) fn send_mouse_click(webview: &WebView, x: u32, y: u32) {
|
||||
let point = point(x, y);
|
||||
@@ -32,8 +32,7 @@ pub(super) fn send_touch_tap(webview: &WebView, x: u32, y: u32) {
|
||||
|
||||
pub(super) fn send_keyboard_text(webview: &WebView, text: &str) {
|
||||
for character in text.chars() {
|
||||
let key = Key::Character(character.to_string());
|
||||
let code = keyboard_code_for_character(character);
|
||||
let (key, code) = key_and_code_for_character(character);
|
||||
webview.notify_input_event(InputEvent::Keyboard(KeyboardEvent::new_without_event(
|
||||
KeyState::Down,
|
||||
key.clone(),
|
||||
|
||||
Reference in New Issue
Block a user