diff --git a/crates/eframe/src/web/events.rs b/crates/eframe/src/web/events.rs index 308c268a6..326ba1556 100644 --- a/crates/eframe/src/web/events.rs +++ b/crates/eframe/src/web/events.rs @@ -199,12 +199,15 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner) runner.input.set_modifiers(modifiers); let key = event.key(); - let egui_key = translate_key(&key); + let logical_key = translate_key(&key); + let physical_key = translate_key(&event.code()); - if let Some(egui_key) = egui_key { + // Fall back to the physical key so that modifier keys (which have no logical + // `egui::Key`) and non-Latin layouts still produce a `Key` event. + if let Some(active_key) = logical_key.or(physical_key) { let egui_event = egui::Event::Key { - key: egui_key, - physical_key: None, // TODO(fornwall) + key: active_key, + physical_key, pressed: true, repeat: false, // egui will fill this in for us! modifiers, @@ -213,11 +216,11 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner) runner.input.raw.events.push(egui_event); runner.needs_repaint.repaint_asap(); - let prevent_default = should_prevent_default_for_key(runner, &modifiers, egui_key); + let prevent_default = should_prevent_default_for_key(runner, &modifiers, active_key); if false { log::debug!( - "On keydown {:?} {egui_key:?}, has_focus: {has_focus}, egui_wants_keyboard: {}, prevent_default: {prevent_default}", + "On keydown {:?} {active_key:?}, has_focus: {has_focus}, egui_wants_keyboard: {}, prevent_default: {prevent_default}", event.key().as_str(), runner.egui_ctx().egui_wants_keyboard_input() ); @@ -291,10 +294,13 @@ pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) { let mut should_stop_propagation = true; - if let Some(key) = translate_key(&event.key()) { + let logical_key = translate_key(&event.key()); + let physical_key = translate_key(&event.code()); + + if let Some(active_key) = logical_key.or(physical_key) { let egui_event = egui::Event::Key { - key, - physical_key: None, // TODO(fornwall) + key: active_key, + physical_key, pressed: false, repeat: false, modifiers, diff --git a/crates/egui/src/data/key.rs b/crates/egui/src/data/key.rs index 805379f17..41d654fb7 100644 --- a/crates/egui/src/data/key.rs +++ b/crates/egui/src/data/key.rs @@ -384,7 +384,7 @@ impl Key { "Escape" | "Esc" => Self::Escape, "Tab" => Self::Tab, "Backspace" => Self::Backspace, - "Enter" | "Return" => Self::Enter, + "Enter" | "Return" | "NumpadEnter" => Self::Enter, "Help" | "Insert" => Self::Insert, "Delete" => Self::Delete, @@ -399,19 +399,19 @@ impl Key { " " | "Space" => Self::Space, ":" | "Colon" => Self::Colon, - "," | "Comma" => Self::Comma, - "-" | "−" | "Minus" => Self::Minus, - "." | "Period" => Self::Period, - "+" | "Plus" => Self::Plus, + "," | "Comma" | "NumpadComma" => Self::Comma, + "-" | "−" | "Minus" | "NumpadSubtract" => Self::Minus, + "." | "Period" | "NumpadDecimal" => Self::Period, + "+" | "Plus" | "NumpadAdd" => Self::Plus, "=" | "Equal" | "Equals" | "NumpadEqual" => Self::Equals, ";" | "Semicolon" => Self::Semicolon, "\\" | "Backslash" => Self::Backslash, - "/" | "Slash" => Self::Slash, + "/" | "Slash" | "NumpadDivide" => Self::Slash, "|" | "Pipe" => Self::Pipe, "?" | "Questionmark" => Self::Questionmark, "!" | "Exclamationmark" => Self::Exclamationmark, - "[" | "OpenBracket" => Self::OpenBracket, - "]" | "CloseBracket" => Self::CloseBracket, + "[" | "OpenBracket" | "BracketLeft" => Self::OpenBracket, + "]" | "CloseBracket" | "BracketRight" => Self::CloseBracket, "{" | "OpenCurlyBracket" => Self::OpenCurlyBracket, "}" | "CloseCurlyBracket" => Self::CloseCurlyBracket, "`" | "Backtick" | "Backquote" | "Grave" => Self::Backtick, @@ -428,32 +428,32 @@ impl Key { "8" | "Digit8" | "Numpad8" => Self::Num8, "9" | "Digit9" | "Numpad9" => Self::Num9, - "a" | "A" => Self::A, - "b" | "B" => Self::B, - "c" | "C" => Self::C, - "d" | "D" => Self::D, - "e" | "E" => Self::E, - "f" | "F" => Self::F, - "g" | "G" => Self::G, - "h" | "H" => Self::H, - "i" | "I" => Self::I, - "j" | "J" => Self::J, - "k" | "K" => Self::K, - "l" | "L" => Self::L, - "m" | "M" => Self::M, - "n" | "N" => Self::N, - "o" | "O" => Self::O, - "p" | "P" => Self::P, - "q" | "Q" => Self::Q, - "r" | "R" => Self::R, - "s" | "S" => Self::S, - "t" | "T" => Self::T, - "u" | "U" => Self::U, - "v" | "V" => Self::V, - "w" | "W" => Self::W, - "x" | "X" => Self::X, - "y" | "Y" => Self::Y, - "z" | "Z" => Self::Z, + "a" | "A" | "KeyA" => Self::A, + "b" | "B" | "KeyB" => Self::B, + "c" | "C" | "KeyC" => Self::C, + "d" | "D" | "KeyD" => Self::D, + "e" | "E" | "KeyE" => Self::E, + "f" | "F" | "KeyF" => Self::F, + "g" | "G" | "KeyG" => Self::G, + "h" | "H" | "KeyH" => Self::H, + "i" | "I" | "KeyI" => Self::I, + "j" | "J" | "KeyJ" => Self::J, + "k" | "K" | "KeyK" => Self::K, + "l" | "L" | "KeyL" => Self::L, + "m" | "M" | "KeyM" => Self::M, + "n" | "N" | "KeyN" => Self::N, + "o" | "O" | "KeyO" => Self::O, + "p" | "P" | "KeyP" => Self::P, + "q" | "Q" | "KeyQ" => Self::Q, + "r" | "R" | "KeyR" => Self::R, + "s" | "S" | "KeyS" => Self::S, + "t" | "T" | "KeyT" => Self::T, + "u" | "U" | "KeyU" => Self::U, + "v" | "V" | "KeyV" => Self::V, + "w" | "W" | "KeyW" => Self::W, + "x" | "X" | "KeyX" => Self::X, + "y" | "Y" | "KeyY" => Self::Y, + "z" | "Z" | "KeyZ" => Self::Z, "F1" => Self::F1, "F2" => Self::F2, @@ -499,8 +499,9 @@ impl Key { "ControlRight" => Self::ControlRight, "AltLeft" => Self::AltLeft, "AltRight" => Self::AltRight, - "SuperLeft" => Self::SuperLeft, - "SuperRight" => Self::SuperRight, + + "SuperLeft" | "MetaLeft" | "OSLeft" => Self::SuperLeft, + "SuperRight" | "MetaRight" | "OSRight" => Self::SuperRight, "IntlBackslash" => Self::IntlBackslash,