display(macOS): fix crash due to menu item being removed when entering full screen

Fixes #7377
This commit is contained in:
osy
2025-08-26 11:51:04 -07:00
parent 512acc121a
commit b61dc2b2f4
@@ -459,6 +459,7 @@ extension VMDisplayWindowController: NSWindowDelegate {
if let preventIdleSleepAssertion = preventIdleSleepAssertion {
IOPMAssertionRelease(preventIdleSleepAssertion)
}
cleanupMenu()
isFinalizing = true
onClose?()
}
@@ -542,6 +543,7 @@ extension VMDisplayWindowController {
@objc func setupMainMenu() -> NSMenu {
NotificationCenter.default.addObserver(self, selector: #selector(windowBecameMain), name: NSWindow.didBecomeMainNotification, object: window)
NotificationCenter.default.addObserver(self, selector: #selector(windowResignedMain), name: NSWindow.didResignMainNotification, object: window)
NotificationCenter.default.addObserver(self, selector: #selector(menuDidRemoveItem), name: NSMenu.didRemoveItemNotification, object: NSApp.mainMenu)
let menu = NSMenu()
menu.autoenablesItems = false
stopMenuItem = NSMenuItem()
@@ -576,17 +578,35 @@ extension VMDisplayWindowController {
return menu
}
@objc func windowBecameMain() {
if let mainMenu = NSApp.mainMenu {
func cleanupMenu() {
NotificationCenter.default.removeObserver(self, name: NSWindow.didBecomeMainNotification, object: window)
NotificationCenter.default.removeObserver(self, name: NSWindow.didResignMainNotification, object: window)
NotificationCenter.default.removeObserver(self, name: NSMenu.didRemoveItemNotification, object: NSApp.mainMenu)
if let mainMenu = NSApp.mainMenu, mainMenu.items.contains(mainMenuItem!) {
mainMenu.removeItem(mainMenuItem)
}
}
@objc func windowBecameMain(_ notification: Notification) {
if let mainMenu = NSApp.mainMenu, !mainMenu.items.contains(mainMenuItem) {
mainMenu.insertItem(mainMenuItem, at: 3)
}
}
@objc func windowResignedMain() {
if let mainMenu = NSApp.mainMenu {
@objc func windowResignedMain(_ notification: Notification) {
if let mainMenu = NSApp.mainMenu, mainMenu.items.contains(mainMenuItem) {
mainMenu.removeItem(mainMenuItem)
}
}
@objc func menuDidRemoveItem(_ notification: Notification) {
guard let window = window, window.isMainWindow else {
return
}
if let mainMenu = NSApp.mainMenu, !mainMenu.items.contains(mainMenuItem) {
mainMenu.insertItem(mainMenuItem, at: 3)
}
}
}
private class LazyMenuItem: NSMenuItem, NSMenuDelegate {