From 7258df115dc1bda96a64b39e511a32e322d5b842 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Sun, 1 Dec 2024 17:39:09 +0100 Subject: [PATCH] macOS: Align scancode conversions with Chromium and Firefox --- src/changelog/unreleased.md | 3 ++ src/platform_impl/apple/appkit/event.rs | 50 ++++++++++++++----------- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/changelog/unreleased.md b/src/changelog/unreleased.md index 4e91f91773..fd1aa75e97 100644 --- a/src/changelog/unreleased.md +++ b/src/changelog/unreleased.md @@ -75,6 +75,7 @@ changelog entry. variables to test the respective modifiers of window creation. - Added `Window::surface_position`, which is the position of the surface inside the window. - Added `Window::safe_area`, which describes the area of the surface that is unobstructed. +- On macOS, improved scancode conversions for more obscure key codes. ### Changed @@ -206,3 +207,5 @@ changelog entry. - On X11, creating windows while passing `with_x11_screen(non_default_screen)` works again. - On X11, fix XInput handling that prevented a new window from getting the focus in some cases. - On iOS, fixed `SurfaceResized` and `Window::surface_size` not reporting the size of the actual surface. +- On macOS, fixed the scancode conversion for audio volume keys. +- On macOS, fixed the scancode conversion for `IntlBackslash`. diff --git a/src/platform_impl/apple/appkit/event.rs b/src/platform_impl/apple/appkit/event.rs index f71111b67f..e9c6d0d97a 100644 --- a/src/platform_impl/apple/appkit/event.rs +++ b/src/platform_impl/apple/appkit/event.rs @@ -377,6 +377,7 @@ pub(crate) fn physicalkey_to_scancode(physical_key: PhysicalKey) -> Option KeyCode::KeyX => Some(0x07), KeyCode::KeyC => Some(0x08), KeyCode::KeyV => Some(0x09), + KeyCode::IntlBackslash => Some(0x0a), KeyCode::KeyB => Some(0x0b), KeyCode::KeyQ => Some(0x0c), KeyCode::KeyW => Some(0x0d), @@ -432,8 +433,9 @@ pub(crate) fn physicalkey_to_scancode(physical_key: PhysicalKey) -> Option KeyCode::NumpadMultiply => Some(0x43), KeyCode::NumpadAdd => Some(0x45), KeyCode::NumLock => Some(0x47), - KeyCode::AudioVolumeUp => Some(0x49), - KeyCode::AudioVolumeDown => Some(0x4a), + KeyCode::AudioVolumeUp => Some(0x48), + KeyCode::AudioVolumeDown => Some(0x49), + KeyCode::AudioVolumeMute => Some(0x4a), KeyCode::NumpadDivide => Some(0x4b), KeyCode::NumpadEnter => Some(0x4c), KeyCode::NumpadSubtract => Some(0x4e), @@ -452,17 +454,22 @@ pub(crate) fn physicalkey_to_scancode(physical_key: PhysicalKey) -> Option KeyCode::Numpad8 => Some(0x5b), KeyCode::Numpad9 => Some(0x5c), KeyCode::IntlYen => Some(0x5d), + KeyCode::IntlRo => Some(0x5e), + KeyCode::NumpadComma => Some(0x5f), KeyCode::F5 => Some(0x60), KeyCode::F6 => Some(0x61), KeyCode::F7 => Some(0x62), KeyCode::F3 => Some(0x63), KeyCode::F8 => Some(0x64), KeyCode::F9 => Some(0x65), + KeyCode::Lang2 => Some(0x66), KeyCode::F11 => Some(0x67), + KeyCode::Lang1 => Some(0x68), KeyCode::F13 => Some(0x69), KeyCode::F16 => Some(0x6a), KeyCode::F14 => Some(0x6b), KeyCode::F10 => Some(0x6d), + KeyCode::ContextMenu => Some(0x6e), KeyCode::F12 => Some(0x6f), KeyCode::F15 => Some(0x71), KeyCode::Insert => Some(0x72), @@ -483,6 +490,12 @@ pub(crate) fn physicalkey_to_scancode(physical_key: PhysicalKey) -> Option } pub(crate) fn scancode_to_physicalkey(scancode: u32) -> PhysicalKey { + // Follows what Chromium and Firefox do: + // https://chromium.googlesource.com/chromium/src.git/+/3e1a26c44c024d97dc9a4c09bbc6a2365398ca2c/ui/events/keycodes/dom/dom_code_data.inc + // https://searchfox.org/mozilla-central/rev/c597e9c789ad36af84a0370d395be066b7dc94f4/widget/NativeKeyToDOMCodeName.h + // + // See also: + // Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h PhysicalKey::Code(match scancode { 0x00 => KeyCode::KeyA, 0x01 => KeyCode::KeyS, @@ -494,7 +507,11 @@ pub(crate) fn scancode_to_physicalkey(scancode: u32) -> PhysicalKey { 0x07 => KeyCode::KeyX, 0x08 => KeyCode::KeyC, 0x09 => KeyCode::KeyV, - // 0x0a => World 1, + // This key is typically located near LeftShift key, roughly the same location as backquote + // (`) on Windows' US layout. + // + // The keycap varies on international keyboards. + 0x0a => KeyCode::IntlBackslash, 0x0b => KeyCode::KeyB, 0x0c => KeyCode::KeyQ, 0x0d => KeyCode::KeyW, @@ -536,7 +553,7 @@ pub(crate) fn scancode_to_physicalkey(scancode: u32) -> PhysicalKey { 0x31 => KeyCode::Space, 0x32 => KeyCode::Backquote, 0x33 => KeyCode::Backspace, - // 0x34 => unknown, + // 0x34 => unknown, // kVK_Powerbook_KeypadEnter 0x35 => KeyCode::Escape, 0x36 => KeyCode::SuperRight, 0x37 => KeyCode::SuperLeft, @@ -556,14 +573,9 @@ pub(crate) fn scancode_to_physicalkey(scancode: u32) -> PhysicalKey { 0x45 => KeyCode::NumpadAdd, // 0x46 => unknown, 0x47 => KeyCode::NumLock, - // 0x48 => KeyCode::NumpadClear, - - // TODO: (Artur) for me, kVK_VolumeUp is 0x48 - // macOS 10.11 - // /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/ - // Versions/A/Headers/Events.h - 0x49 => KeyCode::AudioVolumeUp, - 0x4a => KeyCode::AudioVolumeDown, + 0x48 => KeyCode::AudioVolumeUp, + 0x49 => KeyCode::AudioVolumeDown, + 0x4a => KeyCode::AudioVolumeMute, 0x4b => KeyCode::NumpadDivide, 0x4c => KeyCode::NumpadEnter, // 0x4d => unknown, @@ -583,23 +595,23 @@ pub(crate) fn scancode_to_physicalkey(scancode: u32) -> PhysicalKey { 0x5b => KeyCode::Numpad8, 0x5c => KeyCode::Numpad9, 0x5d => KeyCode::IntlYen, - // 0x5e => JIS Ro, - // 0x5f => unknown, + 0x5e => KeyCode::IntlRo, + 0x5f => KeyCode::NumpadComma, 0x60 => KeyCode::F5, 0x61 => KeyCode::F6, 0x62 => KeyCode::F7, 0x63 => KeyCode::F3, 0x64 => KeyCode::F8, 0x65 => KeyCode::F9, - // 0x66 => JIS Eisuu (macOS), + 0x66 => KeyCode::Lang2, 0x67 => KeyCode::F11, - // 0x68 => JIS Kanna (macOS), + 0x68 => KeyCode::Lang1, 0x69 => KeyCode::F13, 0x6a => KeyCode::F16, 0x6b => KeyCode::F14, // 0x6c => unknown, 0x6d => KeyCode::F10, - // 0x6e => unknown, + 0x6e => KeyCode::ContextMenu, 0x6f => KeyCode::F12, // 0x70 => unknown, 0x71 => KeyCode::F15, @@ -617,10 +629,6 @@ pub(crate) fn scancode_to_physicalkey(scancode: u32) -> PhysicalKey { 0x7d => KeyCode::ArrowDown, 0x7e => KeyCode::ArrowUp, // 0x7f => unknown, - - // 0xA is the caret (^) an macOS's German QERTZ layout. This key is at the same location as - // backquote (`) on Windows' US layout. - 0xa => KeyCode::Backquote, _ => return PhysicalKey::Unidentified(NativeKeyCode::MacOS(scancode as u16)), }) }