aboutsummaryrefslogtreecommitdiff
path: root/Sources
diff options
context:
space:
mode:
authorTommaso Negri <me@tommasongr.com>2026-08-12 14:34:33 +0200
committerTommaso Negri <me@tommasongr.com>2026-08-12 14:34:33 +0200
commitf16c284b969ef0728fdbffef94f4fd5d02e44c3e (patch)
treef910b1c74190f58699699ace6ee524a98a890e57 /Sources
parent42a6cd63e876a3f9e1f75c866487b7b2e4eb361c (diff)
downloadbar-f16c284b969ef0728fdbffef94f4fd5d02e44c3e.tar.gz
bar-f16c284b969ef0728fdbffef94f4fd5d02e44c3e.zip
prevent events monitor leak
Diffstat (limited to 'Sources')
-rw-r--r--Sources/bar/Views/BlockView.swift38
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