From b75d4cdce028ba030a20f22e6f5d60c1a21fcf82 Mon Sep 17 00:00:00 2001 From: Kamil Jarosz Date: Mon, 24 Jun 2024 18:27:16 +0200 Subject: [PATCH] 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. --- desktop/src/util.rs | 79 ++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/desktop/src/util.rs b/desktop/src/util.rs index 036414cdb..67b5bbb05 100644 --- a/desktop/src/util.rs +++ b/desktop/src/util.rs @@ -60,6 +60,11 @@ pub fn winit_to_ruffle_text_control( /// Convert a winit event into a Ruffle `KeyCode`. /// Return `KeyCode::Unknown` if there is no matching Flash key code. pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> Option { + // 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() { Key::Named(NamedKey::Backspace) => KeyCode::Backspace, Key::Named(NamedKey::Tab) => KeyCode::Tab, @@ -72,26 +77,33 @@ pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> Option { Key::Named(NamedKey::CapsLock) => KeyCode::CapsLock, Key::Named(NamedKey::Escape) => KeyCode::Escape, Key::Named(NamedKey::Space) => KeyCode::Space, - Key::Character("0") if event.location == KeyLocation::Numpad => KeyCode::Numpad0, - Key::Character("1") if event.location == KeyLocation::Numpad => KeyCode::Numpad1, - Key::Character("2") if event.location == KeyLocation::Numpad => KeyCode::Numpad2, - Key::Character("3") if event.location == KeyLocation::Numpad => KeyCode::Numpad3, - Key::Character("4") if event.location == KeyLocation::Numpad => KeyCode::Numpad4, - Key::Character("5") if event.location == KeyLocation::Numpad => KeyCode::Numpad5, - Key::Character("6") if event.location == KeyLocation::Numpad => KeyCode::Numpad6, - Key::Character("7") if event.location == KeyLocation::Numpad => KeyCode::Numpad7, - Key::Character("8") if event.location == KeyLocation::Numpad => KeyCode::Numpad8, - Key::Character("9") if event.location == KeyLocation::Numpad => KeyCode::Numpad9, - Key::Character("0") => KeyCode::Key0, - Key::Character("1") => KeyCode::Key1, - Key::Character("2") => KeyCode::Key2, - Key::Character("3") => KeyCode::Key3, - Key::Character("4") => KeyCode::Key4, - Key::Character("5") => KeyCode::Key5, - Key::Character("6") => KeyCode::Key6, - Key::Character("7") => KeyCode::Key7, - Key::Character("8") => KeyCode::Key8, - Key::Character("9") => KeyCode::Key9, + // Note: FP DOES care about modifiers for numpad keys, + // so that Shift+Numpad7 produces 16+36, not 16+103. + Key::Character("0") if is_numpad => KeyCode::Numpad0, + Key::Character("1") if is_numpad => KeyCode::Numpad1, + Key::Character("2") if is_numpad => KeyCode::Numpad2, + Key::Character("3") if is_numpad => KeyCode::Numpad3, + Key::Character("4") if is_numpad => KeyCode::Numpad4, + Key::Character("5") if is_numpad => KeyCode::Numpad5, + Key::Character("6") if is_numpad => KeyCode::Numpad6, + Key::Character("7") if is_numpad => KeyCode::Numpad7, + Key::Character("8") if is_numpad => KeyCode::Numpad8, + Key::Character("9") if is_numpad => KeyCode::Numpad9, + Key::Character("*") if is_numpad => KeyCode::Multiply, + Key::Character("+") if is_numpad => KeyCode::Plus, + Key::Character("-") if is_numpad => KeyCode::NumpadMinus, + Key::Character(".") if is_numpad => KeyCode::NumpadPeriod, + Key::Character("/") if is_numpad => KeyCode::NumpadSlash, + Key::Character("0") | Key::Character(")") => KeyCode::Key0, + Key::Character("1") | Key::Character("!") => KeyCode::Key1, + 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("b") => KeyCode::B, Key::Character("c") => KeyCode::C, @@ -118,22 +130,17 @@ pub fn winit_to_ruffle_key_code(event: &KeyEvent) -> Option { Key::Character("x") => KeyCode::X, Key::Character("y") => KeyCode::Y, Key::Character("z") => KeyCode::Z, - Key::Character(";") => KeyCode::Semicolon, - Key::Character("=") => KeyCode::Equals, - Key::Character(",") => KeyCode::Comma, - Key::Character("-") if event.location == KeyLocation::Numpad => KeyCode::NumpadMinus, - Key::Character("-") => KeyCode::Minus, - Key::Character(".") if event.location == KeyLocation::Numpad => KeyCode::NumpadPeriod, - Key::Character(".") => KeyCode::Period, - Key::Character("/") if event.location == KeyLocation::Numpad => KeyCode::NumpadSlash, - Key::Character("/") => KeyCode::Slash, - Key::Character("`") => KeyCode::Grave, - Key::Character("[") => KeyCode::LBracket, - Key::Character("\\") => KeyCode::Backslash, - Key::Character("]") => KeyCode::RBracket, - Key::Character("'") => KeyCode::Apostrophe, - Key::Character("*") => KeyCode::Multiply, - Key::Character("+") => KeyCode::Plus, + Key::Character(";") | Key::Character(":") => KeyCode::Semicolon, + Key::Character("=") | Key::Character("+") => KeyCode::Equals, + Key::Character(",") | Key::Character("<") => KeyCode::Comma, + Key::Character("-") | Key::Character("_") => KeyCode::Minus, + Key::Character(".") | Key::Character(">") => KeyCode::Period, + Key::Character("/") | Key::Character("?") => KeyCode::Slash, + Key::Character("`") | Key::Character("~") => KeyCode::Grave, + Key::Character("[") | Key::Character("{") => KeyCode::LBracket, + Key::Character("\\") | Key::Character("|") => KeyCode::Backslash, + Key::Character("]") | Key::Character("}") => KeyCode::RBracket, + Key::Character("'") | Key::Character("\"") => KeyCode::Apostrophe, Key::Named(NamedKey::PageUp) => KeyCode::PgUp, Key::Named(NamedKey::PageDown) => KeyCode::PgDown, Key::Named(NamedKey::End) => KeyCode::End,