fix: strip SUPER from modifiers after normalization per review

This commit is contained in:
Hanmiao Li
2026-06-09 15:32:23 +08:00
parent 6ac14a246d
commit 1b5442f2b7
2 changed files with 9 additions and 6 deletions
+5 -2
View File
@@ -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
}
+4 -4
View File
@@ -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]