From d66cf51ad217731f34096e1033c8bc7d788444ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Sat, 29 Nov 2025 09:24:03 +0100 Subject: [PATCH] Fix macOS shortcut handling in `text_input` and `text_editor` --- widget/src/text_editor.rs | 41 ++++++++++++++++----------------------- widget/src/text_input.rs | 11 ++++++++--- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index b50ad312..982b95b0 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -1173,9 +1173,6 @@ impl Binding { return None; } - #[cfg(target_os = "macos")] - let key = convert_macos_shortcut(&key, modifiers); - let combination = match key.as_ref() { keyboard::Key::Character("c") if modifiers.command() => { Some(Self::Copy) @@ -1198,6 +1195,10 @@ impl Binding { return Some(binding); } + #[cfg(target_os = "macos")] + let modified_key = + convert_macos_shortcut(&key, modifiers).unwrap_or(modified_key); + match modified_key.as_ref() { keyboard::Key::Named(key::Named::Enter) => Some(Self::Enter), keyboard::Key::Named(key::Named::Backspace) => { @@ -1497,28 +1498,20 @@ pub fn default(theme: &Theme, status: Status) -> Style { pub(crate) fn convert_macos_shortcut( key: &keyboard::Key, modifiers: keyboard::Modifiers, -) -> &keyboard::Key { +) -> Option { if modifiers != keyboard::Modifiers::CTRL { - return key; + return None; } - match key.as_ref() { - keyboard::Key::Character("b") => { - &keyboard::Key::Named(key::Named::ArrowLeft) - } - keyboard::Key::Character("f") => { - &keyboard::Key::Named(key::Named::ArrowRight) - } - keyboard::Key::Character("a") => { - &keyboard::Key::Named(key::Named::Home) - } - keyboard::Key::Character("e") => &keyboard::Key::Named(key::Named::End), - keyboard::Key::Character("h") => { - &keyboard::Key::Named(key::Named::Backspace) - } - keyboard::Key::Character("d") => { - &keyboard::Key::Named(key::Named::Delete) - } - _ => key, - } + let key = match key.as_ref() { + keyboard::Key::Character("b") => key::Named::ArrowLeft, + keyboard::Key::Character("f") => key::Named::ArrowRight, + keyboard::Key::Character("a") => key::Named::Home, + keyboard::Key::Character("e") => key::Named::End, + keyboard::Key::Character("h") => key::Named::Backspace, + keyboard::Key::Character("d") => key::Named::Delete, + _ => return None, + }; + + Some(keyboard::Key::Named(key)) } diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index d1db294b..39880cc8 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -1039,9 +1039,14 @@ where } #[cfg(target_os = "macos")] - let key = crate::text_editor::convert_macos_shortcut( - key, modifiers, - ); + let macos_shortcut = + crate::text_editor::convert_macos_shortcut( + key, modifiers, + ); + + #[cfg(target_os = "macos")] + let modified_key = + macos_shortcut.as_ref().unwrap_or(modified_key); match modified_key.as_ref() { keyboard::Key::Named(key::Named::Enter) => {