[PATCH v3] ui/cocoa: Use qemu_input_map_osx_to_linux

Akihiko Odaki posted 1 patch 3 days, 14 hours ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260604-osx-v3-1-453b4ee0e072@rsg.ci.i.u-tokyo.ac.jp
Maintainers: Peter Maydell <peter.maydell@linaro.org>, "Philippe Mathieu-Daudé" <philmd@mailo.com>, Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>, "Marc-André Lureau" <marcandre.lureau@redhat.com>
ui/cocoa.m | 131 ++-----------------------------------------------------------
1 file changed, 3 insertions(+), 128 deletions(-)
[PATCH v3] ui/cocoa: Use qemu_input_map_osx_to_linux
Posted by Akihiko Odaki 3 days, 14 hours ago
ui/cocoa used to have a conversion table from macOS keycode to Linux
key code. It is an unnecessary redundancy as ui/input-keymap.c already
has such a table. Worse, I added an incorrect mapping of kVK_JIS_Eisu and
kVK_JIS_Kana with commit 708b72557ff5 ("ui/cocoa: Support unique keys of
JIS keyboards").

According to the following documentations, the definitions in
ui/keycodemapdb/keymaps.csv, which ui/input-keymap.c uses, are correct:
https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang1?language=objc
https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang2?language=objc
https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/keyboard-japan-ime

Use qemu_input_map_osx_to_linux to eliminate the redundancy and
incorrect mappings.

Fixes: 708b72557ff5 ("ui/cocoa: Support unique keys of JIS keyboards")
Signed-off-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
---
ui/cocoa used to have a conversion table from macOS keycode to Linux
key code. It is an unnecessary redundancy as ui/input-keymap.c already
has such a table. Worse, I added an incorrect mapping of kVK_JIS_Eisu and
kVK_JIS_Kana with commit 708b72557ff5 ("ui/cocoa: Support unique keys of
JIS keyboards").

According to the following documentations, the definitions in
ui/keycodemapdb/keymaps.csv, which ui/input-keymap.c uses, are correct:
https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang1?language=objc
https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang2?language=objc
https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/keyboard-japan-ime

Use qemu_input_map_osx_to_linux to eliminate the redundancy and
incorrect mappings.
---
Changes in v3:
- Rebased.
- Link to v2: https://lore.kernel.org/r/20250115-osx-v2-1-ac3b38d91174@daynix.com
---
 ui/cocoa.m | 131 ++-----------------------------------------------------------
 1 file changed, 3 insertions(+), 128 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index c5e639ab98d6..e157ad01d851 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -141,138 +141,13 @@ static bool bool_with_bql(BoolCodeBlock block)
     return val;
 }
 
-// Mac to Linux conversion
-static const unsigned int mac_to_linux_map[] = {
-    [kVK_ANSI_A] = KEY_A,
-    [kVK_ANSI_B] = KEY_B,
-    [kVK_ANSI_C] = KEY_C,
-    [kVK_ANSI_D] = KEY_D,
-    [kVK_ANSI_E] = KEY_E,
-    [kVK_ANSI_F] = KEY_F,
-    [kVK_ANSI_G] = KEY_G,
-    [kVK_ANSI_H] = KEY_H,
-    [kVK_ANSI_I] = KEY_I,
-    [kVK_ANSI_J] = KEY_J,
-    [kVK_ANSI_K] = KEY_K,
-    [kVK_ANSI_L] = KEY_L,
-    [kVK_ANSI_M] = KEY_M,
-    [kVK_ANSI_N] = KEY_N,
-    [kVK_ANSI_O] = KEY_O,
-    [kVK_ANSI_P] = KEY_P,
-    [kVK_ANSI_Q] = KEY_Q,
-    [kVK_ANSI_R] = KEY_R,
-    [kVK_ANSI_S] = KEY_S,
-    [kVK_ANSI_T] = KEY_T,
-    [kVK_ANSI_U] = KEY_U,
-    [kVK_ANSI_V] = KEY_V,
-    [kVK_ANSI_W] = KEY_W,
-    [kVK_ANSI_X] = KEY_X,
-    [kVK_ANSI_Y] = KEY_Y,
-    [kVK_ANSI_Z] = KEY_Z,
-
-    [kVK_ANSI_0] = KEY_0,
-    [kVK_ANSI_1] = KEY_1,
-    [kVK_ANSI_2] = KEY_2,
-    [kVK_ANSI_3] = KEY_3,
-    [kVK_ANSI_4] = KEY_4,
-    [kVK_ANSI_5] = KEY_5,
-    [kVK_ANSI_6] = KEY_6,
-    [kVK_ANSI_7] = KEY_7,
-    [kVK_ANSI_8] = KEY_8,
-    [kVK_ANSI_9] = KEY_9,
-
-    [kVK_ANSI_Grave] = KEY_GRAVE,
-    [kVK_ANSI_Minus] = KEY_MINUS,
-    [kVK_ANSI_Equal] = KEY_EQUAL,
-    [kVK_Delete] = KEY_BACKSPACE,
-    [kVK_CapsLock] = KEY_CAPSLOCK,
-    [kVK_Tab] = KEY_TAB,
-    [kVK_Return] = KEY_ENTER,
-    [kVK_ANSI_LeftBracket] = KEY_LEFTBRACE,
-    [kVK_ANSI_RightBracket] = KEY_RIGHTBRACE,
-    [kVK_ANSI_Backslash] = KEY_BACKSLASH,
-    [kVK_ANSI_Semicolon] = KEY_SEMICOLON,
-    [kVK_ANSI_Quote] = KEY_APOSTROPHE,
-    [kVK_ANSI_Comma] = KEY_COMMA,
-    [kVK_ANSI_Period] = KEY_DOT,
-    [kVK_ANSI_Slash] = KEY_SLASH,
-    [kVK_Space] = KEY_SPACE,
-
-    [kVK_ANSI_Keypad0] = KEY_KP0,
-    [kVK_ANSI_Keypad1] = KEY_KP1,
-    [kVK_ANSI_Keypad2] = KEY_KP2,
-    [kVK_ANSI_Keypad3] = KEY_KP3,
-    [kVK_ANSI_Keypad4] = KEY_KP4,
-    [kVK_ANSI_Keypad5] = KEY_KP5,
-    [kVK_ANSI_Keypad6] = KEY_KP6,
-    [kVK_ANSI_Keypad7] = KEY_KP7,
-    [kVK_ANSI_Keypad8] = KEY_KP8,
-    [kVK_ANSI_Keypad9] = KEY_KP9,
-    [kVK_ANSI_KeypadDecimal] = KEY_KPDOT,
-    [kVK_ANSI_KeypadEnter] = KEY_KPENTER,
-    [kVK_ANSI_KeypadPlus] = KEY_KPPLUS,
-    [kVK_ANSI_KeypadMinus] = KEY_KPMINUS,
-    [kVK_ANSI_KeypadMultiply] = KEY_KPASTERISK,
-    [kVK_ANSI_KeypadDivide] = KEY_KPSLASH,
-    [kVK_ANSI_KeypadEquals] = KEY_KPEQUAL,
-    [kVK_ANSI_KeypadClear] = KEY_NUMLOCK,
-
-    [kVK_UpArrow] = KEY_UP,
-    [kVK_DownArrow] = KEY_DOWN,
-    [kVK_LeftArrow] = KEY_LEFT,
-    [kVK_RightArrow] = KEY_RIGHT,
-
-    [kVK_Help] = KEY_INSERT,
-    [kVK_Home] = KEY_HOME,
-    [kVK_PageUp] = KEY_PAGEUP,
-    [kVK_PageDown] = KEY_PAGEDOWN,
-    [kVK_End] = KEY_END,
-    [kVK_ForwardDelete] = KEY_DELETE,
-
-    [kVK_Escape] = KEY_ESC,
-
-    /* The Power key can't be used directly because the operating system uses
-     * it. This key can be emulated by using it in place of another key such as
-     * F1. Don't forget to disable the real key binding.
-     */
-    /* [kVK_F1] = KEY_POWER, */
-
-    [kVK_F1] = KEY_F1,
-    [kVK_F2] = KEY_F2,
-    [kVK_F3] = KEY_F3,
-    [kVK_F4] = KEY_F4,
-    [kVK_F5] = KEY_F5,
-    [kVK_F6] = KEY_F6,
-    [kVK_F7] = KEY_F7,
-    [kVK_F8] = KEY_F8,
-    [kVK_F9] = KEY_F9,
-    [kVK_F10] = KEY_F10,
-    [kVK_F11] = KEY_F11,
-    [kVK_F12] = KEY_F12,
-    [kVK_F13] = KEY_SYSRQ,
-    [kVK_F14] = KEY_SCROLLLOCK,
-    [kVK_F15] = KEY_PAUSE,
-
-    // JIS keyboards only
-    [kVK_JIS_Yen] = KEY_YEN,
-    [kVK_JIS_Underscore] = KEY_RO,
-    [kVK_JIS_KeypadComma] = KEY_KPCOMMA,
-    [kVK_JIS_Eisu] = KEY_MUHENKAN,
-    [kVK_JIS_Kana] = KEY_HENKAN,
-
-    /*
-     * The eject and volume keys can't be used here because they are handled at
-     * a lower level than what an Application can see.
-     */
-};
-
-static unsigned int cocoa_keycode_to_linux(int keycode)
+static int cocoa_keycode_to_linux(int keycode)
 {
-    if (ARRAY_SIZE(mac_to_linux_map) <= keycode) {
+    if (qemu_input_map_osx_to_linux_len <= keycode) {
         error_report("(cocoa) warning unknown keycode 0x%x", keycode);
         return 0;
     }
-    return mac_to_linux_map[keycode];
+    return qemu_input_map_osx_to_linux[keycode];
 }
 
 /* Displays an alert dialog box with the specified message */

---
base-commit: 2db91528542672cf0db78b3f2cc0e22b36302b38
change-id: 20250111-osx-0183ecf5210f

Best regards,
--  
Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Re: [PATCH v3] ui/cocoa: Use qemu_input_map_osx_to_linux
Posted by Philippe Mathieu-Daudé 3 days, 14 hours ago
On 4/6/26 08:39, Akihiko Odaki wrote:
> ui/cocoa used to have a conversion table from macOS keycode to Linux
> key code. It is an unnecessary redundancy as ui/input-keymap.c already
> has such a table. Worse, I added an incorrect mapping of kVK_JIS_Eisu and
> kVK_JIS_Kana with commit 708b72557ff5 ("ui/cocoa: Support unique keys of
> JIS keyboards").
> 
> According to the following documentations, the definitions in
> ui/keycodemapdb/keymaps.csv, which ui/input-keymap.c uses, are correct:
> https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang1?language=objc
> https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang2?language=objc
> https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/keyboard-japan-ime
> 
> Use qemu_input_map_osx_to_linux to eliminate the redundancy and
> incorrect mappings.
> 
> Fixes: 708b72557ff5 ("ui/cocoa: Support unique keys of JIS keyboards")
> Signed-off-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
> ---
> ui/cocoa used to have a conversion table from macOS keycode to Linux
> key code. It is an unnecessary redundancy as ui/input-keymap.c already
> has such a table. Worse, I added an incorrect mapping of kVK_JIS_Eisu and
> kVK_JIS_Kana with commit 708b72557ff5 ("ui/cocoa: Support unique keys of
> JIS keyboards").
> 
> According to the following documentations, the definitions in
> ui/keycodemapdb/keymaps.csv, which ui/input-keymap.c uses, are correct:
> https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang1?language=objc
> https://developer.apple.com/documentation/uikit/uikeyboardhidusage/uikeyboardhidusagekeyboardlang2?language=objc
> https://docs.microsoft.com/en-us/windows-hardware/design/component-guidelines/keyboard-japan-ime
> 
> Use qemu_input_map_osx_to_linux to eliminate the redundancy and
> incorrect mappings.
> ---
> Changes in v3:
> - Rebased.
> - Link to v2: https://lore.kernel.org/r/20250115-osx-v2-1-ac3b38d91174@daynix.com
> ---
>   ui/cocoa.m | 131 ++-----------------------------------------------------------
>   1 file changed, 3 insertions(+), 128 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@mailo.com>

and queued, thanks Akihiko!