diff --git a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj
index 567e8252e..1066d412b 100644
--- a/src/MeloNX/MeloNX.xcodeproj/project.pbxproj
+++ b/src/MeloNX/MeloNX.xcodeproj/project.pbxproj
@@ -108,6 +108,10 @@
"Dependencies/Dynamic Libraries/Ryujinx.Headless.SDL2.dylib" = (
CodeSignOnCopy,
);
+ "Dependencies/Dynamic Libraries/RyujinxBridge.framework" = (
+ CodeSignOnCopy,
+ RemoveHeadersOnCopy,
+ );
"Dependencies/Dynamic Libraries/RyujinxKeyboard.framework" = (
CodeSignOnCopy,
RemoveHeadersOnCopy,
@@ -169,6 +173,7 @@
"Dependencies/Dynamic Libraries/libavutil.dylib",
"Dependencies/Dynamic Libraries/libMoltenVK.dylib",
"Dependencies/Dynamic Libraries/Ryujinx.Headless.SDL2.dylib",
+ "Dependencies/Dynamic Libraries/RyujinxBridge.framework",
"Dependencies/Dynamic Libraries/RyujinxKeyboard.framework",
Dependencies/XCFrameworks/libavcodec.xcframework,
Dependencies/XCFrameworks/libavfilter.xcframework,
@@ -633,7 +638,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "";
- DEVELOPMENT_TEAM = 95J8WZ4TN8;
+ DEVELOPMENT_TEAM = D59DHVRS87;
ENABLE_PREVIEWS = YES;
ENABLE_TESTABILITY = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -763,7 +768,7 @@
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
);
MARKETING_VERSION = 1.3.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xitrix.MeloNX;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/App/Core/Headers/Ryujinx-Header.h";
@@ -781,7 +786,7 @@
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "";
- DEVELOPMENT_TEAM = 95J8WZ4TN8;
+ DEVELOPMENT_TEAM = D59DHVRS87;
ENABLE_PREVIEWS = YES;
ENABLE_TESTABILITY = YES;
FRAMEWORK_SEARCH_PATHS = (
@@ -911,7 +916,7 @@
"$(PROJECT_DIR)/MeloNX/Dependencies/Dynamic\\ Libraries",
);
MARKETING_VERSION = 1.3.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.stossy11.MeloNX;
+ PRODUCT_BUNDLE_IDENTIFIER = com.xitrix.MeloNX;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OBJC_BRIDGING_HEADER = "MeloNX/App/Core/Headers/Ryujinx-Header.h";
diff --git a/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/daniilvinogradov.xcuserdatad/UserInterfaceState.xcuserstate b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/daniilvinogradov.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 000000000..5faef418f
Binary files /dev/null and b/src/MeloNX/MeloNX.xcodeproj/project.xcworkspace/xcuserdata/daniilvinogradov.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/daniilvinogradov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/daniilvinogradov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100644
index 000000000..493eb5944
--- /dev/null
+++ b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/daniilvinogradov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/MeloNX/MeloNX.xcodeproj/xcuserdata/daniilvinogradov.xcuserdatad/xcschemes/xcschememanagement.plist b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/daniilvinogradov.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 000000000..91a670474
--- /dev/null
+++ b/src/MeloNX/MeloNX.xcodeproj/xcuserdata/daniilvinogradov.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/App/Core/Ryujinx/Ryujinx.swift b/src/MeloNX/MeloNX/App/Core/Ryujinx/Ryujinx.swift
index bd09f1b74..da4f73c3b 100644
--- a/src/MeloNX/MeloNX/App/Core/Ryujinx/Ryujinx.swift
+++ b/src/MeloNX/MeloNX/App/Core/Ryujinx/Ryujinx.swift
@@ -8,6 +8,7 @@
import Foundation
import SwiftUI
import GameController
+import RyujinxBridge
struct Controller: Identifiable, Hashable {
var id: String
@@ -49,6 +50,13 @@ class Ryujinx {
static let shared = Ryujinx()
private init() {
+ messageDelegate = { messagePtr in
+ guard let messagePtr else { return }
+ let message = String(cString: messagePtr)
+ RyujinxBridgeHelper.parseMessage(message)
+ print("Message: \(message)")
+ }
+
self.games = loadGames()
}
@@ -513,7 +521,6 @@ class Ryujinx {
var windowInfo = SDL_SysWMinfo()
SDL_GetWindowWMInfo(window, &windowInfo)
-
guard let uiWindow = windowInfo.info.uikit.window,
let rootView = uiWindow.takeUnretainedValue().rootViewController?.view else {
print("Unable to get root view")
diff --git a/src/MeloNX/MeloNX/App/Core/Ryujinx/RyujinxBridge.swift b/src/MeloNX/MeloNX/App/Core/Ryujinx/RyujinxBridge.swift
new file mode 100644
index 000000000..b2a5d640f
--- /dev/null
+++ b/src/MeloNX/MeloNX/App/Core/Ryujinx/RyujinxBridge.swift
@@ -0,0 +1,45 @@
+//
+// RyujinxBridge.swift
+// MeloNX
+//
+// Created by Daniil Vinogradov on 17/02/2025.
+//
+
+import UIKit
+
+struct BridgeAlertMessage: Codable {
+ var title: String?
+ var type: String?
+ var metadata: String?
+}
+
+struct BridgePayload {
+ var type: String
+ var model: T
+}
+
+enum RyujinxBridgeHelper {
+ static func parseMessage(_ message: String) {
+ guard let data = message.data(using: .utf8),
+ let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
+ let type = json["type"] as? String,
+ let model = json["model"],
+ let modelData = try? JSONSerialization.data(withJSONObject: model)
+ else { return }
+
+ switch type {
+ case "BridgeAlertMessage":
+ guard let model = try? JSONDecoder().decode(BridgeAlertMessage.self, from: modelData)
+ else { return }
+
+ DispatchQueue.main.async {
+// let alertVC = UIAlertController(title: model.title, message: model.type, preferredStyle: .alert)
+// alertVC.addAction(.init(title: "OK", style: .cancel))
+ print("ALERT!!!! \(model.title) \(model.type) \(model.metadata)")
+// UIApplication.shared.windows.first?.rootViewController?.present(alertVC, animated: true)
+ }
+ default: break
+ }
+ print("Type: \(type)")
+ }
+}
diff --git a/src/MeloNX/MeloNX/App/Views/SettingsView/SettingsView.swift b/src/MeloNX/MeloNX/App/Views/SettingsView/SettingsView.swift
index 2b6ca4f19..cc83ca518 100644
--- a/src/MeloNX/MeloNX/App/Views/SettingsView/SettingsView.swift
+++ b/src/MeloNX/MeloNX/App/Views/SettingsView/SettingsView.swift
@@ -6,7 +6,7 @@
//
import SwiftUI
-import SwiftSVG
+//import SwiftSVG
struct SettingsView: View {
@Binding var config: Ryujinx.Configuration
@@ -439,36 +439,42 @@ struct SettingsView: View {
}
.tint(.blue)
- if #available(iOS 17.0.1, *) {
- Toggle(isOn: $jitStreamerEB) {
- labelWithIcon("JitStreamer EB", iconName: "bolt.heart")
- }
- .tint(.blue)
- .contextMenu {
- Button {
- if let mainWindow = UIApplication.shared.windows.last {
- let alertController = UIAlertController(title: "About JitStreamer EB", message: "JitStreamer EB is an Amazing Application to Enable JIT on the go, made by one of the best iOS developers of all time jkcoxson <3", preferredStyle: .alert)
-
- let learnMoreButton = UIAlertAction(title: "Learn More", style: .default) {_ in
- UIApplication.shared.open(URL(string: "https://jkcoxson.com/jitstreamer")!)
- }
- alertController.addAction(learnMoreButton)
-
- let doneButton = UIAlertAction(title: "Done", style: .cancel, handler: nil)
- alertController.addAction(doneButton)
-
- mainWindow.rootViewController?.present(alertController, animated: true)
- }
- } label: {
- Text("About")
- }
- }
- } else {
+// if #available(iOS 17.0.1, *) {
+// Toggle(isOn: $jitStreamerEB) {
+// labelWithIcon("JitStreamer EB", iconName: "bolt.heart")
+// }
+// .tint(.blue)
+// .contextMenu {
+// Button {
+// if let mainWindow = UIApplication.shared.windows.last {
+// let alertController = UIAlertController(title: "About JitStreamer EB", message: "JitStreamer EB is an Amazing Application to Enable JIT on the go, made by one of the best iOS developers of all time jkcoxson <3", preferredStyle: .alert)
+//
+// let learnMoreButton = UIAlertAction(title: "Learn More", style: .default) {_ in
+// UIApplication.shared.open(URL(string: "https://jkcoxson.com/jitstreamer")!)
+// }
+// alertController.addAction(learnMoreButton)
+//
+// let doneButton = UIAlertAction(title: "Done", style: .cancel, handler: nil)
+// alertController.addAction(doneButton)
+//
+// mainWindow.rootViewController?.present(alertController, animated: true)
+// }
+// } label: {
+// Text("About")
+// }
+// }
+// } else {
Toggle(isOn: $useTrollStore) {
- labelWithIcon("TrollStore JIT", iconName: "troll.svg")
+ HStack(spacing: 8) {
+ Image("troll")
+ .symbolRenderingMode(.hierarchical)
+ .foregroundStyle(.blue)
+ Text("TrollStore JIT")
+ }
+ .font(.body)
}
.tint(.blue)
- }
+// }
Toggle(isOn: $syncqsubmits) {
labelWithIcon("MVK: Synchronous Queue Submits", iconName: "line.diagonal")
@@ -695,56 +701,11 @@ struct SettingsView: View {
@ViewBuilder
private func labelWithIcon(_ text: String, iconName: String, flipimage: Bool? = nil) -> some View {
HStack(spacing: 8) {
- if iconName.hasSuffix(".svg"){
- if let flipimage, flipimage {
- SVGView(svgName: iconName, color: .blue)
- .symbolRenderingMode(.hierarchical)
- .frame(width: 20, height: 20)
- .rotation3DEffect(.degrees(180), axis: (x: 0, y: 1, z: 0))
- } else {
- SVGView(svgName: iconName, color: .blue)
- .symbolRenderingMode(.hierarchical)
- .frame(width: 20, height: 20)
- }
- } else if !iconName.isEmpty {
- Image(systemName: iconName)
- .symbolRenderingMode(.hierarchical)
- .foregroundStyle(.blue)
- }
+ Image(systemName: iconName)
+ .symbolRenderingMode(.hierarchical)
+ .foregroundStyle(.blue)
Text(text)
}
.font(.body)
}
}
-
-
-struct SVGView: UIViewRepresentable {
- var svgName: String
- var color: Color = Color.black
-
- func makeUIView(context: Context) -> UIView {
- var svgName = svgName
- var hammock = UIView()
-
- if svgName.hasSuffix(".svg") {
- svgName.removeLast(4)
- }
-
-
-
- let svgLayer = UIView(SVGNamed: svgName) { svgLayer in
- svgLayer.fillColor = UIColor(color).cgColor // Apply the provided color
- svgLayer.resizeToFit(hammock.frame)
- hammock.layer.addSublayer(svgLayer)
- }
-
- return hammock
- }
-
- func updateUIView(_ uiView: UIView, context: Context) {
- // Update the SVG view's fill color when the color changes
- if let svgLayer = uiView.layer.sublayers?.first as? CAShapeLayer {
- svgLayer.fillColor = UIColor(color).cgColor
- }
- }
-}
diff --git a/src/MeloNX/MeloNX/Assets/Assets.xcassets/troll.imageset/Contents.json b/src/MeloNX/MeloNX/Assets/Assets.xcassets/troll.imageset/Contents.json
new file mode 100644
index 000000000..52f67def1
--- /dev/null
+++ b/src/MeloNX/MeloNX/Assets/Assets.xcassets/troll.imageset/Contents.json
@@ -0,0 +1,12 @@
+{
+ "images" : [
+ {
+ "filename" : "Troll-Face.svg",
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/src/MeloNX/MeloNX/Assets/Assets.xcassets/troll.imageset/Troll-Face.svg b/src/MeloNX/MeloNX/Assets/Assets.xcassets/troll.imageset/Troll-Face.svg
new file mode 100644
index 000000000..e3b3f7785
--- /dev/null
+++ b/src/MeloNX/MeloNX/Assets/Assets.xcassets/troll.imageset/Troll-Face.svg
@@ -0,0 +1,16 @@
+
\ No newline at end of file
diff --git a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Headers/RyujinxBridge.h b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Headers/RyujinxBridge.h
new file mode 100644
index 000000000..545a63aeb
--- /dev/null
+++ b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Headers/RyujinxBridge.h
@@ -0,0 +1,18 @@
+//
+// RyujinxBridge.h
+// RyujinxBridge
+//
+// Created by Daniil Vinogradov on 17/02/2025.
+//
+
+#import
+
+//! Project version number for RyujinxBridge.
+FOUNDATION_EXPORT double RyujinxBridgeVersionNumber;
+
+//! Project version string for RyujinxBridge.
+FOUNDATION_EXPORT const unsigned char RyujinxBridgeVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+#import
+
diff --git a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Headers/bridge.h b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Headers/bridge.h
new file mode 100644
index 000000000..4248a16c7
--- /dev/null
+++ b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Headers/bridge.h
@@ -0,0 +1,8 @@
+//
+// bridge.h
+// RyujinxBridge
+//
+// Created by Daniil Vinogradov on 17/02/2025.
+//
+
+void (*messageDelegate)(const char*);
diff --git a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Info.plist b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Info.plist
new file mode 100644
index 000000000..61bc19745
Binary files /dev/null and b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Info.plist differ
diff --git a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Modules/module.modulemap b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Modules/module.modulemap
new file mode 100644
index 000000000..0373427d1
--- /dev/null
+++ b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/Modules/module.modulemap
@@ -0,0 +1,6 @@
+framework module RyujinxBridge {
+ umbrella header "RyujinxBridge.h"
+ export *
+
+ module * { export * }
+}
diff --git a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/RyujinxBridge b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/RyujinxBridge
new file mode 100755
index 000000000..a2fdd7864
Binary files /dev/null and b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/RyujinxBridge differ
diff --git a/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/_CodeSignature/CodeResources b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/_CodeSignature/CodeResources
new file mode 100644
index 000000000..ae4f67c04
--- /dev/null
+++ b/src/MeloNX/MeloNX/Dependencies/Dynamic Libraries/RyujinxBridge.framework/_CodeSignature/CodeResources
@@ -0,0 +1,135 @@
+
+
+
+
+ files
+
+ Headers/RyujinxBridge.h
+
+ DKD2r8aJ47TZL7v48UVEfod716g=
+
+ Headers/bridge.h
+
+ p75HJMB/G5CAZ+yTApMWmoQP7Lg=
+
+ Info.plist
+
+ mWbK0knhX+Q4WAm+hZd8SF0ioS0=
+
+ Modules/module.modulemap
+
+ +to1dvHz+3pPZcmBu4qsYsrvt4Y=
+
+
+ files2
+
+ Headers/RyujinxBridge.h
+
+ hash2
+
+ xIPdWru4HW7sRYRg6G+ehIk9V4nX3Uv7kIlE2c/TnjM=
+
+
+ Headers/bridge.h
+
+ hash2
+
+ kA+OGSf2EzopJ1KM/+Lp8qHheuFQQYlkkOdMg/ywzH8=
+
+
+ Modules/module.modulemap
+
+ hash2
+
+ ZTC6KjLczI++298LFW6y9c8aoPQ1LrrsJrDJfrPnZUU=
+
+
+
+ rules
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/src/MeloNX/MeloNX/MeloNX.entitlements b/src/MeloNX/MeloNX/MeloNX.entitlements
index 99f471672..8f5046f7d 100644
--- a/src/MeloNX/MeloNX/MeloNX.entitlements
+++ b/src/MeloNX/MeloNX/MeloNX.entitlements
@@ -2,6 +2,8 @@
+ com.apple.developer.kernel.increased-debugging-memory-limit
+
com.apple.developer.kernel.increased-memory-limit
diff --git a/src/Ryujinx.Headless.SDL2/MessageBridge-iOS.cs b/src/Ryujinx.Headless.SDL2/MessageBridge-iOS.cs
new file mode 100644
index 000000000..32a247b7a
--- /dev/null
+++ b/src/Ryujinx.Headless.SDL2/MessageBridge-iOS.cs
@@ -0,0 +1,41 @@
+using Newtonsoft.Json;
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+
+namespace Ryujinx.Headless.SDL2
+{
+ struct BridgeAlertMessage(string title, string message, string metadata = null)
+ {
+ [JsonProperty("title")]
+ string Title { get; set; } = title;
+
+ [JsonProperty("message")]
+ string Message { get; set; } = message;
+
+ [JsonProperty("metadata")]
+ string Metadata { get; set; } = metadata;
+ }
+
+ public static class MessageBridge
+ {
+ [DllImport("RyujinxBridge.framework/RyujinxBridge", CallingConvention = CallingConvention.Cdecl, EntryPoint="sendMessage")]
+ private static extern void SendMessage(string json);
+
+ public static void SendPayload(T model)
+ {
+ string jsonString = JsonConvert.SerializeObject(new BridgePayload(typeof(T).Name, model));
+ SendMessage(jsonString);
+ }
+ }
+
+ public struct BridgePayload(string type, T model)
+ {
+ [JsonProperty("type")]
+ private string Type { get; set; } = type;
+
+ [JsonProperty("model")]
+ private T Model { get; set; } = model;
+ }
+}
diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx.Headless.SDL2/Program.cs
index 3fd96ecef..db6c3e344 100644
--- a/src/Ryujinx.Headless.SDL2/Program.cs
+++ b/src/Ryujinx.Headless.SDL2/Program.cs
@@ -37,7 +37,6 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
-using System.Text.Json;
using System.Threading;
using ConfigGamepadInputId = Ryujinx.Common.Configuration.Hid.Controller.GamepadInputId;
using ConfigStickInputId = Ryujinx.Common.Configuration.Hid.Controller.StickInputId;
@@ -85,6 +84,7 @@ using ARMeilleure.Translation;
using LibHac.Ncm;
using LibHac.Tools.FsSystem.NcaUtils;
using Microsoft.Win32.SafeHandles;
+using Newtonsoft.Json;
using Ryujinx.Common.Logging;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.HOS.SystemState;
@@ -94,6 +94,7 @@ using System;
using System.IO;
using System.Runtime.InteropServices;
using SDL2;
+using JsonException = System.Text.Json.JsonException;
namespace Ryujinx.Headless.SDL2
{
@@ -117,6 +118,13 @@ namespace Ryujinx.Headless.SDL2
private static readonly InputConfigJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
private static readonly TitleUpdateMetadataJsonSerializerContext _titleSerializerContext = new(JsonHelper.GetDefaultSerializerOptions());
+ // [UnmanagedCallersOnly(EntryPoint = "get_dlc_nca_list")]
+ // public static unsafe void CDeclCombine(delegate* unmanaged[Cdecl] combinator) =>
+ // combinator(left, right);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate void TestDelegate(int a, int b);
+
[UnmanagedCallersOnly(EntryPoint = "main_ryujinx_sdl")]
public static unsafe int MainExternal(int argCount, IntPtr* pArgs)
{
@@ -403,6 +411,8 @@ namespace Ryujinx.Headless.SDL2
[UnmanagedCallersOnly(EntryPoint = "get_game_info")]
public static GameInfoNative GetGameInfoNative(int descriptor, IntPtr extensionPtr)
{
+ MessageBridge.SendPayload(new BridgeAlertMessage("Text", "Alalallala"));
+
if (_virtualFileSystem == null) {
_virtualFileSystem = VirtualFileSystem.CreateInstance();
}
diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx.Headless.SDL2/WindowBase.cs
index 13c18ac8f..6d94fe6fa 100644
--- a/src/Ryujinx.Headless.SDL2/WindowBase.cs
+++ b/src/Ryujinx.Headless.SDL2/WindowBase.cs
@@ -477,8 +477,8 @@ namespace Ryujinx.Headless.SDL2
public bool DisplayMessageDialog(string title, string message)
{
- SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags.SDL_MESSAGEBOX_INFORMATION, title, message, WindowHandle);
-
+ // SDL_ShowSimpleMessageBox(SDL_MessageBoxFlags.SDL_MESSAGEBOX_INFORMATION, title, message, WindowHandle);
+ MessageBridge.SendPayload(new BridgeAlertMessage(title, message, "controllerApplet"));
return true;
}