Skip to content

Commit b61dc2b

Browse files
committed
display(macOS): fix crash due to menu item being removed when entering full screen
Fixes #7377
1 parent 512acc1 commit b61dc2b

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

Platform/macOS/Display/VMDisplayWindowController.swift

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ extension VMDisplayWindowController: NSWindowDelegate {
459459
if let preventIdleSleepAssertion = preventIdleSleepAssertion {
460460
IOPMAssertionRelease(preventIdleSleepAssertion)
461461
}
462+
cleanupMenu()
462463
isFinalizing = true
463464
onClose?()
464465
}
@@ -542,6 +543,7 @@ extension VMDisplayWindowController {
542543
@objc func setupMainMenu() -> NSMenu {
543544
NotificationCenter.default.addObserver(self, selector: #selector(windowBecameMain), name: NSWindow.didBecomeMainNotification, object: window)
544545
NotificationCenter.default.addObserver(self, selector: #selector(windowResignedMain), name: NSWindow.didResignMainNotification, object: window)
546+
NotificationCenter.default.addObserver(self, selector: #selector(menuDidRemoveItem), name: NSMenu.didRemoveItemNotification, object: NSApp.mainMenu)
545547
let menu = NSMenu()
546548
menu.autoenablesItems = false
547549
stopMenuItem = NSMenuItem()
@@ -576,17 +578,35 @@ extension VMDisplayWindowController {
576578
return menu
577579
}
578580

579-
@objc func windowBecameMain() {
580-
if let mainMenu = NSApp.mainMenu {
581+
func cleanupMenu() {
582+
NotificationCenter.default.removeObserver(self, name: NSWindow.didBecomeMainNotification, object: window)
583+
NotificationCenter.default.removeObserver(self, name: NSWindow.didResignMainNotification, object: window)
584+
NotificationCenter.default.removeObserver(self, name: NSMenu.didRemoveItemNotification, object: NSApp.mainMenu)
585+
if let mainMenu = NSApp.mainMenu, mainMenu.items.contains(mainMenuItem!) {
586+
mainMenu.removeItem(mainMenuItem)
587+
}
588+
}
589+
590+
@objc func windowBecameMain(_ notification: Notification) {
591+
if let mainMenu = NSApp.mainMenu, !mainMenu.items.contains(mainMenuItem) {
581592
mainMenu.insertItem(mainMenuItem, at: 3)
582593
}
583594
}
584595

585-
@objc func windowResignedMain() {
586-
if let mainMenu = NSApp.mainMenu {
596+
@objc func windowResignedMain(_ notification: Notification) {
597+
if let mainMenu = NSApp.mainMenu, mainMenu.items.contains(mainMenuItem) {
587598
mainMenu.removeItem(mainMenuItem)
588599
}
589600
}
601+
602+
@objc func menuDidRemoveItem(_ notification: Notification) {
603+
guard let window = window, window.isMainWindow else {
604+
return
605+
}
606+
if let mainMenu = NSApp.mainMenu, !mainMenu.items.contains(mainMenuItem) {
607+
mainMenu.insertItem(mainMenuItem, at: 3)
608+
}
609+
}
590610
}
591611

592612
private class LazyMenuItem: NSMenuItem, NSMenuDelegate {

0 commit comments

Comments
 (0)