diff --git a/crates/tui/src/tui/composer_ui.rs b/crates/tui/src/tui/composer_ui.rs index 1dffc685..a73cbd80 100644 --- a/crates/tui/src/tui/composer_ui.rs +++ b/crates/tui/src/tui/composer_ui.rs @@ -126,8 +126,11 @@ pub(crate) fn is_word_cursor_modifier(modifiers: KeyModifiers) -> bool { /// On all other platforms this is a no-op. #[cfg(target_os = "macos")] pub(crate) fn normalize_macos_modifiers(modifiers: KeyModifiers) -> KeyModifiers { - if modifiers.contains(KeyModifiers::SUPER) && !modifiers.contains(KeyModifiers::CONTROL) { - modifiers | KeyModifiers::CONTROL + // Strip SUPER and add CONTROL so that exact modifier equality checks + // (e.g. `modifiers == KeyModifiers::CONTROL` in Ctrl+S stashing) work + // correctly after normalization. + if modifiers.contains(KeyModifiers::SUPER) { + (modifiers - KeyModifiers::SUPER) | KeyModifiers::CONTROL } else { modifiers } diff --git a/crates/tui/src/tui/ui/tests.rs b/crates/tui/src/tui/ui/tests.rs index bc2ec692..f76ae97a 100644 --- a/crates/tui/src/tui/ui/tests.rs +++ b/crates/tui/src/tui/ui/tests.rs @@ -301,19 +301,19 @@ fn word_cursor_modifier_accepts_control_and_alt() { #[test] fn normalize_macos_modifiers_maps_super_to_control() { use crate::tui::composer_ui::normalize_macos_modifiers; - // SUPER (Cmd) without CONTROL should gain CONTROL. + // SUPER (Cmd) without CONTROL should gain CONTROL and lose SUPER. let normalized = normalize_macos_modifiers(KeyModifiers::SUPER); assert!(normalized.contains(KeyModifiers::CONTROL)); - assert!(normalized.contains(KeyModifiers::SUPER)); + assert!(!normalized.contains(KeyModifiers::SUPER)); } #[test] fn normalize_macos_modifiers_preserves_existing_control() { use crate::tui::composer_ui::normalize_macos_modifiers; - // CONTROL already set — shouldn't be removed. + // CONTROL already set — SUPER should be removed. let normalized = normalize_macos_modifiers(KeyModifiers::CONTROL | KeyModifiers::SUPER); assert!(normalized.contains(KeyModifiers::CONTROL)); - assert!(normalized.contains(KeyModifiers::SUPER)); + assert!(!normalized.contains(KeyModifiers::SUPER)); } #[test]