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 @@ + + .str0 {stroke:black;stroke-width:0.238063} + .fil0 {fill:black} + .fil2 {fill:#050707} + .fil3 {fill:#881846} + .fil5 {fill:#F6BCD6} + .fil1 {fill:#F9DD56} + .fil4 {fill:#FDFCFD} + + + + + Layer 1 + + image/svg+xmlOpenclipartTrollface2011-04-03T12:59:21http://encyclopediadramatica.com/Trollfacehttps://openclipart.org/detail/130795/trollface-by-ronesronesfacememetrolltrollface + \ 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; }