diff options
| author | Tommaso Negri <me@tommasongr.com> | 2026-08-12 14:34:33 +0200 |
|---|---|---|
| committer | Tommaso Negri <me@tommasongr.com> | 2026-08-12 14:34:33 +0200 |
| commit | f16c284b969ef0728fdbffef94f4fd5d02e44c3e (patch) | |
| tree | f910b1c74190f58699699ace6ee524a98a890e57 /Sources | |
| parent | 42a6cd63e876a3f9e1f75c866487b7b2e4eb361c (diff) | |
| download | bar-f16c284b969ef0728fdbffef94f4fd5d02e44c3e.tar.gz bar-f16c284b969ef0728fdbffef94f4fd5d02e44c3e.zip | |
prevent events monitor leak
Diffstat (limited to 'Sources')
| -rw-r--r-- | Sources/bar/Views/BlockView.swift | 38 |
1 files changed, 20 insertions, 18 deletions
diff --git a/Sources/bar/Views/BlockView.swift b/Sources/bar/Views/BlockView.swift index 85d6e6e..4158f85 100644 --- a/Sources/bar/Views/BlockView.swift +++ b/Sources/bar/Views/BlockView.swift @@ -4,6 +4,7 @@ struct BlockView: View { @ObservedObject var block: Block @State private var hovering = false + @State private var eventsMonitor: Any? var body: some View { HStack(spacing: 0) { @@ -13,43 +14,44 @@ struct BlockView: View { } .onHover { hovering = $0 } .onAppear { - NSEvent.addLocalMonitorForEvents(matching: [ + let monitor = NSEvent.addLocalMonitorForEvents(matching: [ .leftMouseDown, .rightMouseDown, .otherMouseDown, .scrollWheel, - ]) { event in - handle(event: event) + ]) { [weak block] event in + guard let block else { return event } + return handle(event: event, block: block) + } + self.eventsMonitor = monitor as Any + } + .onDisappear { + if let eventsMonitor { + NSEvent.removeMonitor(eventsMonitor) + self.eventsMonitor = nil } } } - private func handle(event: NSEvent) -> NSEvent { + /// Processes an event when the block is hovered, re-running the script + /// with the appropriate environment variable. + /// + /// - Returns: The original event so the system continues normal delivery. + private func handle(event: NSEvent, block: Block) -> NSEvent { guard hovering else { return event } switch event.type { case .leftMouseDown, .rightMouseDown, .otherMouseDown: block.runScript(env: ["BUTTON": String(event.buttonNumber)]) - break case .scrollWheel: if event.scrollingDeltaY > 0 { block.runScript(env: ["SCROLL": "UP"]) - break - } - - if event.scrollingDeltaY < 0 { + } else if event.scrollingDeltaY < 0 { block.runScript(env: ["SCROLL": "DOWN"]) - break - } - - if event.scrollingDeltaX > 0 { + } else if event.scrollingDeltaX > 0 { block.runScript(env: ["SCROLL": "RIGHT"]) - break - } - - if event.scrollingDeltaX < 0 { + } else if event.scrollingDeltaX < 0 { block.runScript(env: ["SCROLL": "LEFT"]) - break } default: break |
