From 587cd7c94f495d8fc6ff93354feea6d2922a38e2 Mon Sep 17 00:00:00 2001 From: rhysd Date: Sun, 9 Feb 2025 01:05:45 +0900 Subject: [PATCH 1/3] Implement macOS-specific key shortcuts for text input This commit implements some key shortcuts listed in the following list: https://support.apple.com/en-us/102650#:~:text=and%20iCloud%20Drive.-,Text%2Dediting%20shortcuts,-The%20behavior%20of --- widget/src/text_input.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 0783f7c2..f76cacec 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -1009,6 +1009,9 @@ where } } + #[cfg(target_os = "macos")] + let key = convert_macos_shortcut(key, modifiers); + match key.as_ref() { keyboard::Key::Named(key::Named::Enter) => { if let Some(on_submit) = self.on_submit.clone() { @@ -1783,3 +1786,33 @@ fn alignment_offset( } } } + +#[cfg(target_os = "macos")] +fn convert_macos_shortcut( + key: &keyboard::Key, + modifiers: keyboard::Modifiers, +) -> &keyboard::Key { + let control = + modifiers.control() && !modifiers.alt() && !modifiers.command(); + match key.as_ref() { + keyboard::Key::Character("b") if control => { + &keyboard::Key::Named(key::Named::ArrowLeft) + } + keyboard::Key::Character("f") if control => { + &keyboard::Key::Named(key::Named::ArrowRight) + } + keyboard::Key::Character("a") if control => { + &keyboard::Key::Named(key::Named::Home) + } + keyboard::Key::Character("e") if control => { + &keyboard::Key::Named(key::Named::End) + } + keyboard::Key::Character("h") if control => { + &keyboard::Key::Named(key::Named::Backspace) + } + keyboard::Key::Character("d") if control => { + &keyboard::Key::Named(key::Named::Delete) + } + _ => key, + } +} From 524b4acc6d5c9f7bc48603eaf09c2eb86cf29fc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Fri, 21 Nov 2025 00:10:14 +0100 Subject: [PATCH 2/3] Simplify `convert_macos_shortcut` a bit in `text_input` --- widget/src/text_input.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index f76cacec..7d730989 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -1792,25 +1792,25 @@ fn convert_macos_shortcut( key: &keyboard::Key, modifiers: keyboard::Modifiers, ) -> &keyboard::Key { - let control = - modifiers.control() && !modifiers.alt() && !modifiers.command(); + if modifiers != keyboard::Modifiers::CTRL { + return key; + } + match key.as_ref() { - keyboard::Key::Character("b") if control => { + keyboard::Key::Character("b") => { &keyboard::Key::Named(key::Named::ArrowLeft) } - keyboard::Key::Character("f") if control => { + keyboard::Key::Character("f") => { &keyboard::Key::Named(key::Named::ArrowRight) } - keyboard::Key::Character("a") if control => { + keyboard::Key::Character("a") => { &keyboard::Key::Named(key::Named::Home) } - keyboard::Key::Character("e") if control => { - &keyboard::Key::Named(key::Named::End) - } - keyboard::Key::Character("h") if control => { + keyboard::Key::Character("e") => &keyboard::Key::Named(key::Named::End), + keyboard::Key::Character("h") => { &keyboard::Key::Named(key::Named::Backspace) } - keyboard::Key::Character("d") if control => { + keyboard::Key::Character("d") => { &keyboard::Key::Named(key::Named::Delete) } _ => key, From 416ec838f268dc00cf6f80365a9f588c369c1b1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Fri, 21 Nov 2025 00:15:36 +0100 Subject: [PATCH 3/3] Implement macOS-specific key shortcuts for `text_editor` --- widget/src/text_editor.rs | 33 +++++++++++++++++++++++++++++++++ widget/src/text_input.rs | 34 +++------------------------------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index cf185676..e0e5b510 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -1148,6 +1148,9 @@ impl Binding { return None; } + #[cfg(target_os = "macos")] + let key = convert_macos_shortcut(&key, modifiers); + match key.as_ref() { keyboard::Key::Named(key::Named::Enter) => Some(Self::Enter), keyboard::Key::Named(key::Named::Backspace) => { @@ -1454,3 +1457,33 @@ pub fn default(theme: &Theme, status: Status) -> Style { }, } } + +#[cfg(target_os = "macos")] +pub(crate) fn convert_macos_shortcut( + key: &keyboard::Key, + modifiers: keyboard::Modifiers, +) -> &keyboard::Key { + if modifiers != keyboard::Modifiers::CTRL { + return key; + } + + 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, + } +} diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 7d730989..c630a4ec 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -1010,7 +1010,9 @@ where } #[cfg(target_os = "macos")] - let key = convert_macos_shortcut(key, modifiers); + let key = crate::text_editor::convert_macos_shortcut( + key, modifiers, + ); match key.as_ref() { keyboard::Key::Named(key::Named::Enter) => { @@ -1786,33 +1788,3 @@ fn alignment_offset( } } } - -#[cfg(target_os = "macos")] -fn convert_macos_shortcut( - key: &keyboard::Key, - modifiers: keyboard::Modifiers, -) -> &keyboard::Key { - if modifiers != keyboard::Modifiers::CTRL { - return key; - } - - 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, - } -}