From 6871cc55a92d57a8ab237163fc54b228274d9822 Mon Sep 17 00:00:00 2001 From: Austin Wang Date: Mon, 11 May 2026 01:03:57 -0700 Subject: [PATCH] Revert "Fix Chinese IME Enter swallowed in terminal (#3762) (#3767)" This reverts commit fe7cf048dc7202574b50cdb2e47536f5dfd6be8d. --- Sources/GhosttyNSView+IMEComposition.swift | 34 +++-------- cmuxTests/CJKIMEMarkedSelectionTests.swift | 66 ---------------------- 2 files changed, 9 insertions(+), 91 deletions(-) diff --git a/Sources/GhosttyNSView+IMEComposition.swift b/Sources/GhosttyNSView+IMEComposition.swift index 7fd955b24424..09144783bbf0 100644 --- a/Sources/GhosttyNSView+IMEComposition.swift +++ b/Sources/GhosttyNSView+IMEComposition.swift @@ -50,8 +50,7 @@ extension GhosttyNSView { // events out of the terminal so keys such as Down can open // candidates instead of moving the shell cursor. guard textInputHandledEvent, isInputMethodSource(inputSourceId) else { return false } - return shouldKeepNoMarkedIMECommandInsideTextInput(event) - && !shouldAllowDeferredNumpadIMEFallback(event) + return !shouldAllowDeferredNumpadIMEFallback(event) } if before.text != after.text { @@ -86,27 +85,6 @@ extension GhosttyNSView { return flags == [.numericPad] } - func hasOnlyTextInputCommandModifiers(_ event: NSEvent) -> Bool { - let flags = event.modifierFlags - .intersection(.deviceIndependentFlagsMask) - .subtracting([.numericPad, .function, .capsLock]) - return flags.isEmpty || flags == [.shift] - } - - func shouldKeepNoMarkedIMECommandInsideTextInput(_ event: NSEvent?) -> Bool { - guard let event else { return false } - guard hasOnlyTextInputCommandModifiers(event) else { return false } - - switch Int(event.keyCode) { - case kVK_LeftArrow, kVK_RightArrow, kVK_UpArrow, kVK_DownArrow, - kVK_PageUp, kVK_PageDown, kVK_Home, kVK_End, - kVK_Space: - return true - default: - return false - } - } - func isTraditionalZhuyinInputSource(_ sourceId: String?) -> Bool { guard let sourceId else { return false } return sourceId.localizedCaseInsensitiveContains("TCIM.Zhuyin") @@ -147,7 +125,10 @@ extension GhosttyNSView { return false } - guard hasOnlyTextInputCommandModifiers(event) else { return false } + let flags = event.modifierFlags + .intersection(.deviceIndependentFlagsMask) + .subtracting([.numericPad, .function, .capsLock]) + guard flags.isEmpty || flags == [.shift] else { return false } switch Int(event.keyCode) { case kVK_DownArrow, kVK_UpArrow, kVK_PageUp, kVK_PageDown, kVK_Space: @@ -174,7 +155,10 @@ extension GhosttyNSView { /// Returns true for active-composition command keys that belong to AppKit's /// text input manager even when marked text itself does not change. func shouldKeepIMECompositionCommandInsideTextInput(_ event: NSEvent) -> Bool { - guard hasOnlyTextInputCommandModifiers(event) else { return false } + let flags = event.modifierFlags + .intersection(.deviceIndependentFlagsMask) + .subtracting([.numericPad, .function, .capsLock]) + guard flags.isEmpty || flags == [.shift] else { return false } switch Int(event.keyCode) { case kVK_LeftArrow, kVK_RightArrow, kVK_UpArrow, kVK_DownArrow, diff --git a/cmuxTests/CJKIMEMarkedSelectionTests.swift b/cmuxTests/CJKIMEMarkedSelectionTests.swift index 495e3bbf36ca..26692d0c29d5 100644 --- a/cmuxTests/CJKIMEMarkedSelectionTests.swift +++ b/cmuxTests/CJKIMEMarkedSelectionTests.swift @@ -651,72 +651,6 @@ final class CJKIMEMarkedSelectionTests: XCTestCase { ) } - func testZhuyinReturnForwardsToTerminalAfterCompositionIsCleared() throws { - let hostedTerminal = try makeHostedTerminalWindow() - let terminalSurface = hostedTerminal.surface - let window = hostedTerminal.window - let surfaceView = hostedTerminal.surfaceView - let previousKeyEventObserver = GhosttyNSView.debugGhosttySurfaceKeyEventObserver - let previousInputSourceOverride = KeyboardLayout.debugInputSourceIdOverride - let previousInterpretHook = cjkIMEInterpretKeyEventsHook - defer { - GhosttyNSView.debugGhosttySurfaceKeyEventObserver = previousKeyEventObserver - KeyboardLayout.debugInputSourceIdOverride = previousInputSourceOverride - cjkIMEInterpretKeyEventsHook = previousInterpretHook - window.orderOut(nil) - withExtendedLifetime(terminalSurface) {} - } - - KeyboardLayout.debugInputSourceIdOverride = "com.apple.inputmethod.TCIM.Zhuyin" - surfaceView.setMarkedText( - "ㄋ", - selectedRange: NSRange(location: 1, length: 0), - replacementRange: NSRange(location: NSNotFound, length: 0) - ) - surfaceView.unmarkText() - XCTAssertFalse(surfaceView.hasMarkedText()) - - installCJKIMEInterpretKeyEventsSwizzle() - cjkIMEInterpretKeyEventsHook = { candidateView, events in - guard candidateView === surfaceView, - let event = events.first, - Int(event.keyCode) == kVK_Return else { - return false - } - return true - } - - var forwardedText: [String] = [] - var forwardedPressKeyCodes: [UInt32] = [] - GhosttyNSView.debugGhosttySurfaceKeyEventObserver = { keyEvent in - previousKeyEventObserver?(keyEvent) - guard keyEvent.action == GHOSTTY_ACTION_PRESS else { return } - if let text = keyEvent.text { - forwardedText.append(String(cString: text)) - } else { - forwardedPressKeyCodes.append(keyEvent.keycode) - } - } - - let event = try keyEvent( - text: "\r", - keyCode: UInt16(kVK_Return), - windowNumber: window.windowNumber - ) - - window.makeFirstResponder(surfaceView) - withExtendedLifetime(terminalSurface) { - surfaceView.keyDown(with: event) - } - - XCTAssertEqual(forwardedText, []) - XCTAssertEqual( - forwardedPressKeyCodes, - [UInt32(kVK_Return)], - "Plain Return after Zhuyin composition is cleared must execute in the terminal" - ) - } - func testDoesNotSuppressNonInputMethodDeadKeyCommandWhenMarkedTextIsUnchanged() throws { let view = GhosttyNSView(frame: .zero) let event = try keyEvent(