Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions Sources/TabManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3396,16 +3396,14 @@ class TabManager: ObservableObject {
#endif
return false
}
if let surfaceId, tab.panels[surfaceId] == nil {
let requestedPanelId = surfaceId.flatMap { panelId(forSurfaceOrPanelId: $0, in: tab) }
if let surfaceId, requestedPanelId == nil {
#if DEBUG
cmuxDebugLog(
"notification.focus.fail tab=\(tabId.uuidString.prefix(5)) " +
"panel=\(surfaceId.uuidString.prefix(5)) reason=missingPanel"
)
cmuxDebugLog("notification.focus.fail tab=\(tabId.uuidString.prefix(5)) panel=\(surfaceId.uuidString.prefix(5)) reason=missingPanel")
#endif
return false
}
let desiredPanelId = surfaceId ?? tab.focusedPanelId
let desiredPanelId = requestedPanelId ?? tab.focusedPanelId
Comment thread
cursor[bot] marked this conversation as resolved.
#if DEBUG
if let desiredPanelId {
AppDelegate.shared?.armJumpUnreadFocusRecord(tabId: tabId, surfaceId: desiredPanelId)
Expand Down
4 changes: 4 additions & 0 deletions cmux.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,7 @@
C5B6A10000000000000000B1 /* TabManager+SidebarGitHosting.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5B6A10000000000000000B2 /* TabManager+SidebarGitHosting.swift */; };
604500100000000000000007 /* TabManager+WindowTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 604500100000000000000008 /* TabManager+WindowTitle.swift */; };
A5001003 /* TabManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5001013 /* TabManager.swift */; };
C0DE64160000000000000001 /* TabManagerNotificationFocusRegressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0DE64160000000000000002 /* TabManagerNotificationFocusRegressionTests.swift */; };
2BB56A710BB1FC50367E5BCF /* TabManagerSessionSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10D684CFFB8CDEF89CE2D9E1 /* TabManagerSessionSnapshotTests.swift */; };
B6BF3DC98DB1495E57900199 /* TabManagerUnitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42092CDB2109E250F7F2A76E /* TabManagerUnitTests.swift */; };
C7A507000000000000000002 /* TaskManagerResourcesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A507000000000000000001 /* TaskManagerResourcesTests.swift */; };
Expand Down Expand Up @@ -1720,6 +1721,7 @@
C5B6A10000000000000000B2 /* TabManager+SidebarGitHosting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TabManager+SidebarGitHosting.swift"; sourceTree = "<group>"; };
604500100000000000000008 /* TabManager+WindowTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TabManager+WindowTitle.swift"; sourceTree = "<group>"; };
A5001013 /* TabManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabManager.swift; sourceTree = "<group>"; };
C0DE64160000000000000002 /* TabManagerNotificationFocusRegressionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabManagerNotificationFocusRegressionTests.swift; sourceTree = "<group>"; };
10D684CFFB8CDEF89CE2D9E1 /* TabManagerSessionSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabManagerSessionSnapshotTests.swift; sourceTree = "<group>"; };
42092CDB2109E250F7F2A76E /* TabManagerUnitTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabManagerUnitTests.swift; sourceTree = "<group>"; };
C7A507000000000000000001 /* TaskManagerResourcesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskManagerResourcesTests.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -2903,6 +2905,7 @@
596100000000000000000006 /* TerminalNotificationStore+NativeNotificationDeliveryTesting.swift */,
D7AB00000000000000B020 /* NotificationDismissSyncTests.swift */,
4E5F60720000000000000002 /* NotificationSoundSettingsTests.swift */,
C0DE64160000000000000002 /* TabManagerNotificationFocusRegressionTests.swift */,
42092CDB2109E250F7F2A76E /* TabManagerUnitTests.swift */,
C0793DC7D7B61CF54886EC36 /* RemoteTmuxControlParserTests.swift */,
B0555302B0555302B0555302 /* RemoteTmuxControlStreamParserBudgetTests.swift */,
Expand Down Expand Up @@ -4255,6 +4258,7 @@
62270F3DCECB4787D789CCE3 /* SidebarWorkspaceSnapshotRefreshPolicyTests.swift in Sources */,
F8000000A1B2C3D4E5F60718 /* SocketControlPasswordStoreTests.swift in Sources */,
F6355600A1B2C3D4E5F60718 /* SSHStartupSignalLifecycleTests.swift in Sources */,
C0DE64160000000000000001 /* TabManagerNotificationFocusRegressionTests.swift in Sources */,
2BB56A710BB1FC50367E5BCF /* TabManagerSessionSnapshotTests.swift in Sources */,
B6BF3DC98DB1495E57900199 /* TabManagerUnitTests.swift in Sources */,
C7A507000000000000000002 /* TaskManagerResourcesTests.swift in Sources */,
Expand Down
38 changes: 38 additions & 0 deletions cmuxTests/TabManagerNotificationFocusRegressionTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import Foundation
import Testing

#if canImport(cmux_DEV)
@testable import cmux_DEV
#elseif canImport(cmux)
@testable import cmux
#endif

@MainActor
@Suite(.serialized)
struct TabManagerNotificationFocusRegressionTests {
@Test
func focusTabFromNotificationAcceptsBonsplitSurfaceIdForNestedTabNotification() async throws {
let manager = TabManager()
let workspace = try #require(manager.selectedWorkspace)
let firstPanelId = try #require(workspace.focusedPanelId)
let paneId = try #require(workspace.bonsplitController.focusedPaneId)
_ = workspace.newTerminalSurface(inPane: paneId, focus: false)
let thirdPanel = try #require(workspace.newTerminalSurface(inPane: paneId, focus: false))
let thirdSurfaceId = try #require(workspace.surfaceIdFromPanelId(thirdPanel.id)?.uuid)

workspace.focusPanel(firstPanelId)
#expect(workspace.focusedPanelId == firstPanelId)
#expect(manager.focusTabFromNotification(workspace.id, surfaceId: thirdSurfaceId))
await drainMainQueue()
await drainMainQueue()

#expect(workspace.focusedPanelId == thirdPanel.id)
#expect(workspace.bonsplitController.selectedTab(inPane: paneId)?.id.uuid == thirdSurfaceId)
}

private func drainMainQueue() async {
await withCheckedContinuation { (continuation: CheckedContinuation<Void, Never>) in
DispatchQueue.main.async { continuation.resume() }
}
}
}
Loading