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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 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")