Fix terminal keyboard open + sticky outside-click

This commit is contained in:
Soham Sharma 2026-04-16 19:36:42 +08:00
commit 0f034b8528
2 changed files with 19 additions and 6 deletions

View file

@ -82,6 +82,7 @@ struct ContentView: View {
@Default(.showStandardMediaControls) var showStandardMediaControls @Default(.showStandardMediaControls) var showStandardMediaControls
@Default(.externalDisplayStyle) var externalDisplayStyle @Default(.externalDisplayStyle) var externalDisplayStyle
@Default(.hideNonNotchUntilHover) var hideNonNotchUntilHover @Default(.hideNonNotchUntilHover) var hideNonNotchUntilHover
@Default(.terminalStickyMode) var terminalStickyMode
// Dynamic sizing based on view type and graph count with smooth transitions // Dynamic sizing based on view type and graph count with smooth transitions
var dynamicNotchSize: CGSize { var dynamicNotchSize: CGSize {
@ -520,6 +521,7 @@ struct ContentView: View {
currentView: currentViewString currentView: currentViewString
) )
} }
syncStickyTerminalOutsideClickMonitor()
} }
.sensoryFeedback(.alignment, trigger: haptics) .sensoryFeedback(.alignment, trigger: haptics)
.contextMenu { .contextMenu {
@ -546,12 +548,6 @@ struct ContentView: View {
) )
.frame(maxHeight: .infinity, alignment: .top) .frame(maxHeight: .infinity, alignment: .top)
.environmentObject(privacyManager) .environmentObject(privacyManager)
.onChange(of: dynamicNotchSize) { oldSize, newSize in
guard oldSize != newSize else { return }
runAfter(0.1) {
vm.shouldRecheckHover.toggle()
}
}
.background(dragDetector) .background(dragDetector)
.environmentObject(vm) .environmentObject(vm)
.environmentObject(webcamManager) .environmentObject(webcamManager)
@ -566,6 +562,9 @@ struct ContentView: View {
enqueueMusicControlWindowSync(forceRefresh: true) enqueueMusicControlWindowSync(forceRefresh: true)
startHiddenEdgeHoverPolling() startHiddenEdgeHoverPolling()
} }
.onChange(of: terminalStickyMode) { _, _ in
syncStickyTerminalOutsideClickMonitor()
}
.onChange(of: vm.notchState) { _, state in .onChange(of: vm.notchState) { _, state in
if state == .open { if state == .open {
suppressMusicControlWindowUpdates() 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() { private func installStickyTerminalClickMonitor() {
guard stickyTerminalClickMonitor == nil else { return } guard stickyTerminalClickMonitor == nil else { return }
stickyTerminalClickMonitor = NSEvent.addGlobalMonitorForEvents(matching: [.leftMouseDown]) { [weak vm] _ in stickyTerminalClickMonitor = NSEvent.addGlobalMonitorForEvents(matching: [.leftMouseDown]) { [weak vm] _ in

View file

@ -1041,12 +1041,16 @@ class AppDelegate: NSObject, NSApplicationDelegate {
guard Defaults[.enableShortcuts], Defaults[.enableTerminalFeature] else { return } guard Defaults[.enableShortcuts], Defaults[.enableTerminalFeature] else { return }
if vm.notchState == .closed { if vm.notchState == .closed {
closeNotchWorkItem?.cancel()
closeNotchWorkItem = nil
vm.open() vm.open()
coordinator.currentView = .terminal coordinator.currentView = .terminal
} else { } else {
if coordinator.currentView == .terminal { if coordinator.currentView == .terminal {
vm.close() vm.close()
} else { } else {
closeNotchWorkItem?.cancel()
closeNotchWorkItem = nil
coordinator.currentView = .terminal coordinator.currentView = .terminal
} }
} }