Remove Click Monitor, partially tested working

This commit is contained in:
Hariharan Mudaliar 2026-02-16 15:31:23 +05:30
commit 539d9185a6
No known key found for this signature in database
GPG key ID: 025583EB0BE5640E

View file

@ -126,8 +126,7 @@ struct ContentView: View {
@State private var hoverTask: Task<Void, Never>? @State private var hoverTask: Task<Void, Never>?
@State private var isHovering: Bool = false @State private var isHovering: Bool = false
@State private var lastHapticTime: Date = Date() @State private var lastHapticTime: Date = Date()
@State private var clickMonitor: Any? @State private var hoverClickMonitor: Any?
@State private var hostingWindow: NSWindow?
@State private var gestureProgress: CGFloat = .zero @State private var gestureProgress: CGFloat = .zero
@State private var skipGestureActiveDirection: MusicManager.SkipDirection? @State private var skipGestureActiveDirection: MusicManager.SkipDirection?
@ -273,7 +272,7 @@ struct ContentView: View {
} }
.conditionalModifier(interactionsEnabled) { view in .conditionalModifier(interactionsEnabled) { view in
view view
.contentShape(Rectangle()) .contentShape(currentNotchShape)
.onHover { hovering in .onHover { hovering in
handleHover(hovering) handleHover(hovering)
} }
@ -393,30 +392,6 @@ struct ContentView: View {
// .keyboardShortcut("E", modifiers: .command) // .keyboardShortcut("E", modifiers: .command)
} }
if interactionsEnabled && vm.notchState == .closed {
Color.clear
.frame(height: 8)
.frame(maxWidth: .infinity, alignment: .top)
.contentShape(Rectangle())
.onHover { hovering in
handleHover(hovering)
}
.onTapGesture {
if Defaults[.enableHaptics] {
triggerHapticIfAllowed()
}
openNotch()
}
}
}
.background(WindowAccessor { window in
hostingWindow = window
})
.onAppear {
startGlobalClickMonitor()
}
.onDisappear {
stopGlobalClickMonitor()
} }
.frame( .frame(
maxWidth: dynamicNotchSize.width, maxWidth: dynamicNotchSize.width,
@ -452,6 +427,7 @@ struct ContentView: View {
releaseMusicControlWindowUpdates(after: musicControlResumeDelay) releaseMusicControlWindowUpdates(after: musicControlResumeDelay)
enqueueMusicControlWindowSync(forceRefresh: true, delay: 0.05) enqueueMusicControlWindowSync(forceRefresh: true, delay: 0.05)
} }
} }
.onChange(of: musicControlWindowEnabled) { _, enabled in .onChange(of: musicControlWindowEnabled) { _, enabled in
if enabled { if enabled {
@ -530,6 +506,7 @@ struct ContentView: View {
} }
.onDisappear { .onDisappear {
hoverTask?.cancel() hoverTask?.cancel()
stopHoverClickMonitor()
cancelMusicControlWindowSync() cancelMusicControlWindowSync()
hideMusicControlWindow() hideMusicControlWindow()
cancelMusicControlVisibilityTimer() cancelMusicControlVisibilityTimer()
@ -1458,34 +1435,25 @@ struct ContentView: View {
} }
} }
private func startGlobalClickMonitor() { private func startHoverClickMonitor() {
guard clickMonitor == nil else { return } guard hoverClickMonitor == nil else { return }
clickMonitor = NSEvent.addGlobalMonitorForEvents(matching: [.leftMouseDown]) { _ in hoverClickMonitor = NSEvent.addGlobalMonitorForEvents(matching: [.leftMouseDown]) { _ in
handleGlobalClick() Task { @MainActor in
} guard !lockScreenManager.isLocked else { return }
} guard vm.notchState == .closed else { return }
guard isHovering else { return }
private func stopGlobalClickMonitor() { if Defaults[.enableHaptics] {
if let clickMonitor { triggerHapticIfAllowed()
NSEvent.removeMonitor(clickMonitor) }
self.clickMonitor = nil openNotch()
}
}
private func handleGlobalClick() {
guard !lockScreenManager.isLocked else { return }
guard vm.notchState == .closed else { return }
guard let hostingWindow else { return }
let cursorLocation = NSEvent.mouseLocation
let hitFrame = hostingWindow.frame.insetBy(dx: -2, dy: -2)
guard hitFrame.contains(cursorLocation) else { return }
DispatchQueue.main.async {
if Defaults[.enableHaptics] {
triggerHapticIfAllowed()
} }
openNotch() }
}
private func stopHoverClickMonitor() {
if let hoverClickMonitor {
NSEvent.removeMonitor(hoverClickMonitor)
self.hoverClickMonitor = nil
} }
} }
@ -1495,6 +1463,12 @@ struct ContentView: View {
private func handleHover(_ hovering: Bool) { private func handleHover(_ hovering: Bool) {
hoverTask?.cancel() hoverTask?.cancel()
if hovering {
startHoverClickMonitor()
} else {
stopHoverClickMonitor()
}
if hovering { if hovering {
withAnimation(.bouncy.speed(1.2)) { withAnimation(.bouncy.speed(1.2)) {
isHovering = true isHovering = true
@ -2051,24 +2025,6 @@ struct ContentView: View {
} }
} }
private struct WindowAccessor: NSViewRepresentable {
let callback: (NSWindow?) -> Void
func makeNSView(context: Context) -> NSView {
let view = NSView(frame: .zero)
DispatchQueue.main.async { [weak view] in
callback(view?.window)
}
return view
}
func updateNSView(_ nsView: NSView, context: Context) {
DispatchQueue.main.async { [weak nsView] in
callback(nsView?.window)
}
}
}
private enum MusicSecondaryLiveActivity: Equatable { private enum MusicSecondaryLiveActivity: Equatable {
case timer case timer
case reminder(ReminderLiveActivityManager.ReminderEntry) case reminder(ReminderLiveActivityManager.ReminderEntry)