mirror of
https://github.com/emilk/egui.git
synced 2026-08-29 04:40:03 -04:00
Fix missing modifier events on eframe web, handle physical keys (#8345)
* realized pressing just modifiers cause no key events on eframe web when testing https://github.com/emilk/egui/pull/8336 * closes https://github.com/emilk/egui/issues/8308 * part of #3653
This commit is contained in:
@@ -199,12 +199,15 @@ pub(crate) fn on_keydown(event: web_sys::KeyboardEvent, runner: &mut AppRunner)
|
|||||||
runner.input.set_modifiers(modifiers);
|
runner.input.set_modifiers(modifiers);
|
||||||
|
|
||||||
let key = event.key();
|
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 {
|
let egui_event = egui::Event::Key {
|
||||||
key: egui_key,
|
key: active_key,
|
||||||
physical_key: None, // TODO(fornwall)
|
physical_key,
|
||||||
pressed: true,
|
pressed: true,
|
||||||
repeat: false, // egui will fill this in for us!
|
repeat: false, // egui will fill this in for us!
|
||||||
modifiers,
|
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.input.raw.events.push(egui_event);
|
||||||
runner.needs_repaint.repaint_asap();
|
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 {
|
if false {
|
||||||
log::debug!(
|
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(),
|
event.key().as_str(),
|
||||||
runner.egui_ctx().egui_wants_keyboard_input()
|
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;
|
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 {
|
let egui_event = egui::Event::Key {
|
||||||
key,
|
key: active_key,
|
||||||
physical_key: None, // TODO(fornwall)
|
physical_key,
|
||||||
pressed: false,
|
pressed: false,
|
||||||
repeat: false,
|
repeat: false,
|
||||||
modifiers,
|
modifiers,
|
||||||
|
|||||||
@@ -384,7 +384,7 @@ impl Key {
|
|||||||
"Escape" | "Esc" => Self::Escape,
|
"Escape" | "Esc" => Self::Escape,
|
||||||
"Tab" => Self::Tab,
|
"Tab" => Self::Tab,
|
||||||
"Backspace" => Self::Backspace,
|
"Backspace" => Self::Backspace,
|
||||||
"Enter" | "Return" => Self::Enter,
|
"Enter" | "Return" | "NumpadEnter" => Self::Enter,
|
||||||
|
|
||||||
"Help" | "Insert" => Self::Insert,
|
"Help" | "Insert" => Self::Insert,
|
||||||
"Delete" => Self::Delete,
|
"Delete" => Self::Delete,
|
||||||
@@ -399,19 +399,19 @@ impl Key {
|
|||||||
|
|
||||||
" " | "Space" => Self::Space,
|
" " | "Space" => Self::Space,
|
||||||
":" | "Colon" => Self::Colon,
|
":" | "Colon" => Self::Colon,
|
||||||
"," | "Comma" => Self::Comma,
|
"," | "Comma" | "NumpadComma" => Self::Comma,
|
||||||
"-" | "−" | "Minus" => Self::Minus,
|
"-" | "−" | "Minus" | "NumpadSubtract" => Self::Minus,
|
||||||
"." | "Period" => Self::Period,
|
"." | "Period" | "NumpadDecimal" => Self::Period,
|
||||||
"+" | "Plus" => Self::Plus,
|
"+" | "Plus" | "NumpadAdd" => Self::Plus,
|
||||||
"=" | "Equal" | "Equals" | "NumpadEqual" => Self::Equals,
|
"=" | "Equal" | "Equals" | "NumpadEqual" => Self::Equals,
|
||||||
";" | "Semicolon" => Self::Semicolon,
|
";" | "Semicolon" => Self::Semicolon,
|
||||||
"\\" | "Backslash" => Self::Backslash,
|
"\\" | "Backslash" => Self::Backslash,
|
||||||
"/" | "Slash" => Self::Slash,
|
"/" | "Slash" | "NumpadDivide" => Self::Slash,
|
||||||
"|" | "Pipe" => Self::Pipe,
|
"|" | "Pipe" => Self::Pipe,
|
||||||
"?" | "Questionmark" => Self::Questionmark,
|
"?" | "Questionmark" => Self::Questionmark,
|
||||||
"!" | "Exclamationmark" => Self::Exclamationmark,
|
"!" | "Exclamationmark" => Self::Exclamationmark,
|
||||||
"[" | "OpenBracket" => Self::OpenBracket,
|
"[" | "OpenBracket" | "BracketLeft" => Self::OpenBracket,
|
||||||
"]" | "CloseBracket" => Self::CloseBracket,
|
"]" | "CloseBracket" | "BracketRight" => Self::CloseBracket,
|
||||||
"{" | "OpenCurlyBracket" => Self::OpenCurlyBracket,
|
"{" | "OpenCurlyBracket" => Self::OpenCurlyBracket,
|
||||||
"}" | "CloseCurlyBracket" => Self::CloseCurlyBracket,
|
"}" | "CloseCurlyBracket" => Self::CloseCurlyBracket,
|
||||||
"`" | "Backtick" | "Backquote" | "Grave" => Self::Backtick,
|
"`" | "Backtick" | "Backquote" | "Grave" => Self::Backtick,
|
||||||
@@ -428,32 +428,32 @@ impl Key {
|
|||||||
"8" | "Digit8" | "Numpad8" => Self::Num8,
|
"8" | "Digit8" | "Numpad8" => Self::Num8,
|
||||||
"9" | "Digit9" | "Numpad9" => Self::Num9,
|
"9" | "Digit9" | "Numpad9" => Self::Num9,
|
||||||
|
|
||||||
"a" | "A" => Self::A,
|
"a" | "A" | "KeyA" => Self::A,
|
||||||
"b" | "B" => Self::B,
|
"b" | "B" | "KeyB" => Self::B,
|
||||||
"c" | "C" => Self::C,
|
"c" | "C" | "KeyC" => Self::C,
|
||||||
"d" | "D" => Self::D,
|
"d" | "D" | "KeyD" => Self::D,
|
||||||
"e" | "E" => Self::E,
|
"e" | "E" | "KeyE" => Self::E,
|
||||||
"f" | "F" => Self::F,
|
"f" | "F" | "KeyF" => Self::F,
|
||||||
"g" | "G" => Self::G,
|
"g" | "G" | "KeyG" => Self::G,
|
||||||
"h" | "H" => Self::H,
|
"h" | "H" | "KeyH" => Self::H,
|
||||||
"i" | "I" => Self::I,
|
"i" | "I" | "KeyI" => Self::I,
|
||||||
"j" | "J" => Self::J,
|
"j" | "J" | "KeyJ" => Self::J,
|
||||||
"k" | "K" => Self::K,
|
"k" | "K" | "KeyK" => Self::K,
|
||||||
"l" | "L" => Self::L,
|
"l" | "L" | "KeyL" => Self::L,
|
||||||
"m" | "M" => Self::M,
|
"m" | "M" | "KeyM" => Self::M,
|
||||||
"n" | "N" => Self::N,
|
"n" | "N" | "KeyN" => Self::N,
|
||||||
"o" | "O" => Self::O,
|
"o" | "O" | "KeyO" => Self::O,
|
||||||
"p" | "P" => Self::P,
|
"p" | "P" | "KeyP" => Self::P,
|
||||||
"q" | "Q" => Self::Q,
|
"q" | "Q" | "KeyQ" => Self::Q,
|
||||||
"r" | "R" => Self::R,
|
"r" | "R" | "KeyR" => Self::R,
|
||||||
"s" | "S" => Self::S,
|
"s" | "S" | "KeyS" => Self::S,
|
||||||
"t" | "T" => Self::T,
|
"t" | "T" | "KeyT" => Self::T,
|
||||||
"u" | "U" => Self::U,
|
"u" | "U" | "KeyU" => Self::U,
|
||||||
"v" | "V" => Self::V,
|
"v" | "V" | "KeyV" => Self::V,
|
||||||
"w" | "W" => Self::W,
|
"w" | "W" | "KeyW" => Self::W,
|
||||||
"x" | "X" => Self::X,
|
"x" | "X" | "KeyX" => Self::X,
|
||||||
"y" | "Y" => Self::Y,
|
"y" | "Y" | "KeyY" => Self::Y,
|
||||||
"z" | "Z" => Self::Z,
|
"z" | "Z" | "KeyZ" => Self::Z,
|
||||||
|
|
||||||
"F1" => Self::F1,
|
"F1" => Self::F1,
|
||||||
"F2" => Self::F2,
|
"F2" => Self::F2,
|
||||||
@@ -499,8 +499,9 @@ impl Key {
|
|||||||
"ControlRight" => Self::ControlRight,
|
"ControlRight" => Self::ControlRight,
|
||||||
"AltLeft" => Self::AltLeft,
|
"AltLeft" => Self::AltLeft,
|
||||||
"AltRight" => Self::AltRight,
|
"AltRight" => Self::AltRight,
|
||||||
"SuperLeft" => Self::SuperLeft,
|
|
||||||
"SuperRight" => Self::SuperRight,
|
"SuperLeft" | "MetaLeft" | "OSLeft" => Self::SuperLeft,
|
||||||
|
"SuperRight" | "MetaRight" | "OSRight" => Self::SuperRight,
|
||||||
|
|
||||||
"IntlBackslash" => Self::IntlBackslash,
|
"IntlBackslash" => Self::IntlBackslash,
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user