mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-28 23:54:32 +00:00
Remove Click Monitor, partially tested working
This commit is contained in:
parent
72d101b1be
commit
539d9185a6
1 changed files with 26 additions and 70 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue