From e72cfbf447b733f44a18ba44a26271c4eb9dae87 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 13 Nov 2020 18:03:46 -0500 Subject: [PATCH 1/7] Stop assuming that NSNotification => window.isVisible. --- .../Documents/MachineDocument.swift | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index fffea8e3a..158786bfb 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -144,35 +144,37 @@ class MachineDocument: private var interactionMode: InteractionMode = .notStarted // Attempting to show a sheet before the window is visible (such as when the NIB is loaded) results in - // a sheet mysteriously floating on its own. For now, use windowDidUpdate as a proxy to know that the window - // is visible, though it's a little premature. + // a sheet mysteriously floating on its own. For now, use windowDidUpdate as a proxy to check whether + // the window is visible. func windowDidUpdate(_ notification: Notification) { - // Grab the regular window title, if it's not already stored. - if self.unadornedWindowTitle.count == 0 { - self.unadornedWindowTitle = self.windowControllers[0].window!.title - } - - // If an interaction mode is not yet in effect, pick the proper one and display the relevant thing. - if self.interactionMode == .notStarted { - // If a full machine exists, just continue showing it. - if self.machine != nil { - self.interactionMode = .showingMachine - setupMachineOutput() - return + if let window = self.windowControllers[0].window, window.isVisible { + // Grab the regular window title, if it's not already stored. + if self.unadornedWindowTitle.count == 0 { + self.unadornedWindowTitle = window.title } - // If a machine has been picked but is not showing, there must be ROMs missing. - if self.machineDescription != nil { - self.interactionMode = .showingROMRequester - requestRoms() - return - } + // If an interaction mode is not yet in effect, pick the proper one and display the relevant thing. + if self.interactionMode == .notStarted { + // If a full machine exists, just continue showing it. + if self.machine != nil { + self.interactionMode = .showingMachine + setupMachineOutput() + return + } - // If a machine hasn't even been picked yet, show the machine picker. - self.interactionMode = .showingMachinePicker - Bundle.main.loadNibNamed("MachinePicker", owner: self, topLevelObjects: nil) - self.machinePicker?.establishStoredOptions() - self.windowControllers[0].window?.beginSheet(self.machinePickerPanel!, completionHandler: nil) + // If a machine has been picked but is not showing, there must be ROMs missing. + if self.machineDescription != nil { + self.interactionMode = .showingROMRequester + requestRoms() + return + } + + // If a machine hasn't even been picked yet, show the machine picker. + self.interactionMode = .showingMachinePicker + Bundle.main.loadNibNamed("MachinePicker", owner: self, topLevelObjects: nil) + self.machinePicker?.establishStoredOptions() + window.beginSheet(self.machinePickerPanel!, completionHandler: nil) + } } } From a7aeb779e9184512130584cdf901df5050ceeec2 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 13 Nov 2020 18:07:45 -0500 Subject: [PATCH 2/7] Disables Apple Silicon binaries until I have some means to test. --- OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 966232880..4058d6f98 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -5395,6 +5395,7 @@ INFOPLIST_FILE = "Clock Signal/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; MTL_TREAT_WARNINGS_AS_ERRORS = YES; + ONLY_ACTIVE_ARCH = YES; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-Wreorder", From 2c71ba0744a958e43095fc29a4360d7dafa358ef Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 13 Nov 2020 18:29:48 -0500 Subject: [PATCH 3/7] Ameliorates against a potential NSRangeException. --- .../Mac/Clock Signal/MachinePicker/MachinePicker.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift b/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift index 30977db28..2c7b40226 100644 --- a/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift +++ b/OSBindings/Mac/Clock Signal/MachinePicker/MachinePicker.swift @@ -51,7 +51,11 @@ class MachinePicker: NSObject { // Machine type if let machineIdentifier = standardUserDefaults.string(forKey: "new.machine") { - machineSelector?.selectTabViewItem(withIdentifier: machineIdentifier as Any) + // If I've changed my mind about visible tabs between versions, there may not be one that corresponds + // to the stored identifier. Make sure not to raise an NSRangeException in that scenario. + if let index = machineSelector?.indexOfTabViewItem(withIdentifier: machineIdentifier as Any), index != NSNotFound { + machineSelector?.selectTabViewItem(at: index) + } } // Apple II settings From e1ecf664852f5b97cbe881ca756daac5a3c86181 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 13 Nov 2020 19:00:37 -0500 Subject: [PATCH 4/7] Dismisses sheet before closing document. --- OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 158786bfb..f779a6bbc 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -364,6 +364,8 @@ class MachineDocument: } @IBAction func cancelCreateMachine(_ sender: NSButton?) { + self.windowControllers[0].window?.endSheet(self.machinePickerPanel!) + self.machinePicker = nil close() } From 4862ccc947b3bb6638a23a8a29b25eef116510d1 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 13 Nov 2020 19:01:53 -0500 Subject: [PATCH 5/7] Dismisses ROM requester upon that cancel too. --- OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index f779a6bbc..2337a84af 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -395,6 +395,7 @@ class MachineDocument: } @IBAction func cancelRequestROMs(_ sender: NSButton?) { + self.windowControllers[0].window?.endSheet(self.romRequesterPanel!) close() } From 5dbc87caf0b4e6ea548baa7972dea766786201cb Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 13 Nov 2020 19:09:30 -0500 Subject: [PATCH 6/7] Smarter: just ensures any attached panels are closed at close(). --- .../Documents/MachineDocument.swift | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 2337a84af..47d423d40 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -88,14 +88,30 @@ class MachineDocument: } override func close() { + // Close any dangling sheets. + // + // Be warned: in 11.0 at least, if there are any panels then posting the endSheet request + // will defer the close(), and close() will be called again at the end of that animation. + // + // So: MAKE SURE IT'S SAFE TO ENTER THIS FUNCTION TWICE. Hence the non-assumption here about + // any windows still existing. + if self.windowControllers.count > 0, let window = self.windowControllers[0].window { + for sheet in window.sheets { + window.endSheet(sheet) + } + } + + // Stop the machine, if any. machine?.stop() + // Dismiss panels. activityPanel?.setIsVisible(false) activityPanel = nil optionsPanel?.setIsVisible(false) optionsPanel = nil + // End the update cycle. actionLock.lock() drawLock.lock() machine = nil @@ -103,6 +119,7 @@ class MachineDocument: actionLock.unlock() drawLock.unlock() + // Let the document controller do its thing. super.close() } @@ -364,8 +381,6 @@ class MachineDocument: } @IBAction func cancelCreateMachine(_ sender: NSButton?) { - self.windowControllers[0].window?.endSheet(self.machinePickerPanel!) - self.machinePicker = nil close() } @@ -395,7 +410,6 @@ class MachineDocument: } @IBAction func cancelRequestROMs(_ sender: NSButton?) { - self.windowControllers[0].window?.endSheet(self.romRequesterPanel!) close() } From e803f993b741cdce16b4905bdf49284402f144d7 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Fri, 13 Nov 2020 19:48:45 -0500 Subject: [PATCH 7/7] Increases minimum macOS version to 10.14. This is lazy, but it means I definitely don't need non-Metal fallback code. --- .../Mac/Clock Signal.xcodeproj/project.pbxproj | 12 ++---------- .../Mac/Clock Signal/Documents/MachineDocument.swift | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj index 4058d6f98..01b08feff 100644 --- a/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj +++ b/OSBindings/Mac/Clock Signal.xcodeproj/project.pbxproj @@ -5175,7 +5175,6 @@ "$(USER_LIBRARY_DIR)/Frameworks", ); GCC_C_LANGUAGE_STANDARD = gnu11; - MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -5198,7 +5197,6 @@ GCC_C_LANGUAGE_STANDARD = gnu11; GCC_OPTIMIZATION_LEVEL = 2; GCC_PREPROCESSOR_DEFINITIONS = NDEBUG; - MACOSX_DEPLOYMENT_TARGET = 10.10; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -5252,7 +5250,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -5305,7 +5303,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_PARAMETER = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; @@ -5327,7 +5325,6 @@ CODE_SIGN_ENTITLEMENTS = "Clock Signal/Clock Signal.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = DV3346VVUN; ENABLE_HARDENED_RUNTIME = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -5373,7 +5370,6 @@ CODE_SIGN_ENTITLEMENTS = "Clock Signal/Clock Signal.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = DV3346VVUN; ENABLE_HARDENED_RUNTIME = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -5417,7 +5413,6 @@ CODE_SIGN_ENTITLEMENTS = "Clock Signal/Clock Signal.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = NO; INFOPLIST_FILE = "Clock SignalTests/Info.plist"; @@ -5441,7 +5436,6 @@ CODE_SIGN_ENTITLEMENTS = "Clock Signal/Clock Signal.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = NO; GCC_OPTIMIZATION_LEVEL = 2; @@ -5459,7 +5453,6 @@ 4BB73ECD1B587A5100552FC2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = CP2SKEB3XT; INFOPLIST_FILE = "Clock SignalUITests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; @@ -5474,7 +5467,6 @@ 4BB73ECE1B587A5100552FC2 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = CP2SKEB3XT; INFOPLIST_FILE = "Clock SignalUITests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index 47d423d40..25436b72f 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -164,7 +164,7 @@ class MachineDocument: // a sheet mysteriously floating on its own. For now, use windowDidUpdate as a proxy to check whether // the window is visible. func windowDidUpdate(_ notification: Notification) { - if let window = self.windowControllers[0].window, window.isVisible { + if self.windowControllers.count > 0, let window = self.windowControllers[0].window, window.isVisible { // Grab the regular window title, if it's not already stored. if self.unadornedWindowTitle.count == 0 { self.unadornedWindowTitle = window.title