desktop: Handle properly keys with modifiers

FP recognizes modifiers for numpad keys, but ignores them for non-numpad
keys, so that pressing Shift+3 produces key codes for Shift and Key3,
but pressing Shift+Numpad7 produces keycodes for Shift and Home.
This commit is contained in:
Kamil Jarosz 2024-06-24 18:27:16 +02:00 committed by Tom Schuster
parent cda7ac6024
commit b75d4cdce0
1 changed files with 43 additions and 36 deletions

View File

@ -60,6 +60,11 @@ pub fn winit_to_ruffle_text_control(
/// Convert a winit event into a Ruffle `KeyCode`. /// Convert a winit event into a Ruffle `KeyCode`.
/// Return `KeyCode::Unknown` if there is no matching Flash key code. /// Return `KeyCode::Unknown` if there is no matching Flash key code.
pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> Option<KeyCode> { pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> Option<KeyCode> {
// Note: it would be tempting to use event.key_without_modifiers() here, but FP
// does not care about keys without modifiers at all, it does its own mapping,
// so that on English UK, Shift+3 produces 16+163, not 16+51.
let is_numpad = event.location == KeyLocation::Numpad;
let key_code = match event.logical_key.as_ref() { let key_code = match event.logical_key.as_ref() {
Key::Named(NamedKey::Backspace) => KeyCode::Backspace, Key::Named(NamedKey::Backspace) => KeyCode::Backspace,
Key::Named(NamedKey::Tab) => KeyCode::Tab, Key::Named(NamedKey::Tab) => KeyCode::Tab,
@ -72,26 +77,33 @@ pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> Option<KeyCode> {
Key::Named(NamedKey::CapsLock) => KeyCode::CapsLock, Key::Named(NamedKey::CapsLock) => KeyCode::CapsLock,
Key::Named(NamedKey::Escape) => KeyCode::Escape, Key::Named(NamedKey::Escape) => KeyCode::Escape,
Key::Named(NamedKey::Space) => KeyCode::Space, Key::Named(NamedKey::Space) => KeyCode::Space,
Key::Character("0") if event.location == KeyLocation::Numpad => KeyCode::Numpad0, // Note: FP DOES care about modifiers for numpad keys,
Key::Character("1") if event.location == KeyLocation::Numpad => KeyCode::Numpad1, // so that Shift+Numpad7 produces 16+36, not 16+103.
Key::Character("2") if event.location == KeyLocation::Numpad => KeyCode::Numpad2, Key::Character("0") if is_numpad => KeyCode::Numpad0,
Key::Character("3") if event.location == KeyLocation::Numpad => KeyCode::Numpad3, Key::Character("1") if is_numpad => KeyCode::Numpad1,
Key::Character("4") if event.location == KeyLocation::Numpad => KeyCode::Numpad4, Key::Character("2") if is_numpad => KeyCode::Numpad2,
Key::Character("5") if event.location == KeyLocation::Numpad => KeyCode::Numpad5, Key::Character("3") if is_numpad => KeyCode::Numpad3,
Key::Character("6") if event.location == KeyLocation::Numpad => KeyCode::Numpad6, Key::Character("4") if is_numpad => KeyCode::Numpad4,
Key::Character("7") if event.location == KeyLocation::Numpad => KeyCode::Numpad7, Key::Character("5") if is_numpad => KeyCode::Numpad5,
Key::Character("8") if event.location == KeyLocation::Numpad => KeyCode::Numpad8, Key::Character("6") if is_numpad => KeyCode::Numpad6,
Key::Character("9") if event.location == KeyLocation::Numpad => KeyCode::Numpad9, Key::Character("7") if is_numpad => KeyCode::Numpad7,
Key::Character("0") => KeyCode::Key0, Key::Character("8") if is_numpad => KeyCode::Numpad8,
Key::Character("1") => KeyCode::Key1, Key::Character("9") if is_numpad => KeyCode::Numpad9,
Key::Character("2") => KeyCode::Key2, Key::Character("*") if is_numpad => KeyCode::Multiply,
Key::Character("3") => KeyCode::Key3, Key::Character("+") if is_numpad => KeyCode::Plus,
Key::Character("4") => KeyCode::Key4, Key::Character("-") if is_numpad => KeyCode::NumpadMinus,
Key::Character("5") => KeyCode::Key5, Key::Character(".") if is_numpad => KeyCode::NumpadPeriod,
Key::Character("6") => KeyCode::Key6, Key::Character("/") if is_numpad => KeyCode::NumpadSlash,
Key::Character("7") => KeyCode::Key7, Key::Character("0") | Key::Character(")") => KeyCode::Key0,
Key::Character("8") => KeyCode::Key8, Key::Character("1") | Key::Character("!") => KeyCode::Key1,
Key::Character("9") => KeyCode::Key9, Key::Character("2") | Key::Character("@") => KeyCode::Key2,
Key::Character("3") | Key::Character("#") => KeyCode::Key3,
Key::Character("4") | Key::Character("$") => KeyCode::Key4,
Key::Character("5") | Key::Character("%") => KeyCode::Key5,
Key::Character("6") | Key::Character("^") => KeyCode::Key6,
Key::Character("7") | Key::Character("&") => KeyCode::Key7,
Key::Character("8") | Key::Character("*") => KeyCode::Key8,
Key::Character("9") | Key::Character("(") => KeyCode::Key9,
Key::Character("a") => KeyCode::A, Key::Character("a") => KeyCode::A,
Key::Character("b") => KeyCode::B, Key::Character("b") => KeyCode::B,
Key::Character("c") => KeyCode::C, Key::Character("c") => KeyCode::C,
@ -118,22 +130,17 @@ pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> Option<KeyCode> {
Key::Character("x") => KeyCode::X, Key::Character("x") => KeyCode::X,
Key::Character("y") => KeyCode::Y, Key::Character("y") => KeyCode::Y,
Key::Character("z") => KeyCode::Z, Key::Character("z") => KeyCode::Z,
Key::Character(";") => KeyCode::Semicolon, Key::Character(";") | Key::Character(":") => KeyCode::Semicolon,
Key::Character("=") => KeyCode::Equals, Key::Character("=") | Key::Character("+") => KeyCode::Equals,
Key::Character(",") => KeyCode::Comma, Key::Character(",") | Key::Character("<") => KeyCode::Comma,
Key::Character("-") if event.location == KeyLocation::Numpad => KeyCode::NumpadMinus, Key::Character("-") | Key::Character("_") => KeyCode::Minus,
Key::Character("-") => KeyCode::Minus, Key::Character(".") | Key::Character(">") => KeyCode::Period,
Key::Character(".") if event.location == KeyLocation::Numpad => KeyCode::NumpadPeriod, Key::Character("/") | Key::Character("?") => KeyCode::Slash,
Key::Character(".") => KeyCode::Period, Key::Character("`") | Key::Character("~") => KeyCode::Grave,
Key::Character("/") if event.location == KeyLocation::Numpad => KeyCode::NumpadSlash, Key::Character("[") | Key::Character("{") => KeyCode::LBracket,
Key::Character("/") => KeyCode::Slash, Key::Character("\\") | Key::Character("|") => KeyCode::Backslash,
Key::Character("`") => KeyCode::Grave, Key::Character("]") | Key::Character("}") => KeyCode::RBracket,
Key::Character("[") => KeyCode::LBracket, Key::Character("'") | Key::Character("\"") => KeyCode::Apostrophe,
Key::Character("\\") => KeyCode::Backslash,
Key::Character("]") => KeyCode::RBracket,
Key::Character("'") => KeyCode::Apostrophe,
Key::Character("*") => KeyCode::Multiply,
Key::Character("+") => KeyCode::Plus,
Key::Named(NamedKey::PageUp) => KeyCode::PgUp, Key::Named(NamedKey::PageUp) => KeyCode::PgUp,
Key::Named(NamedKey::PageDown) => KeyCode::PgDown, Key::Named(NamedKey::PageDown) => KeyCode::PgDown,
Key::Named(NamedKey::End) => KeyCode::End, Key::Named(NamedKey::End) => KeyCode::End,