WEFT_OS/crates/weft-servo-shell/src/keyutils.rs

205 lines
6.4 KiB
Rust
Raw Normal View History

#![cfg(feature = "servo-embed")]
use servo::{Code, Key, KeyState, KeyboardEvent, Location, Modifiers};
use winit::event::ElementState;
use winit::keyboard::{Key as WinitKey, KeyLocation, ModifiersState, NamedKey, PhysicalKey};
pub fn keyboard_event_from_winit(
event: &winit::event::KeyEvent,
modifiers: ModifiersState,
) -> KeyboardEvent {
let state = match event.state {
ElementState::Pressed => KeyState::Down,
ElementState::Released => KeyState::Up,
};
let key = match &event.logical_key {
WinitKey::Named(n) => Key::Named(named_key(*n)),
WinitKey::Character(c) => Key::Character(c.to_string().into()),
WinitKey::Unidentified(_) => Key::Unidentified,
WinitKey::Dead(c) => Key::Dead(*c),
};
let code = match event.physical_key {
PhysicalKey::Code(c) => winit_code_to_code(c),
PhysicalKey::Unidentified(_) => Code::Unidentified,
};
let location = match event.location {
KeyLocation::Standard => Location::Standard,
KeyLocation::Left => Location::Left,
KeyLocation::Right => Location::Right,
KeyLocation::Numpad => Location::Numpad,
};
let mut mods = Modifiers::empty();
if modifiers.shift_key() {
mods |= Modifiers::SHIFT;
}
if modifiers.control_key() {
mods |= Modifiers::CONTROL;
}
if modifiers.alt_key() {
mods |= Modifiers::ALT;
}
if modifiers.super_key() {
mods |= Modifiers::META;
}
KeyboardEvent {
state,
key,
code,
location,
modifiers: mods,
repeat: event.repeat,
is_composing: false,
}
}
fn named_key(n: NamedKey) -> servo::NamedKey {
use servo::NamedKey as S;
match n {
NamedKey::Alt => S::Alt,
NamedKey::AltGraph => S::AltGraph,
NamedKey::CapsLock => S::CapsLock,
NamedKey::Control => S::Control,
NamedKey::Fn => S::Fn,
NamedKey::FnLock => S::FnLock,
NamedKey::Meta => S::Meta,
NamedKey::NumLock => S::NumLock,
NamedKey::ScrollLock => S::ScrollLock,
NamedKey::Shift => S::Shift,
NamedKey::Symbol => S::Symbol,
NamedKey::SymbolLock => S::SymbolLock,
NamedKey::Enter => S::Enter,
NamedKey::Tab => S::Tab,
NamedKey::Space => S::Space,
NamedKey::ArrowDown => S::ArrowDown,
NamedKey::ArrowLeft => S::ArrowLeft,
NamedKey::ArrowRight => S::ArrowRight,
NamedKey::ArrowUp => S::ArrowUp,
NamedKey::End => S::End,
NamedKey::Home => S::Home,
NamedKey::PageDown => S::PageDown,
NamedKey::PageUp => S::PageUp,
NamedKey::Backspace => S::Backspace,
NamedKey::Clear => S::Clear,
NamedKey::Copy => S::Copy,
NamedKey::CrSel => S::CrSel,
NamedKey::Cut => S::Cut,
NamedKey::Delete => S::Delete,
NamedKey::EraseEof => S::EraseEof,
NamedKey::ExSel => S::ExSel,
NamedKey::Insert => S::Insert,
NamedKey::Paste => S::Paste,
NamedKey::Redo => S::Redo,
NamedKey::Undo => S::Undo,
NamedKey::Escape => S::Escape,
NamedKey::F1 => S::F1,
NamedKey::F2 => S::F2,
NamedKey::F3 => S::F3,
NamedKey::F4 => S::F4,
NamedKey::F5 => S::F5,
NamedKey::F6 => S::F6,
NamedKey::F7 => S::F7,
NamedKey::F8 => S::F8,
NamedKey::F9 => S::F9,
NamedKey::F10 => S::F10,
NamedKey::F11 => S::F11,
NamedKey::F12 => S::F12,
_ => S::Unidentified,
}
}
fn winit_code_to_code(c: winit::keyboard::KeyCode) -> Code {
use winit::keyboard::KeyCode as W;
match c {
W::Backquote => Code::Backquote,
W::Backslash => Code::Backslash,
W::BracketLeft => Code::BracketLeft,
W::BracketRight => Code::BracketRight,
W::Comma => Code::Comma,
W::Digit0 => Code::Digit0,
W::Digit1 => Code::Digit1,
W::Digit2 => Code::Digit2,
W::Digit3 => Code::Digit3,
W::Digit4 => Code::Digit4,
W::Digit5 => Code::Digit5,
W::Digit6 => Code::Digit6,
W::Digit7 => Code::Digit7,
W::Digit8 => Code::Digit8,
W::Digit9 => Code::Digit9,
W::Equal => Code::Equal,
W::KeyA => Code::KeyA,
W::KeyB => Code::KeyB,
W::KeyC => Code::KeyC,
W::KeyD => Code::KeyD,
W::KeyE => Code::KeyE,
W::KeyF => Code::KeyF,
W::KeyG => Code::KeyG,
W::KeyH => Code::KeyH,
W::KeyI => Code::KeyI,
W::KeyJ => Code::KeyJ,
W::KeyK => Code::KeyK,
W::KeyL => Code::KeyL,
W::KeyM => Code::KeyM,
W::KeyN => Code::KeyN,
W::KeyO => Code::KeyO,
W::KeyP => Code::KeyP,
W::KeyQ => Code::KeyQ,
W::KeyR => Code::KeyR,
W::KeyS => Code::KeyS,
W::KeyT => Code::KeyT,
W::KeyU => Code::KeyU,
W::KeyV => Code::KeyV,
W::KeyW => Code::KeyW,
W::KeyX => Code::KeyX,
W::KeyY => Code::KeyY,
W::KeyZ => Code::KeyZ,
W::Minus => Code::Minus,
W::Period => Code::Period,
W::Quote => Code::Quote,
W::Semicolon => Code::Semicolon,
W::Slash => Code::Slash,
W::Backspace => Code::Backspace,
W::CapsLock => Code::CapsLock,
W::Enter => Code::Enter,
W::Space => Code::Space,
W::Tab => Code::Tab,
W::Delete => Code::Delete,
W::End => Code::End,
W::Home => Code::Home,
W::Insert => Code::Insert,
W::PageDown => Code::PageDown,
W::PageUp => Code::PageUp,
W::ArrowDown => Code::ArrowDown,
W::ArrowLeft => Code::ArrowLeft,
W::ArrowRight => Code::ArrowRight,
W::ArrowUp => Code::ArrowUp,
W::NumLock => Code::NumLock,
W::Escape => Code::Escape,
W::F1 => Code::F1,
W::F2 => Code::F2,
W::F3 => Code::F3,
W::F4 => Code::F4,
W::F5 => Code::F5,
W::F6 => Code::F6,
W::F7 => Code::F7,
W::F8 => Code::F8,
W::F9 => Code::F9,
W::F10 => Code::F10,
W::F11 => Code::F11,
W::F12 => Code::F12,
W::ShiftLeft => Code::ShiftLeft,
W::ShiftRight => Code::ShiftRight,
W::ControlLeft => Code::ControlLeft,
W::ControlRight => Code::ControlRight,
W::AltLeft => Code::AltLeft,
W::AltRight => Code::AltRight,
W::SuperLeft => Code::MetaLeft,
W::SuperRight => Code::MetaRight,
_ => Code::Unidentified,
}
}