From 9eae1ab594b08ac228eeaac6ec3690ebcb669e59 Mon Sep 17 00:00:00 2001 From: Tech Guy <109800377+TechGuy541@users.noreply.github.com> Date: Sun, 5 Jan 2025 08:02:32 +0000 Subject: [PATCH] Add open game from system(W.I.P) and Entitlements/ram view --- src/MeloNX/MeloNX.xcodeproj/project.pbxproj | 131 ++++-------------- .../UserInterfaceState.xcuserstate | Bin 0 -> 27066 bytes .../xcschemes/xcschememanagement.plist | 24 ++++ src/MeloNX/MeloNX/Core/Swift/Ryujinx.swift | 8 +- .../MeloNX/Views/GamesList/GameListView.swift | 27 ++++ .../SettingsView/Info View/DeviceMemory.swift | 25 ++++ .../SettingsView/Info View/InfoView.swift | 95 +++++++++++++ .../Views/SettingsView/SettingsView.swift | 8 +- 8 files changed, 210 insertions(+), 108 deletions(-) create mode 100644 src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/techguy.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 src/MeloNX/MeloNX.xcodeproj/xcuserdata/techguy.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 src/MeloNX/MeloNX/Views/SettingsView/Info View/DeviceMemory.swift create mode 100644 src/MeloNX/MeloNX/Views/SettingsView/Info View/InfoView.swift diff --git a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj index 25549a984..b32e8a35b 100644 --- a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj +++ b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 73; + objectVersion = 70; objects = { /* Begin PBXAggregateTarget section */ @@ -76,107 +76,8 @@ BD43C6302D1B8211003BBC42 /* dotnet.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = dotnet.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ -/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ - 4E80AA1D2CD7015100029585 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { - isa = PBXFileSystemSynchronizedBuildFileExceptionSet; - membershipExceptions = ( - Info.plist, - ); - target = 4E80A98C2CD6F54500029585 /* MeloNX */; - }; -/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ - -/* Begin PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */ - 4E9A82F32CF87822006D7086 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */ = { - isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet; - attributesByRelativePath = { - "Dependencies/Dynamic Libraries/Ryujinx.Headless.SDL2.dylib" = ( - CodeSignOnCopy, - ); - "Dependencies/Dynamic Libraries/SoftwareKeyboard.framework" = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - "Dependencies/Dynamic Libraries/libMoltenVK.dylib" = ( - CodeSignOnCopy, - ); - "Dependencies/Dynamic Libraries/libavcodec.dylib" = ( - CodeSignOnCopy, - ); - "Dependencies/Dynamic Libraries/libavutil.dylib" = ( - CodeSignOnCopy, - ); - Dependencies/XCFrameworks/MoltenVK.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/SDL2.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libSPIRV.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libavcodec.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libavfilter.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libavformat.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libavutil.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libswresample.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libswscale.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - Dependencies/XCFrameworks/libteakra.xcframework = ( - CodeSignOnCopy, - RemoveHeadersOnCopy, - ); - }; - buildPhase = 4E80AA092CD6FAA800029585 /* Embed Libraries */; - membershipExceptions = ( - "Dependencies/Dynamic Libraries/libavcodec.dylib", - "Dependencies/Dynamic Libraries/libavutil.dylib", - "Dependencies/Dynamic Libraries/libMoltenVK.dylib", - "Dependencies/Dynamic Libraries/Ryujinx.Headless.SDL2.dylib", - "Dependencies/Dynamic Libraries/SoftwareKeyboard.framework", - Dependencies/XCFrameworks/libavcodec.xcframework, - Dependencies/XCFrameworks/libavfilter.xcframework, - Dependencies/XCFrameworks/libavformat.xcframework, - Dependencies/XCFrameworks/libavutil.xcframework, - Dependencies/XCFrameworks/libSPIRV.xcframework, - Dependencies/XCFrameworks/libswresample.xcframework, - Dependencies/XCFrameworks/libswscale.xcframework, - Dependencies/XCFrameworks/libteakra.xcframework, - Dependencies/XCFrameworks/MoltenVK.xcframework, - Dependencies/XCFrameworks/SDL2.xcframework, - ); - }; - BD43C6122D1B1769003BBC42 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */ = { - isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet; - buildPhase = 4E80A9892CD6F54500029585 /* Sources */; - membershipExceptions = ( - "Core/Headers/Ryujinx-Header.h", - ); - }; -/* End PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */ - /* Begin PBXFileSystemSynchronizedRootGroup section */ - 4E80A98F2CD6F54500029585 /* MeloNX */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (4E80AA1D2CD7015100029585 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, BD43C6122D1B1769003BBC42 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */, 4E9A82F32CF87822006D7086 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = MeloNX; sourceTree = ""; }; + 4E80A98F2CD6F54500029585 /* MeloNX */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNX; sourceTree = ""; }; 4E80A9A02CD6F54700029585 /* MeloNXTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNXTests; sourceTree = ""; }; 4E80A9AA2CD6F54700029585 /* MeloNXUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNXUITests; sourceTree = ""; }; /* End PBXFileSystemSynchronizedRootGroup section */ @@ -363,6 +264,7 @@ }; }; buildConfigurationList = 4E80A9882CD6F54500029585 /* Build configuration list for PBXProject "MeloNX" */; + compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -375,7 +277,6 @@ 4E0DED322D05695D00FEF007 /* XCRemoteSwiftPackageReference "SwiftUIJoystick" */, 4EA5AE802D16807500AD0B9F /* XCRemoteSwiftPackageReference "SwiftSVG" */, ); - preferredProjectObjectVersion = 56; productRefGroup = 4E80A98E2CD6F54500029585 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -622,7 +523,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = 95J8WZ4TN8; + DEVELOPMENT_TEAM = F4QL9A2T88; ENABLE_PREVIEWS = YES; ENABLE_TESTABILITY = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -635,6 +536,8 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); GCC_OPTIMIZATION_LEVEL = fast; GENERATE_INFOPLIST_FILE = YES; @@ -788,9 +691,16 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); MARKETING_VERSION = 0.0.8; - PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; + PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX1; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/Core/Headers/Ryujinx-Header.h"; @@ -808,7 +718,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = 95J8WZ4TN8; + DEVELOPMENT_TEAM = F4QL9A2T88; ENABLE_PREVIEWS = YES; ENABLE_TESTABILITY = YES; FRAMEWORK_SEARCH_PATHS = ( @@ -821,6 +731,8 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); GCC_OPTIMIZATION_LEVEL = fast; GENERATE_INFOPLIST_FILE = YES; @@ -974,9 +886,16 @@ "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", + "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries", ); MARKETING_VERSION = 0.0.8; - PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; + PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX1; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/Core/Headers/Ryujinx-Header.h"; diff --git a/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/techguy.xcuserdatad/UserInterfaceState.xcuserstate b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/techguy.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..805b0c676b3e6d8b7d75bb518b9d433b370ab855 GIT binary patch literal 27066 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 G!T$qDZ@%yV literal 0 HcmV?d00001 diff --git a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/techguy.xcuserdatad/xcschemes/xcschememanagement.plist b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/techguy.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..91a670474 --- /dev/null +++ b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/techguy.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,24 @@ + + + + + SchemeUserState + + MeloNX.xcscheme_^#shared#^_ + + orderHint + 0 + + Ryujinx.xcscheme_^#shared#^_ + + orderHint + 2 + + com.Stossy11.MeloNX.RyujinxAg.xcscheme_^#shared#^_ + + orderHint + 1 + + + + diff --git a/src/MeloNX/MeloNX/Core/Swift/Ryujinx.swift b/src/MeloNX/MeloNX/Core/Swift/Ryujinx.swift index ba96f35b9..bd4057056 100644 --- a/src/MeloNX/MeloNX/Core/Swift/Ryujinx.swift +++ b/src/MeloNX/MeloNX/Core/Swift/Ryujinx.swift @@ -97,10 +97,12 @@ class Ryujinx { isRunning = true - // Start The Emulation on the main thread RunLoop.current.perform { + let url = URL(string: config.gamepath)! + do { let args = self.buildCommandLineArgs(from: config) + let accessing = url.startAccessingSecurityScopedResource() // Convert Arguments to ones that Ryujinx can Read let cArgs = args.map { strdup($0) } @@ -112,6 +114,10 @@ class Ryujinx { if result != 0 { self.isRunning = false + if accessing { + url.stopAccessingSecurityScopedResource() + } + throw RyujinxError.executionError(code: result) } } catch { diff --git a/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift b/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift index 511a5068d..9f888cd4c 100644 --- a/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift +++ b/src/MeloNX/MeloNX/Views/GamesList/GameListView.swift @@ -19,6 +19,9 @@ struct GameLibraryView: View { @Environment(\.colorScheme) var colorScheme @State var firmwareInstaller = false @State var firmwareversion = "0" + @State var isImporting: Bool = false + @State var startgame = false + var filteredGames: [Game] { if searchText.isEmpty { @@ -141,6 +144,12 @@ struct GameLibraryView: View { } label: { Text("Mii Maker") } + Button { + + isImporting.toggle() + } label: { + Text("Open game from system") + } } Button { @@ -188,6 +197,24 @@ struct GameLibraryView: View { print(error) } } + .fileImporter(isPresented: $isImporting, allowedContentTypes: [.zip, .data]) { result in + switch result { + case .success(let url): + guard url.startAccessingSecurityScopedResource() else { + print("Failed to access security-scoped resource") + return + } + defer { url.stopAccessingSecurityScopedResource() } + + + startemu = url + + case .failure(let err): + print("File import failed: \(err.localizedDescription)") + } + } + + } diff --git a/src/MeloNX/MeloNX/Views/SettingsView/Info View/DeviceMemory.swift b/src/MeloNX/MeloNX/Views/SettingsView/Info View/DeviceMemory.swift new file mode 100644 index 000000000..70eccdd2f --- /dev/null +++ b/src/MeloNX/MeloNX/Views/SettingsView/Info View/DeviceMemory.swift @@ -0,0 +1,25 @@ +// +// DeviceMemory.swift +// MeloNX +// +// Created by Tech Guy on 12/31/24. +// +import SwiftUI +import Foundation +import UIKit + +enum DeviceMemory { + /// Check if device has 8GB or more RAM + static var has8GBOrMore: Bool { + #if targetEnvironment(simulator) + return ProcessInfo.processInfo.physicalMemory >= 7 * 1024 * 1024 * 1024 // 8GB in bytes + #else + return ProcessInfo.processInfo.physicalMemory >= 7 * 1024 * 1024 * 1024 // 8GB in bytes + #endif + } + + /// Get total RAM in GB (rounded) + static var totalRAM: Int { + Int(ProcessInfo.processInfo.physicalMemory / 1024 / 1024 / 1024) + 1 + } +} diff --git a/src/MeloNX/MeloNX/Views/SettingsView/Info View/InfoView.swift b/src/MeloNX/MeloNX/Views/SettingsView/Info View/InfoView.swift new file mode 100644 index 000000000..aed7ab426 --- /dev/null +++ b/src/MeloNX/MeloNX/Views/SettingsView/Info View/InfoView.swift @@ -0,0 +1,95 @@ +// +// InfoView.swift +// MeloNX +// +// Created by Tech Guy on 12/31/24. +// + + +import SwiftUI + +struct InfoView: View { + @AppStorage("entitlementExists") private var entitlementExists: Bool = false + @AppStorage("increaseddebugmem") private var increaseddebugmem: Bool = false + @AppStorage("extended-virtual-addressing") private var extended: Bool = false + @State var gd = false + let infoDictionary = Bundle.main.infoDictionary + + var body: some View { + ScrollView { + VStack { + Text("Welcome to MeloNX!") + .font(.largeTitle) + Divider() + Text("Entitlements:") + .font(.title) + .font(Font.headline.weight(.bold)) + Spacer() + .frame(height: 10) + Group { + Text("Required:") + .font(.title2) + .foregroundColor(.red) + .font(Font.headline.weight(.bold)) + Spacer() + .frame(height: 10) + Text("Increased Memory Limit: \(String(describing: entitlementExists))") + Spacer() + .frame(height: 10) + } + Group { + Spacer() + .frame(height: 10) + Text("Reccomended (paid):") + .font(.title2) + .font(Font.headline.weight(.bold)) + Spacer() + .frame(height: 10) + Text("Increased Debugging Memory Limit: \(String(describing: increaseddebugmem))") + .padding() + Text("Extended Virtual Addressing: \(String(describing: extended))") + } + + Divider() + Text("Memory:") + .font(.title) + .font(Font.headline.weight(.bold)) + Spacer() + .frame(height: 10) + Group { + Text("Current:") + .font(.title2) + .foregroundColor(.blue) + .font(Font.headline.weight(.bold)) + Spacer() + .frame(height: 10) + Text(String(DeviceMemory.totalRAM) + "GB") + Spacer() + .frame(height: 10) + } + + } + .padding() + + HStack { + Text("Version: \(getAppVersion())") + .foregroundColor(.white) + .font(.system(size: 12)) + .onTapGesture { + gd.toggle() + } + if getAppVersion() == "2.2", gd { + Text("Geometry Dash????? ;)") + .foregroundStyle(.secondary) + .font(.system(size: 5)) + } + } + } + } + func getAppVersion() -> String { + guard let version = infoDictionary?["CFBundleShortVersionString"] as? String else { + return "Unknown" + } + return version + } +} diff --git a/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift b/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift index ab3746528..dafa2a518 100644 --- a/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift +++ b/src/MeloNX/MeloNX/Views/SettingsView/SettingsView.swift @@ -42,6 +42,8 @@ struct SettingsView: View { var body: some View { iOSNav { List { + + // Graphics & Performance Section { Toggle(isOn: $config.fullscreen) { @@ -296,7 +298,10 @@ struct SettingsView: View { } label: { Text("Advanced Options") } - + NavigationLink(destination: InfoView()) { + Text("About") + + } } header: { Text("Advanced") .font(.title3.weight(.semibold)) @@ -305,6 +310,7 @@ struct SettingsView: View { } footer: { Text("For advanced users. See page size or add custom arguments for experimental features. (Please don't touch this if you don't know what you're doing)") } + } .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always)) .navigationTitle("Settings")