diff --git a/DynamicIsland/ContentView.swift b/DynamicIsland/ContentView.swift index 72de3e2..444f3e3 100644 --- a/DynamicIsland/ContentView.swift +++ b/DynamicIsland/ContentView.swift @@ -82,6 +82,7 @@ struct ContentView: View { @Default(.showStandardMediaControls) var showStandardMediaControls @Default(.externalDisplayStyle) var externalDisplayStyle @Default(.hideNonNotchUntilHover) var hideNonNotchUntilHover + @Default(.terminalStickyMode) var terminalStickyMode // Dynamic sizing based on view type and graph count with smooth transitions var dynamicNotchSize: CGSize { @@ -520,6 +521,7 @@ struct ContentView: View { currentView: currentViewString ) } + syncStickyTerminalOutsideClickMonitor() } .sensoryFeedback(.alignment, trigger: haptics) .contextMenu { @@ -546,12 +548,6 @@ struct ContentView: View { ) .frame(maxHeight: .infinity, alignment: .top) .environmentObject(privacyManager) - .onChange(of: dynamicNotchSize) { oldSize, newSize in - guard oldSize != newSize else { return } - runAfter(0.1) { - vm.shouldRecheckHover.toggle() - } - } .background(dragDetector) .environmentObject(vm) .environmentObject(webcamManager) @@ -566,6 +562,9 @@ struct ContentView: View { enqueueMusicControlWindowSync(forceRefresh: true) startHiddenEdgeHoverPolling() } + .onChange(of: terminalStickyMode) { _, _ in + syncStickyTerminalOutsideClickMonitor() + } .onChange(of: vm.notchState) { _, state in if state == .open { suppressMusicControlWindowUpdates() @@ -1752,6 +1751,16 @@ struct ContentView: View { } } + /// Installs the global outside-click monitor when Terminal + sticky mode are active (e.g. keyboard-opened terminal). + /// Removes the monitor when the tab, sticky setting, or open state no longer applies. + private func syncStickyTerminalOutsideClickMonitor() { + guard vm.notchState == .open, terminalStickyMode, coordinator.currentView == .terminal else { + removeStickyTerminalClickMonitor() + return + } + installStickyTerminalClickMonitor() + } + private func installStickyTerminalClickMonitor() { guard stickyTerminalClickMonitor == nil else { return } stickyTerminalClickMonitor = NSEvent.addGlobalMonitorForEvents(matching: [.leftMouseDown]) { [weak vm] _ in diff --git a/DynamicIsland/DynamicIslandApp.swift b/DynamicIsland/DynamicIslandApp.swift index 5cfdf7d..b351138 100644 --- a/DynamicIsland/DynamicIslandApp.swift +++ b/DynamicIsland/DynamicIslandApp.swift @@ -1041,12 +1041,16 @@ class AppDelegate: NSObject, NSApplicationDelegate { guard Defaults[.enableShortcuts], Defaults[.enableTerminalFeature] else { return } if vm.notchState == .closed { + closeNotchWorkItem?.cancel() + closeNotchWorkItem = nil vm.open() coordinator.currentView = .terminal } else { if coordinator.currentView == .terminal { vm.close() } else { + closeNotchWorkItem?.cancel() + closeNotchWorkItem = nil coordinator.currentView = .terminal } }