Skip to content

Commit 0acf3d8

Browse files
emilkhacknus
authored andcommitted
eframe web: Fix stuck keys after pressing ctrl+C, cmd+A, etc (emilk#4731)
* Closes emilk#4724
1 parent 43aeab8 commit 0acf3d8

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

crates/eframe/src/web/events.rs

+20
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ fn install_keyup(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), JsV
244244
pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) {
245245
let modifiers = modifiers_from_kb_event(&event);
246246
runner.input.raw.modifiers = modifiers;
247+
247248
if let Some(key) = translate_key(&event.key()) {
248249
runner.input.raw.events.push(egui::Event::Key {
249250
key,
@@ -253,6 +254,25 @@ pub(crate) fn on_keyup(event: web_sys::KeyboardEvent, runner: &mut AppRunner) {
253254
modifiers,
254255
});
255256
}
257+
258+
if event.key() == "Meta" || event.key() == "Control" {
259+
// When pressing Cmd+A (select all) or Ctrl+C (copy),
260+
// chromium will not fire a `keyup` for the letter key.
261+
// This leads to stuck keys, unless we do this hack.
262+
// See https://github.com/emilk/egui/issues/4724
263+
264+
let keys_down = runner.egui_ctx().input(|i| i.keys_down.clone());
265+
for key in keys_down {
266+
runner.input.raw.events.push(egui::Event::Key {
267+
key,
268+
physical_key: None,
269+
pressed: false,
270+
repeat: false,
271+
modifiers,
272+
});
273+
}
274+
}
275+
256276
runner.needs_repaint.repaint_asap();
257277

258278
let has_focus = runner.input.raw.focused;

0 commit comments

Comments
 (0)