From d282272f9d76fb26a44577c7b02f3ede35cbf4f2 Mon Sep 17 00:00:00 2001
From: Nikita Vilunov
Date: Tue, 19 Aug 2025 01:14:43 +0200
Subject: [PATCH] Fix virtual keyboard code mapping on macos
---
src/native/apple/apple_util.rs | 40 +++++++++++++++++++---------------
1 file changed, 22 insertions(+), 18 deletions(-)
diff --git a/src/native/apple/apple_util.rs b/src/native/apple/apple_util.rs
index 4b1973cc..3eee75e4 100644
--- a/src/native/apple/apple_util.rs
+++ b/src/native/apple/apple_util.rs
@@ -152,6 +152,8 @@ pub fn get_event_key_modifier(event: ObjcId) -> KeyMods {
pub fn get_event_keycode(event: ObjcId) -> Option {
let scan_code: core::ffi::c_ushort = unsafe { msg_send![event, keyCode] };
+ // Check mapping here
+ // https://boredzo.org/blog/archives/2007-05-22/virtual-key-codes
Some(match scan_code {
0x00 => KeyCode::A,
0x01 => KeyCode::S,
@@ -195,7 +197,7 @@ pub fn get_event_keycode(event: ObjcId) -> Option {
0x27 => KeyCode::Apostrophe,
0x28 => KeyCode::K,
0x29 => KeyCode::Semicolon,
- 0x2a => KeyCode::Apostrophe,
+ 0x2a => KeyCode::Backslash,
0x2b => KeyCode::Comma,
0x2c => KeyCode::Slash,
0x2d => KeyCode::N,
@@ -203,7 +205,7 @@ pub fn get_event_keycode(event: ObjcId) -> Option {
0x2f => KeyCode::Period,
0x30 => KeyCode::Tab,
0x31 => KeyCode::Space,
- 0x32 => KeyCode::Backslash,
+ 0x32 => KeyCode::GraveAccent,
0x33 => KeyCode::Backspace,
//0x34 => unkown,
0x35 => KeyCode::Escape,
@@ -290,7 +292,8 @@ pub fn get_event_keycode(event: ObjcId) -> Option {
pub fn keycode_to_menu_key(keycode: KeyCode, shift: bool) -> &'static str {
if !shift {
match keycode {
- KeyCode::Apostrophe => "`",
+ KeyCode::GraveAccent => "`",
+ KeyCode::Apostrophe => "'",
KeyCode::Key0 => "0",
KeyCode::Key1 => "1",
KeyCode::Key2 => "2",
@@ -343,19 +346,20 @@ pub fn keycode_to_menu_key(keycode: KeyCode, shift: bool) -> &'static str {
}
} else {
match keycode {
- //KeyCode::Backtick => "~",
- KeyCode::Key0 => "!",
- KeyCode::Key1 => "@",
- KeyCode::Key2 => "#",
- KeyCode::Key3 => "$",
- KeyCode::Key4 => "%",
- KeyCode::Key5 => "^",
- KeyCode::Key6 => "&",
- KeyCode::Key7 => "*",
- KeyCode::Key8 => "(",
- KeyCode::Key9 => ")",
+ KeyCode::GraveAccent => "~",
+ KeyCode::Apostrophe => "\"",
+ KeyCode::Key0 => ")",
+ KeyCode::Key1 => "!",
+ KeyCode::Key2 => "@",
+ KeyCode::Key3 => "#",
+ KeyCode::Key4 => "$",
+ KeyCode::Key5 => "%",
+ KeyCode::Key6 => "^",
+ KeyCode::Key7 => "&",
+ KeyCode::Key8 => "*",
+ KeyCode::Key9 => "(",
KeyCode::Minus => "_",
- KeyCode::Equal => "=",
+ KeyCode::Equal => "+",
KeyCode::Q => "Q",
KeyCode::W => "W",
@@ -380,7 +384,7 @@ pub fn keycode_to_menu_key(keycode: KeyCode, shift: bool) -> &'static str {
KeyCode::K => "K",
KeyCode::L => "L",
KeyCode::Semicolon => ":",
- KeyCode::Slash => "\"",
+ KeyCode::Slash => "?",
KeyCode::Backslash => "|",
KeyCode::Z => "Z",
@@ -390,8 +394,8 @@ pub fn keycode_to_menu_key(keycode: KeyCode, shift: bool) -> &'static str {
KeyCode::B => "B",
KeyCode::N => "N",
KeyCode::M => "M",
- KeyCode::Comma => ",",
- KeyCode::Period => ".k",
+ KeyCode::Comma => "<",
+ KeyCode::Period => ">",
_ => "",
}
}