2
0
Эх сурвалжийг харах

config(macOS): workaround crash when device is removed while focused

Fixes #5901
osy 1 жил өмнө
parent
commit
412878ad9e

+ 11 - 0
Platform/macOS/VMAppleSettingsView.swift

@@ -76,6 +76,7 @@ struct VMAppleSettingsView: View {
                                     ToolbarItem(placement: .destructiveAction) {
                                     ToolbarItem(placement: .destructiveAction) {
                                         Button("Remove") {
                                         Button("Remove") {
                                             config.displays.removeAll(where: { $0.id == display.id })
                                             config.displays.removeAll(where: { $0.id == display.id })
+                                            refresh()
                                         }
                                         }
                                     }
                                     }
                                 }
                                 }
@@ -84,6 +85,7 @@ struct VMAppleSettingsView: View {
                         }.contextMenu {
                         }.contextMenu {
                             DestructiveButton("Remove") {
                             DestructiveButton("Remove") {
                                 config.displays.removeAll(where: { $0.id == display.id })
                                 config.displays.removeAll(where: { $0.id == display.id })
+                                refresh()
                             }
                             }
                         }
                         }
                     }
                     }
@@ -97,6 +99,7 @@ struct VMAppleSettingsView: View {
                             ToolbarItem(placement: .destructiveAction) {
                             ToolbarItem(placement: .destructiveAction) {
                                 Button("Remove") {
                                 Button("Remove") {
                                     config.serials.removeAll(where: { $0.id == serial.id })
                                     config.serials.removeAll(where: { $0.id == serial.id })
+                                    refresh()
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -105,6 +108,7 @@ struct VMAppleSettingsView: View {
                 }.contextMenu {
                 }.contextMenu {
                     DestructiveButton("Remove") {
                     DestructiveButton("Remove") {
                         config.serials.removeAll(where: { $0.id == serial.id })
                         config.serials.removeAll(where: { $0.id == serial.id })
+                        refresh()
                     }
                     }
                 }
                 }
             }
             }
@@ -116,6 +120,7 @@ struct VMAppleSettingsView: View {
                             ToolbarItem(placement: .destructiveAction) {
                             ToolbarItem(placement: .destructiveAction) {
                                 Button("Remove") {
                                 Button("Remove") {
                                     config.networks.removeAll(where: { $0.id == network.id })
                                     config.networks.removeAll(where: { $0.id == network.id })
+                                    refresh()
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -124,6 +129,7 @@ struct VMAppleSettingsView: View {
                 }.contextMenu {
                 }.contextMenu {
                     DestructiveButton("Remove") {
                     DestructiveButton("Remove") {
                         config.networks.removeAll(where: { $0.id == network.id })
                         config.networks.removeAll(where: { $0.id == network.id })
+                        refresh()
                     }
                     }
                 }
                 }
             }
             }
@@ -133,6 +139,11 @@ struct VMAppleSettingsView: View {
             VMDrivesSettingsView(drives: $config.drives, template: UTMAppleConfigurationDrive(newSize: 10240))
             VMDrivesSettingsView(drives: $config.drives, template: UTMAppleConfigurationDrive(newSize: 10240))
         }
         }
     }
     }
+
+    private func refresh() {
+        // SwiftUI bug: if a TextField is focused while a device is removed, the app will crash
+        infoActive = true
+    }
 }
 }
 
 
 struct VMAppleSettingsView_Previews: PreviewProvider {
 struct VMAppleSettingsView_Previews: PreviewProvider {

+ 13 - 0
Platform/macOS/VMQEMUSettingsView.swift

@@ -81,6 +81,7 @@ struct VMQEMUSettingsView: View {
                             ToolbarItem(placement: .destructiveAction) {
                             ToolbarItem(placement: .destructiveAction) {
                                 Button("Remove") {
                                 Button("Remove") {
                                     config.displays.removeAll(where: { $0.id == display.id })
                                     config.displays.removeAll(where: { $0.id == display.id })
+                                    refresh()
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -89,6 +90,7 @@ struct VMQEMUSettingsView: View {
                 }.contextMenu {
                 }.contextMenu {
                     DestructiveButton("Remove") {
                     DestructiveButton("Remove") {
                         config.displays.removeAll(where: { $0.id == display.id })
                         config.displays.removeAll(where: { $0.id == display.id })
+                        refresh()
                     }
                     }
                 }
                 }
             }
             }
@@ -100,6 +102,7 @@ struct VMQEMUSettingsView: View {
                             ToolbarItem(placement: .destructiveAction) {
                             ToolbarItem(placement: .destructiveAction) {
                                 Button("Remove") {
                                 Button("Remove") {
                                     config.serials.removeAll(where: { $0.id == serial.id })
                                     config.serials.removeAll(where: { $0.id == serial.id })
+                                    refresh()
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -108,6 +111,7 @@ struct VMQEMUSettingsView: View {
                 }.contextMenu {
                 }.contextMenu {
                     DestructiveButton("Remove") {
                     DestructiveButton("Remove") {
                         config.serials.removeAll(where: { $0.id == serial.id })
                         config.serials.removeAll(where: { $0.id == serial.id })
+                        refresh()
                     }
                     }
                 }
                 }
             }
             }
@@ -119,6 +123,7 @@ struct VMQEMUSettingsView: View {
                             ToolbarItem(placement: .destructiveAction) {
                             ToolbarItem(placement: .destructiveAction) {
                                 Button("Remove") {
                                 Button("Remove") {
                                     config.networks.removeAll(where: { $0.id == network.id })
                                     config.networks.removeAll(where: { $0.id == network.id })
+                                    refresh()
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -127,6 +132,7 @@ struct VMQEMUSettingsView: View {
                 }.contextMenu {
                 }.contextMenu {
                     DestructiveButton("Remove") {
                     DestructiveButton("Remove") {
                         config.networks.removeAll(where: { $0.id == network.id })
                         config.networks.removeAll(where: { $0.id == network.id })
+                        refresh()
                     }
                     }
                 }
                 }
                 if #available(macOS 12, *), network.mode == .emulated {
                 if #available(macOS 12, *), network.mode == .emulated {
@@ -147,6 +153,7 @@ struct VMQEMUSettingsView: View {
                             ToolbarItem(placement: .destructiveAction) {
                             ToolbarItem(placement: .destructiveAction) {
                                 Button("Remove") {
                                 Button("Remove") {
                                     config.sound.removeAll(where: { $0.id == sound.id })
                                     config.sound.removeAll(where: { $0.id == sound.id })
+                                    refresh()
                                 }
                                 }
                             }
                             }
                         }
                         }
@@ -155,6 +162,7 @@ struct VMQEMUSettingsView: View {
                 }.contextMenu {
                 }.contextMenu {
                     DestructiveButton("Remove") {
                     DestructiveButton("Remove") {
                         config.sound.removeAll(where: { $0.id == sound.id })
                         config.sound.removeAll(where: { $0.id == sound.id })
+                        refresh()
                     }
                     }
                 }
                 }
             }
             }
@@ -164,6 +172,11 @@ struct VMQEMUSettingsView: View {
             VMDrivesSettingsView(drives: $config.drives, template: UTMQemuConfigurationDrive(forArchitecture: config.system.architecture, target: config.system.target))
             VMDrivesSettingsView(drives: $config.drives, template: UTMQemuConfigurationDrive(forArchitecture: config.system.architecture, target: config.system.target))
         }
         }
     }
     }
+
+    private func refresh() {
+        // SwiftUI bug: if a TextField is focused while a device is removed, the app will crash
+        infoActive = true
+    }
 }
 }
 
 
 struct VMQEMUSettingsView_Previews: PreviewProvider {
 struct VMQEMUSettingsView_Previews: PreviewProvider {