From 2a651b445048a0d81d0035998b6ef19140bf7cbf Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Tue, 27 Oct 2020 16:22:56 +0100 Subject: [PATCH] Fix WindowEvent::ReceivedCharacter on web The event was never sent to the application because of the unconditional preventDefault() call on keydown. Fixes #1741 --- CHANGELOG.md | 1 + src/platform_impl/web/stdweb/canvas.rs | 6 +++++- src/platform_impl/web/web_sys/canvas.rs | 6 +++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f75ec13d64..afd52da6b70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - On Wayland, fix window not being resizeable when using `with_min_inner_size` in `WindowBuilder`. - On Unix, fix cross-compiling to wasm32 without enabling X11 or Wayland. - On Windows, fix use after free crash during window destruction. +- On Web, fix `WindowEvent::ReceivedCharacter` never being send on key input. # 0.23.0 (2020-10-02) diff --git a/src/platform_impl/web/stdweb/canvas.rs b/src/platform_impl/web/stdweb/canvas.rs index cd952abe350..3204d014e49 100644 --- a/src/platform_impl/web/stdweb/canvas.rs +++ b/src/platform_impl/web/stdweb/canvas.rs @@ -122,7 +122,11 @@ impl Canvas { F: 'static + FnMut(ScanCode, Option, ModifiersState), { self.on_keyboard_release = Some(self.add_user_event(move |event: KeyUpEvent| { - event.prevent_default(); + let event_key = &event.key(); + let is_key_string = event_key.len() == 1 || !event_key.is_ascii(); + if !is_key_string { + event.prevent_default(); + } handler( event::scan_code(&event), event::virtual_key_code(&event), diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index 46d95311571..eb3a7c52159 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -157,7 +157,11 @@ impl Canvas { self.on_keyboard_press = Some(self.common.add_user_event( "keydown", move |event: KeyboardEvent| { - event.prevent_default(); + let event_key = &event.key(); + let is_key_string = event_key.len() == 1 || !event_key.is_ascii(); + if !is_key_string { + event.prevent_default(); + } handler( event::scan_code(&event), event::virtual_key_code(&event),