Prevent background terminal focus retries from reordering windows
This commit is contained in:
parent
2db9bb4b86
commit
e9556ba5f4
3 changed files with 69 additions and 2 deletions
|
|
@ -92,6 +92,7 @@
|
|||
F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */; };
|
||||
F7000000A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */; };
|
||||
F8000000A1B2C3D4E5F60718 /* SocketControlPasswordStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8000001A1B2C3D4E5F60718 /* SocketControlPasswordStoreTests.swift */; };
|
||||
F9000000A1B2C3D4E5F60718 /* GhosttyEnsureFocusWindowActivationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9000001A1B2C3D4E5F60718 /* GhosttyEnsureFocusWindowActivationTests.swift */; };
|
||||
A5008381 /* BrowserFindJavaScriptTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5008380 /* BrowserFindJavaScriptTests.swift */; };
|
||||
A5008383 /* CommandPaletteSearchEngineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5008382 /* CommandPaletteSearchEngineTests.swift */; };
|
||||
DA7A10CA710E000000000003 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = DA7A10CA710E000000000001 /* Localizable.xcstrings */; };
|
||||
|
|
@ -235,8 +236,9 @@
|
|||
F5000001A1B2C3D4E5F60718 /* SessionPersistenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionPersistenceTests.swift; sourceTree = "<group>"; };
|
||||
F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegateShortcutRoutingTests.swift; sourceTree = "<group>"; };
|
||||
F7000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorkspaceContentViewVisibilityTests.swift; sourceTree = "<group>"; };
|
||||
F8000001A1B2C3D4E5F60718 /* SocketControlPasswordStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocketControlPasswordStoreTests.swift; sourceTree = "<group>"; };
|
||||
A5008380 /* BrowserFindJavaScriptTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserFindJavaScriptTests.swift; sourceTree = "<group>"; };
|
||||
F8000001A1B2C3D4E5F60718 /* SocketControlPasswordStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocketControlPasswordStoreTests.swift; sourceTree = "<group>"; };
|
||||
F9000001A1B2C3D4E5F60718 /* GhosttyEnsureFocusWindowActivationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyEnsureFocusWindowActivationTests.swift; sourceTree = "<group>"; };
|
||||
A5008380 /* BrowserFindJavaScriptTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserFindJavaScriptTests.swift; sourceTree = "<group>"; };
|
||||
A5008382 /* CommandPaletteSearchEngineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandPaletteSearchEngineTests.swift; sourceTree = "<group>"; };
|
||||
DA7A10CA710E000000000001 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
|
||||
DA7A10CA710E000000000002 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = "<group>"; };
|
||||
|
|
@ -469,6 +471,7 @@
|
|||
F6000001A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift */,
|
||||
F7000001A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift */,
|
||||
F8000001A1B2C3D4E5F60718 /* SocketControlPasswordStoreTests.swift */,
|
||||
F9000001A1B2C3D4E5F60718 /* GhosttyEnsureFocusWindowActivationTests.swift */,
|
||||
A5008380 /* BrowserFindJavaScriptTests.swift */,
|
||||
A5008382 /* CommandPaletteSearchEngineTests.swift */,
|
||||
);
|
||||
|
|
@ -707,6 +710,7 @@
|
|||
F6000000A1B2C3D4E5F60718 /* AppDelegateShortcutRoutingTests.swift in Sources */,
|
||||
F7000000A1B2C3D4E5F60718 /* WorkspaceContentViewVisibilityTests.swift in Sources */,
|
||||
F8000000A1B2C3D4E5F60718 /* SocketControlPasswordStoreTests.swift in Sources */,
|
||||
F9000000A1B2C3D4E5F60718 /* GhosttyEnsureFocusWindowActivationTests.swift in Sources */,
|
||||
A5008381 /* BrowserFindJavaScriptTests.swift in Sources */,
|
||||
A5008383 /* CommandPaletteSearchEngineTests.swift in Sources */,
|
||||
);
|
||||
|
|
|
|||
|
|
@ -5592,6 +5592,15 @@ private final class GhosttyPassthroughVisualEffectView: NSVisualEffectView {
|
|||
}
|
||||
}
|
||||
|
||||
func shouldAllowEnsureFocusWindowActivation(
|
||||
activeTabManager: TabManager?,
|
||||
targetTabManager: TabManager,
|
||||
keyWindow: NSWindow?,
|
||||
mainWindow: NSWindow?
|
||||
) -> Bool {
|
||||
activeTabManager === targetTabManager || (keyWindow == nil && mainWindow == nil)
|
||||
}
|
||||
|
||||
final class GhosttySurfaceScrollView: NSView {
|
||||
enum FlashStyle {
|
||||
case standardFocus
|
||||
|
|
@ -7003,6 +7012,14 @@ final class GhosttySurfaceScrollView: NSView {
|
|||
}
|
||||
|
||||
if !window.isKeyWindow {
|
||||
guard shouldAllowEnsureFocusWindowActivation(
|
||||
activeTabManager: delegate.tabManager,
|
||||
targetTabManager: tabManager,
|
||||
keyWindow: NSApp.keyWindow,
|
||||
mainWindow: NSApp.mainWindow
|
||||
) else {
|
||||
return
|
||||
}
|
||||
window.makeKeyAndOrderFront(nil)
|
||||
}
|
||||
let result = window.makeFirstResponder(surfaceView)
|
||||
|
|
|
|||
46
cmuxTests/GhosttyEnsureFocusWindowActivationTests.swift
Normal file
46
cmuxTests/GhosttyEnsureFocusWindowActivationTests.swift
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
import XCTest
|
||||
import AppKit
|
||||
|
||||
#if canImport(cmux_DEV)
|
||||
@testable import cmux_DEV
|
||||
#elseif canImport(cmux)
|
||||
@testable import cmux
|
||||
#endif
|
||||
|
||||
@MainActor
|
||||
final class GhosttyEnsureFocusWindowActivationTests: XCTestCase {
|
||||
func testAllowsActivationForActiveManager() {
|
||||
let activeManager = TabManager()
|
||||
let otherManager = TabManager()
|
||||
|
||||
XCTAssertTrue(
|
||||
shouldAllowEnsureFocusWindowActivation(
|
||||
activeTabManager: activeManager,
|
||||
targetTabManager: activeManager,
|
||||
keyWindow: NSWindow(),
|
||||
mainWindow: NSWindow()
|
||||
)
|
||||
)
|
||||
XCTAssertFalse(
|
||||
shouldAllowEnsureFocusWindowActivation(
|
||||
activeTabManager: activeManager,
|
||||
targetTabManager: otherManager,
|
||||
keyWindow: NSWindow(),
|
||||
mainWindow: NSWindow()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
func testAllowsActivationWhenAppHasNoKeyOrMainWindow() {
|
||||
let targetManager = TabManager()
|
||||
|
||||
XCTAssertTrue(
|
||||
shouldAllowEnsureFocusWindowActivation(
|
||||
activeTabManager: nil,
|
||||
targetTabManager: targetManager,
|
||||
keyWindow: nil,
|
||||
mainWindow: nil
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue