Add open game from system(W.I.P) and Entitlements/ram view

This commit is contained in:
Tech Guy 2025-01-05 08:02:32 +00:00
parent d2e406fa56
commit 9eae1ab594
8 changed files with 210 additions and 108 deletions

View File

@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 73; objectVersion = 70;
objects = { objects = {
/* Begin PBXAggregateTarget section */ /* Begin PBXAggregateTarget section */
@ -76,107 +76,8 @@
BD43C6302D1B8211003BBC42 /* dotnet.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = dotnet.xcconfig; sourceTree = "<group>"; }; BD43C6302D1B8211003BBC42 /* dotnet.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = dotnet.xcconfig; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* 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 */ /* Begin PBXFileSystemSynchronizedRootGroup section */
4E80A98F2CD6F54500029585 /* MeloNX */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (4E80AA1D2CD7015100029585 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, BD43C6122D1B1769003BBC42 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */, 4E9A82F32CF87822006D7086 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = MeloNX; sourceTree = "<group>"; }; 4E80A98F2CD6F54500029585 /* MeloNX */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNX; sourceTree = "<group>"; };
4E80A9A02CD6F54700029585 /* MeloNXTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNXTests; sourceTree = "<group>"; }; 4E80A9A02CD6F54700029585 /* MeloNXTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNXTests; sourceTree = "<group>"; };
4E80A9AA2CD6F54700029585 /* MeloNXUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNXUITests; sourceTree = "<group>"; }; 4E80A9AA2CD6F54700029585 /* MeloNXUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = MeloNXUITests; sourceTree = "<group>"; };
/* End PBXFileSystemSynchronizedRootGroup section */ /* End PBXFileSystemSynchronizedRootGroup section */
@ -363,6 +264,7 @@
}; };
}; };
buildConfigurationList = 4E80A9882CD6F54500029585 /* Build configuration list for PBXProject "MeloNX" */; buildConfigurationList = 4E80A9882CD6F54500029585 /* Build configuration list for PBXProject "MeloNX" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en; developmentRegion = en;
hasScannedForEncodings = 0; hasScannedForEncodings = 0;
knownRegions = ( knownRegions = (
@ -375,7 +277,6 @@
4E0DED322D05695D00FEF007 /* XCRemoteSwiftPackageReference "SwiftUIJoystick" */, 4E0DED322D05695D00FEF007 /* XCRemoteSwiftPackageReference "SwiftUIJoystick" */,
4EA5AE802D16807500AD0B9F /* XCRemoteSwiftPackageReference "SwiftSVG" */, 4EA5AE802D16807500AD0B9F /* XCRemoteSwiftPackageReference "SwiftSVG" */,
); );
preferredProjectObjectVersion = 56;
productRefGroup = 4E80A98E2CD6F54500029585 /* Products */; productRefGroup = 4E80A98E2CD6F54500029585 /* Products */;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
@ -622,7 +523,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = 95J8WZ4TN8; DEVELOPMENT_TEAM = F4QL9A2T88;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
ENABLE_TESTABILITY = NO; ENABLE_TESTABILITY = NO;
FRAMEWORK_SEARCH_PATHS = ( 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", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
); );
GCC_OPTIMIZATION_LEVEL = fast; GCC_OPTIMIZATION_LEVEL = fast;
GENERATE_INFOPLIST_FILE = YES; 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",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
); );
MARKETING_VERSION = 0.0.8; MARKETING_VERSION = 0.0.8;
PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX1;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/Core/Headers/Ryujinx-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/Core/Headers/Ryujinx-Header.h";
@ -808,7 +718,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = 95J8WZ4TN8; DEVELOPMENT_TEAM = F4QL9A2T88;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = ( 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", "$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
); );
GCC_OPTIMIZATION_LEVEL = fast; GCC_OPTIMIZATION_LEVEL = fast;
GENERATE_INFOPLIST_FILE = YES; 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",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
); );
MARKETING_VERSION = 0.0.8; MARKETING_VERSION = 0.0.8;
PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX; PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX1;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/Core/Headers/Ryujinx-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/Core/Headers/Ryujinx-Header.h";

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>MeloNX.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>Ryujinx.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>com.Stossy11.MeloNX.RyujinxAg.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
</dict>
</dict>
</plist>

View File

@ -97,10 +97,12 @@ class Ryujinx {
isRunning = true isRunning = true
// Start The Emulation on the main thread
RunLoop.current.perform { RunLoop.current.perform {
let url = URL(string: config.gamepath)!
do { do {
let args = self.buildCommandLineArgs(from: config) let args = self.buildCommandLineArgs(from: config)
let accessing = url.startAccessingSecurityScopedResource()
// Convert Arguments to ones that Ryujinx can Read // Convert Arguments to ones that Ryujinx can Read
let cArgs = args.map { strdup($0) } let cArgs = args.map { strdup($0) }
@ -112,6 +114,10 @@ class Ryujinx {
if result != 0 { if result != 0 {
self.isRunning = false self.isRunning = false
if accessing {
url.stopAccessingSecurityScopedResource()
}
throw RyujinxError.executionError(code: result) throw RyujinxError.executionError(code: result)
} }
} catch { } catch {

View File

@ -19,6 +19,9 @@ struct GameLibraryView: View {
@Environment(\.colorScheme) var colorScheme @Environment(\.colorScheme) var colorScheme
@State var firmwareInstaller = false @State var firmwareInstaller = false
@State var firmwareversion = "0" @State var firmwareversion = "0"
@State var isImporting: Bool = false
@State var startgame = false
var filteredGames: [Game] { var filteredGames: [Game] {
if searchText.isEmpty { if searchText.isEmpty {
@ -141,6 +144,12 @@ struct GameLibraryView: View {
} label: { } label: {
Text("Mii Maker") Text("Mii Maker")
} }
Button {
isImporting.toggle()
} label: {
Text("Open game from system")
}
} }
Button { Button {
@ -188,6 +197,24 @@ struct GameLibraryView: View {
print(error) 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)")
}
}
} }

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -42,6 +42,8 @@ struct SettingsView: View {
var body: some View { var body: some View {
iOSNav { iOSNav {
List { List {
// Graphics & Performance // Graphics & Performance
Section { Section {
Toggle(isOn: $config.fullscreen) { Toggle(isOn: $config.fullscreen) {
@ -296,7 +298,10 @@ struct SettingsView: View {
} label: { } label: {
Text("Advanced Options") Text("Advanced Options")
} }
NavigationLink(destination: InfoView()) {
Text("About")
}
} header: { } header: {
Text("Advanced") Text("Advanced")
.font(.title3.weight(.semibold)) .font(.title3.weight(.semibold))
@ -305,6 +310,7 @@ struct SettingsView: View {
} footer: { } 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)") 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)) .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
.navigationTitle("Settings") .navigationTitle("Settings")