From ede4e2fc99e9aa17831edce48ee0ac37610ffced Mon Sep 17 00:00:00 2001 From: Lawrence Chen <54008264+lawrencecchen@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:26:29 -0800 Subject: [PATCH] Add Cmd+Enter shortcut to toggle fullscreen --- Sources/AppDelegate.swift | 22 +++++++ cmuxTests/CmuxWebViewKeyEquivalentTests.swift | 62 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 5f4bc8d2..53ebdc27 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -302,6 +302,17 @@ func shouldDispatchBrowserReturnViaFirstResponderKeyDown( return keyCode == 36 || keyCode == 76 } +func shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: NSEvent.ModifierFlags, + keyCode: UInt16 +) -> Bool { + let normalizedFlags = flags + .intersection(.deviceIndependentFlagsMask) + .subtracting([.numericPad, .function, .capsLock]) + guard normalizedFlags == [.command] else { return false } + return keyCode == 36 || keyCode == 76 +} + func commandPaletteSelectionDeltaForKeyboardNavigation( flags: NSEvent.ModifierFlags, chars: String, @@ -4574,6 +4585,17 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent return true } + if shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: event.modifierFlags, + keyCode: event.keyCode + ) { + guard let targetWindow = mainWindowForShortcutEvent(event) else { + return false + } + targetWindow.toggleFullScreen(nil) + return true + } + // When the terminal has active IME composition (e.g. Korean, Japanese, Chinese // input), don't intercept non-Cmd key events — let them flow through to the // input method. Cmd-based shortcuts (Cmd+T, Cmd+Shift+L, etc.) should still diff --git a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift index 806338a9..9397b059 100644 --- a/cmuxTests/CmuxWebViewKeyEquivalentTests.swift +++ b/cmuxTests/CmuxWebViewKeyEquivalentTests.swift @@ -1934,6 +1934,68 @@ final class BrowserReturnKeyDownRoutingTests: XCTestCase { } } +final class FullScreenShortcutTests: XCTestCase { + func testMatchesCommandReturn() { + XCTAssertTrue( + shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: [.command], + keyCode: 36 + ) + ) + } + + func testMatchesCommandKeypadEnterWithNumericPadFlag() { + XCTAssertTrue( + shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: [.command, .numericPad], + keyCode: 76 + ) + ) + } + + func testIgnoresCapsLockForCommandEnter() { + XCTAssertTrue( + shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: [.command, .capsLock], + keyCode: 36 + ) + ) + } + + func testRejectsNonEnterKeyCodes() { + XCTAssertFalse( + shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: [.command], + keyCode: 13 + ) + ) + } + + func testRejectsAdditionalModifiers() { + XCTAssertFalse( + shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: [.command, .shift], + keyCode: 36 + ) + ) + XCTAssertFalse( + shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: [.command, .control], + keyCode: 36 + ) + ) + } + + func testRejectsWhenCommandIsMissing() { + XCTAssertFalse( + shouldToggleMainWindowFullScreenForCommandEnterShortcut( + flags: [], + keyCode: 36 + ) + ) + } +} + final class BrowserZoomShortcutActionTests: XCTestCase { func testZoomInSupportsEqualsAndPlusVariants() { XCTAssertEqual(