From dffc91c5e0b25dd35816f20f016aa2597d648c5d Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Sat, 4 Oct 2025 13:02:19 +0300 Subject: [PATCH] New project for mac app --- .../NesApp/NesApp.xcodeproj/project.pbxproj | 234 +++++++++--------- .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../UserInterfaceState.xcuserstate | Bin 15885 -> 17708 bytes examples/NesApp/NesApp/AppDelegate.swift | 36 --- .../AppIcon.appiconset/Contents.json | 72 ++++++ .../NesApp/Base.lproj/LaunchScreen.storyboard | 25 -- .../NesApp/NesApp/Base.lproj/Main.storyboard | 24 -- examples/NesApp/NesApp/ContentView.swift | 24 ++ examples/NesApp/NesApp/Info.plist | 25 -- examples/NesApp/NesApp/NesAppApp.swift | 17 ++ examples/NesApp/NesApp/NesView/NesView.swift | 31 +++ examples/NesApp/NesApp/SceneDelegate.swift | 52 ---- examples/NesApp/NesApp/ViewController.swift | 72 ------ 13 files changed, 259 insertions(+), 361 deletions(-) delete mode 100644 examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 examples/NesApp/NesApp/AppDelegate.swift delete mode 100644 examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard delete mode 100644 examples/NesApp/NesApp/Base.lproj/Main.storyboard create mode 100644 examples/NesApp/NesApp/ContentView.swift delete mode 100644 examples/NesApp/NesApp/Info.plist create mode 100644 examples/NesApp/NesApp/NesAppApp.swift create mode 100644 examples/NesApp/NesApp/NesView/NesView.swift delete mode 100644 examples/NesApp/NesApp/SceneDelegate.swift delete mode 100644 examples/NesApp/NesApp/ViewController.swift diff --git a/examples/NesApp/NesApp.xcodeproj/project.pbxproj b/examples/NesApp/NesApp.xcodeproj/project.pbxproj index 69d1cad..70a1963 100644 --- a/examples/NesApp/NesApp.xcodeproj/project.pbxproj +++ b/examples/NesApp/NesApp.xcodeproj/project.pbxproj @@ -3,178 +3,141 @@ archiveVersion = 1; classes = { }; - objectVersion = 60; + objectVersion = 77; objects = { /* Begin PBXBuildFile section */ - 7AF4D40F2AC4A97B00717C81 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF4D40E2AC4A97B00717C81 /* AppDelegate.swift */; }; - 7AF4D4112AC4A97B00717C81 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF4D4102AC4A97B00717C81 /* SceneDelegate.swift */; }; - 7AF4D4132AC4A97B00717C81 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AF4D4122AC4A97B00717C81 /* ViewController.swift */; }; - 7AF4D4162AC4A97B00717C81 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7AF4D4142AC4A97B00717C81 /* Main.storyboard */; }; - 7AF4D4182AC4A97D00717C81 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7AF4D4172AC4A97D00717C81 /* Assets.xcassets */; }; - 7AF4D41B2AC4A97D00717C81 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7AF4D4192AC4A97D00717C81 /* LaunchScreen.storyboard */; }; - 7AF4D4242AC4A9D300717C81 /* NesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AF4D4232AC4A9D300717C81 /* NesKit */; }; + 7AE7412B2E912765009C5FD5 /* NesKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AE7412A2E912765009C5FD5 /* NesKit */; }; + 7AE7412D2E912765009C5FD5 /* NesKitSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 7AE7412C2E912765009C5FD5 /* NesKitSwift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 7AF4D40B2AC4A97B00717C81 /* NesApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NesApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7AF4D40E2AC4A97B00717C81 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AF4D4102AC4A97B00717C81 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 7AF4D4122AC4A97B00717C81 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 7AF4D4152AC4A97B00717C81 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 7AF4D4172AC4A97D00717C81 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 7AF4D41A2AC4A97D00717C81 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 7AF4D41C2AC4A97D00717C81 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7AE741182E9125FE009C5FD5 /* NesApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NesApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 7AE7411A2E9125FE009C5FD5 /* NesApp */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = NesApp; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ - 7AF4D4082AC4A97B00717C81 /* Frameworks */ = { + 7AE741152E9125FE009C5FD5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7AF4D4242AC4A9D300717C81 /* NesKit in Frameworks */, + 7AE7412D2E912765009C5FD5 /* NesKitSwift in Frameworks */, + 7AE7412B2E912765009C5FD5 /* NesKit in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 7AF4D4022AC4A97B00717C81 = { + 7AE7410F2E9125FE009C5FD5 = { isa = PBXGroup; children = ( - 7AF4D40D2AC4A97B00717C81 /* NesApp */, - 7AF4D40C2AC4A97B00717C81 /* Products */, + 7AE7411A2E9125FE009C5FD5 /* NesApp */, + 7AE741192E9125FE009C5FD5 /* Products */, ); sourceTree = ""; }; - 7AF4D40C2AC4A97B00717C81 /* Products */ = { + 7AE741192E9125FE009C5FD5 /* Products */ = { isa = PBXGroup; children = ( - 7AF4D40B2AC4A97B00717C81 /* NesApp.app */, + 7AE741182E9125FE009C5FD5 /* NesApp.app */, ); name = Products; sourceTree = ""; }; - 7AF4D40D2AC4A97B00717C81 /* NesApp */ = { - isa = PBXGroup; - children = ( - 7AF4D40E2AC4A97B00717C81 /* AppDelegate.swift */, - 7AF4D4102AC4A97B00717C81 /* SceneDelegate.swift */, - 7AF4D4122AC4A97B00717C81 /* ViewController.swift */, - 7AF4D4142AC4A97B00717C81 /* Main.storyboard */, - 7AF4D4172AC4A97D00717C81 /* Assets.xcassets */, - 7AF4D4192AC4A97D00717C81 /* LaunchScreen.storyboard */, - 7AF4D41C2AC4A97D00717C81 /* Info.plist */, - ); - path = NesApp; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 7AF4D40A2AC4A97B00717C81 /* NesApp */ = { + 7AE741172E9125FE009C5FD5 /* NesApp */ = { isa = PBXNativeTarget; - buildConfigurationList = 7AF4D41F2AC4A97D00717C81 /* Build configuration list for PBXNativeTarget "NesApp" */; + buildConfigurationList = 7AE741232E9125FF009C5FD5 /* Build configuration list for PBXNativeTarget "NesApp" */; buildPhases = ( - 7AF4D4072AC4A97B00717C81 /* Sources */, - 7AF4D4082AC4A97B00717C81 /* Frameworks */, - 7AF4D4092AC4A97B00717C81 /* Resources */, + 7AE741142E9125FE009C5FD5 /* Sources */, + 7AE741152E9125FE009C5FD5 /* Frameworks */, + 7AE741162E9125FE009C5FD5 /* Resources */, ); buildRules = ( ); dependencies = ( ); + fileSystemSynchronizedGroups = ( + 7AE7411A2E9125FE009C5FD5 /* NesApp */, + ); name = NesApp; packageProductDependencies = ( - 7AF4D4232AC4A9D300717C81 /* NesKit */, + 7AE7412A2E912765009C5FD5 /* NesKit */, + 7AE7412C2E912765009C5FD5 /* NesKitSwift */, ); productName = NesApp; - productReference = 7AF4D40B2AC4A97B00717C81 /* NesApp.app */; + productReference = 7AE741182E9125FE009C5FD5 /* NesApp.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 7AF4D4032AC4A97B00717C81 /* Project object */ = { + 7AE741102E9125FE009C5FD5 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1500; - LastUpgradeCheck = 1500; + LastSwiftUpdateCheck = 2600; + LastUpgradeCheck = 2600; TargetAttributes = { - 7AF4D40A2AC4A97B00717C81 = { - CreatedOnToolsVersion = 15.0; + 7AE741172E9125FE009C5FD5 = { + CreatedOnToolsVersion = 26.0.1; }; }; }; - buildConfigurationList = 7AF4D4062AC4A97B00717C81 /* Build configuration list for PBXProject "NesApp" */; - compatibilityVersion = "Xcode 14.0"; + buildConfigurationList = 7AE741132E9125FE009C5FD5 /* Build configuration list for PBXProject "NesApp" */; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); - mainGroup = 7AF4D4022AC4A97B00717C81; + mainGroup = 7AE7410F2E9125FE009C5FD5; + minimizedProjectReferenceProxies = 1; packageReferences = ( - 7AF4D4222AC4A9D300717C81 /* XCLocalSwiftPackageReference "../.." */, + 7AE741292E912765009C5FD5 /* XCLocalSwiftPackageReference "../../../nes" */, ); - productRefGroup = 7AF4D40C2AC4A97B00717C81 /* Products */; + preferredProjectObjectVersion = 77; + productRefGroup = 7AE741192E9125FE009C5FD5 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 7AF4D40A2AC4A97B00717C81 /* NesApp */, + 7AE741172E9125FE009C5FD5 /* NesApp */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 7AF4D4092AC4A97B00717C81 /* Resources */ = { + 7AE741162E9125FE009C5FD5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7AF4D41B2AC4A97D00717C81 /* LaunchScreen.storyboard in Resources */, - 7AF4D4182AC4A97D00717C81 /* Assets.xcassets in Resources */, - 7AF4D4162AC4A97B00717C81 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 7AF4D4072AC4A97B00717C81 /* Sources */ = { + 7AE741142E9125FE009C5FD5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7AF4D4132AC4A97B00717C81 /* ViewController.swift in Sources */, - 7AF4D40F2AC4A97B00717C81 /* AppDelegate.swift in Sources */, - 7AF4D4112AC4A97B00717C81 /* SceneDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXVariantGroup section */ - 7AF4D4142AC4A97B00717C81 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 7AF4D4152AC4A97B00717C81 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 7AF4D4192AC4A97D00717C81 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 7AF4D41A2AC4A97D00717C81 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ - 7AF4D41D2AC4A97D00717C81 /* Debug */ = { + 7AE741212E9125FF009C5FD5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -209,6 +172,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 46DTTB8X4S; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -226,18 +190,16 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; - 7AF4D41E2AC4A97D00717C81 /* Release */ = { + 7AE741222E9125FF009C5FD5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -272,6 +234,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 46DTTB8X4S; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -283,17 +246,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; - VALIDATE_PRODUCT = YES; }; name = Release; }; - 7AF4D4202AC4A97D00717C81 /* Debug */ = { + 7AE741242E9125FF009C5FD5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -301,27 +261,43 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 46DTTB8X4S; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = NesApp/Info.plist; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 26.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.NesApp; PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 26.0; }; name = Debug; }; - 7AF4D4212AC4A97D00717C81 /* Release */ = { + 7AE741252E9125FF009C5FD5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -329,43 +305,59 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 46DTTB8X4S; + ENABLE_APP_SANDBOX = YES; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + ENABLE_USER_SELECTED_FILES = readonly; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = NesApp/Info.plist; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 26.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = pro.aliencat.NesApp; PRODUCT_NAME = "$(TARGET_NAME)"; + REGISTER_APP_GROUPS = YES; + SDKROOT = auto; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,7"; + XROS_DEPLOYMENT_TARGET = 26.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 7AF4D4062AC4A97B00717C81 /* Build configuration list for PBXProject "NesApp" */ = { + 7AE741132E9125FE009C5FD5 /* Build configuration list for PBXProject "NesApp" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7AF4D41D2AC4A97D00717C81 /* Debug */, - 7AF4D41E2AC4A97D00717C81 /* Release */, + 7AE741212E9125FF009C5FD5 /* Debug */, + 7AE741222E9125FF009C5FD5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 7AF4D41F2AC4A97D00717C81 /* Build configuration list for PBXNativeTarget "NesApp" */ = { + 7AE741232E9125FF009C5FD5 /* Build configuration list for PBXNativeTarget "NesApp" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7AF4D4202AC4A97D00717C81 /* Debug */, - 7AF4D4212AC4A97D00717C81 /* Release */, + 7AE741242E9125FF009C5FD5 /* Debug */, + 7AE741252E9125FF009C5FD5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -373,18 +365,22 @@ /* End XCConfigurationList section */ /* Begin XCLocalSwiftPackageReference section */ - 7AF4D4222AC4A9D300717C81 /* XCLocalSwiftPackageReference "../.." */ = { + 7AE741292E912765009C5FD5 /* XCLocalSwiftPackageReference "../../../nes" */ = { isa = XCLocalSwiftPackageReference; - relativePath = ../..; + relativePath = ../../../nes; }; /* End XCLocalSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 7AF4D4232AC4A9D300717C81 /* NesKit */ = { + 7AE7412A2E912765009C5FD5 /* NesKit */ = { isa = XCSwiftPackageProductDependency; productName = NesKit; }; + 7AE7412C2E912765009C5FD5 /* NesKitSwift */ = { + isa = XCSwiftPackageProductDependency; + productName = NesKitSwift; + }; /* End XCSwiftPackageProductDependency section */ }; - rootObject = 7AF4D4032AC4A97B00717C81 /* Project object */; + rootObject = 7AE741102E9125FE009C5FD5 /* Project object */; } diff --git a/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate b/examples/NesApp/NesApp.xcodeproj/project.xcworkspace/xcuserdata/selim.xcuserdatad/UserInterfaceState.xcuserstate index d7ba2824495261c99ee335e71b5a46f64fc57652..59f273ee0b15b97f08fef81326f381d8d1142600 100644 GIT binary patch literal 17708 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 diff --git a/examples/NesApp/NesApp/AppDelegate.swift b/examples/NesApp/NesApp/AppDelegate.swift deleted file mode 100644 index 9f995da..0000000 --- a/examples/NesApp/NesApp/AppDelegate.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// AppDelegate.swift -// NesApp -// -// Created by Selim Mustafaev on 27.09.2023. -// - -import UIKit - -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - // MARK: UISceneSession Lifecycle - - func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { - // Called when a new scene session is being created. - // Use this method to select a configuration to create the new scene with. - return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) - } - - func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { - // Called when the user discards a scene session. - // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. - // Use this method to release any resources that were specific to the discarded scenes, as they will not return. - } - - -} - diff --git a/examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3..ffdfe15 100644 --- a/examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/examples/NesApp/NesApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -4,6 +4,78 @@ "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" } ], "info" : { diff --git a/examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard b/examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 865e932..0000000 --- a/examples/NesApp/NesApp/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/NesApp/NesApp/Base.lproj/Main.storyboard b/examples/NesApp/NesApp/Base.lproj/Main.storyboard deleted file mode 100644 index 25a7638..0000000 --- a/examples/NesApp/NesApp/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/NesApp/NesApp/ContentView.swift b/examples/NesApp/NesApp/ContentView.swift new file mode 100644 index 0000000..4f01f6b --- /dev/null +++ b/examples/NesApp/NesApp/ContentView.swift @@ -0,0 +1,24 @@ +// +// ContentView.swift +// NesApp +// +// Created by Selim Mustafaev on 04.10.2025. +// + +import SwiftUI + +struct ContentView: View { + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundStyle(.tint) + Text("Hello, world!") + } + .padding() + } +} + +#Preview { + ContentView() +} diff --git a/examples/NesApp/NesApp/Info.plist b/examples/NesApp/NesApp/Info.plist deleted file mode 100644 index dd3c9af..0000000 --- a/examples/NesApp/NesApp/Info.plist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main - - - - - - diff --git a/examples/NesApp/NesApp/NesAppApp.swift b/examples/NesApp/NesApp/NesAppApp.swift new file mode 100644 index 0000000..6d49af5 --- /dev/null +++ b/examples/NesApp/NesApp/NesAppApp.swift @@ -0,0 +1,17 @@ +// +// NesAppApp.swift +// NesApp +// +// Created by Selim Mustafaev on 04.10.2025. +// + +import SwiftUI + +@main +struct NesAppApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/examples/NesApp/NesApp/NesView/NesView.swift b/examples/NesApp/NesApp/NesView/NesView.swift new file mode 100644 index 0000000..0ba1a74 --- /dev/null +++ b/examples/NesApp/NesApp/NesView/NesView.swift @@ -0,0 +1,31 @@ +// +// NesView.swift +// NesApp +// +// Created by Selim Mustafaev on 04.10.2025. +// + +import UIKit +import NesKit + +class NesView: UIView { + + let nesLayer: NesLayer + + init(system: NesSystem) { + self.nesLayer = NesLayer(nesSystem: system) + super.init(frame: .zero) + + self.layer.addSublayer(self.nesLayer) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func layoutSubviews() { + super.layoutSubviews() + + self.nesLayer.frame = self.layer.frame + } +} diff --git a/examples/NesApp/NesApp/SceneDelegate.swift b/examples/NesApp/NesApp/SceneDelegate.swift deleted file mode 100644 index a8b7d69..0000000 --- a/examples/NesApp/NesApp/SceneDelegate.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// SceneDelegate.swift -// NesApp -// -// Created by Selim Mustafaev on 27.09.2023. -// - -import UIKit - -class SceneDelegate: UIResponder, UIWindowSceneDelegate { - - var window: UIWindow? - - - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. - // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. - // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - guard let _ = (scene as? UIWindowScene) else { return } - } - - func sceneDidDisconnect(_ scene: UIScene) { - // Called as the scene is being released by the system. - // This occurs shortly after the scene enters the background, or when its session is discarded. - // Release any resources associated with this scene that can be re-created the next time the scene connects. - // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). - } - - func sceneDidBecomeActive(_ scene: UIScene) { - // Called when the scene has moved from an inactive state to an active state. - // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - } - - func sceneWillResignActive(_ scene: UIScene) { - // Called when the scene will move from an active state to an inactive state. - // This may occur due to temporary interruptions (ex. an incoming phone call). - } - - func sceneWillEnterForeground(_ scene: UIScene) { - // Called as the scene transitions from the background to the foreground. - // Use this method to undo the changes made on entering the background. - } - - func sceneDidEnterBackground(_ scene: UIScene) { - // Called as the scene transitions from the foreground to the background. - // Use this method to save data, release shared resources, and store enough scene-specific state information - // to restore the scene back to its current state. - } - - -} - diff --git a/examples/NesApp/NesApp/ViewController.swift b/examples/NesApp/NesApp/ViewController.swift deleted file mode 100644 index 0ac3816..0000000 --- a/examples/NesApp/NesApp/ViewController.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// ViewController.swift -// NesApp -// -// Created by Selim Mustafaev on 27.09.2023. -// - -import UIKit -import NesKit - -class NesView: UIView { - - let nesLayer: NesLayer - - init(system: NesSystem) { - self.nesLayer = NesLayer(nesSystem: system) - super.init(frame: .zero) - - self.layer.addSublayer(self.nesLayer) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func layoutSubviews() { - super.layoutSubviews() - - self.nesLayer.frame = self.layer.frame - } -} - -class ViewController: UIViewController { - - let system = NesSystem() - lazy var nesView = NesView(system: system) - - override func viewDidLoad() { - super.viewDidLoad() - - view.addSubview(nesView) - - nesView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - nesView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - nesView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - nesView.topAnchor.constraint(equalTo: view.topAnchor), - nesView.bottomAnchor.constraint(equalTo: view.bottomAnchor) - ]) - - DispatchQueue.main.asyncAfter(deadline: .now() + 1) { - self.openFilePicker() - } - } - - func openFilePicker() { - let documentPicker = UIDocumentPickerViewController(forOpeningContentTypes: [.data]) - documentPicker.delegate = self - documentPicker.modalPresentationStyle = .overFullScreen - documentPicker.allowsMultipleSelection = false - present(documentPicker, animated: true) - } -} - -extension ViewController: UIDocumentPickerDelegate { - - func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) { - print("Did pick document at: ", url) - system.runRom(url.path(percentEncoded: false)) - } -} -