mirror of
https://github.com/utmapp/UTM.git
synced 2026-10-12 02:24:01 +00:00
display(macOS): fix crash due to menu item being removed when entering full screen
Fixes #7377
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user