From 12d9a13af06cb4ad96c5537c1af14b419b5e17bd Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 13 Dec 2025 03:11:06 +0000 Subject: [PATCH] fix(mac): preserve SwiftUI menu delegate --- .../Clawdis/MenuContextCardInjector.swift | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/apps/macos/Sources/Clawdis/MenuContextCardInjector.swift b/apps/macos/Sources/Clawdis/MenuContextCardInjector.swift index fa6a22ca6..22ae51593 100644 --- a/apps/macos/Sources/Clawdis/MenuContextCardInjector.swift +++ b/apps/macos/Sources/Clawdis/MenuContextCardInjector.swift @@ -7,13 +7,21 @@ final class MenuContextCardInjector: NSObject, NSMenuDelegate { private let tag = 9_415_227 private let cardWidth: CGFloat = 320 + private weak var originalDelegate: NSMenuDelegate? func install(into statusItem: NSStatusItem) { // SwiftUI owns the menu, but we can inject a custom NSMenuItem.view right before display. - statusItem.menu?.delegate = self + guard let menu = statusItem.menu else { return } + // Preserve SwiftUI's internal NSMenuDelegate, otherwise it may stop populating menu items. + if menu.delegate !== self { + self.originalDelegate = menu.delegate + menu.delegate = self + } } func menuWillOpen(_ menu: NSMenu) { + self.originalDelegate?.menuWillOpen?(menu) + // Remove any previous injected card items. for item in menu.items where item.tag == self.tag { menu.removeItem(item) @@ -34,6 +42,21 @@ final class MenuContextCardInjector: NSObject, NSMenuDelegate { menu.insertItem(item, at: insertIndex) } + func menuDidClose(_ menu: NSMenu) { + self.originalDelegate?.menuDidClose?(menu) + } + + func menuNeedsUpdate(_ menu: NSMenu) { + self.originalDelegate?.menuNeedsUpdate?(menu) + } + + func confinementRect(for menu: NSMenu, on screen: NSScreen?) -> NSRect { + if let rect = self.originalDelegate?.confinementRect?(for: menu, on: screen) { + return rect + } + return NSRect.zero + } + private func findInsertIndex(in menu: NSMenu) -> Int? { // Prefer inserting before the "Send Heartbeats" toggle item. if let idx = menu.items.firstIndex(where: { $0.title == "Send Heartbeats" }) { @@ -44,4 +67,3 @@ final class MenuContextCardInjector: NSObject, NSMenuDelegate { return menu.items.count } } -