mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2026-05-27 07:29:14 +00:00
UI: Included more launch checks (#4)
- Added Onedrive folder check for Windows. - Added iCloud and Downloads folder checks for macOS. - Added sudo checks for macOS/Linux. - Added dialogue prompts for macOS/Linux. - Added unofficial build warning for detected Flatpak install. These checks have console fallbacks in case the GUI decides it doesn't want to work that day. Reviewed-on: https://git.ryujinx.app/projects/Ryubing/pulls/4
This commit is contained in:
62
src/Ryujinx/UI/Helpers/macOSNativeInterop.cs
Normal file
62
src/Ryujinx/UI/Helpers/macOSNativeInterop.cs
Normal file
@@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Ryujinx.Ava.UI.Helpers
|
||||
{
|
||||
public class macOSNativeInterop
|
||||
{
|
||||
// TODO: add a parameter for prompt style
|
||||
// TODO: check success of prompt box
|
||||
public static int SimpleMessageBox(string caption, string text, string button)
|
||||
{
|
||||
|
||||
// Grab what we need to make the message box.
|
||||
const string ObjCRuntime = "/usr/lib/libobjc.A.dylib";
|
||||
const string FoundationFramework = "/System/Library/Frameworks/Foundation.framework/Foundation";
|
||||
const string AppKitFramework = "/System/Library/Frameworks/AppKit.framework/AppKit";
|
||||
|
||||
[DllImport(ObjCRuntime, EntryPoint = "sel_registerName")]
|
||||
static extern IntPtr GetSelector(string name);
|
||||
|
||||
[DllImport(ObjCRuntime, EntryPoint = "objc_getClass")]
|
||||
static extern IntPtr GetClass(string name);
|
||||
|
||||
[DllImport(FoundationFramework, EntryPoint = "objc_msgSend")]
|
||||
static extern IntPtr SendMessage(IntPtr target, IntPtr selector);
|
||||
|
||||
[DllImport(FoundationFramework, EntryPoint = "objc_msgSend")]
|
||||
static extern IntPtr SendMessageWithParameter(IntPtr target, IntPtr selector, IntPtr param);
|
||||
|
||||
[DllImport(ObjCRuntime)]
|
||||
static extern IntPtr dlopen(string path, int mode);
|
||||
|
||||
dlopen(AppKitFramework, 0x1); // have to invoke AppKit so that NSAlert doesn't return a null pointer
|
||||
|
||||
IntPtr NSStringClass = GetClass("NSString");
|
||||
IntPtr Selector = GetSelector("stringWithUTF8String:");
|
||||
IntPtr SharedApp = SendMessage(GetClass("NSApplication"), GetSelector("sharedApplication"));
|
||||
IntPtr NSAlert = SendMessage(GetClass("NSAlert"), GetSelector("alloc"));
|
||||
IntPtr AlertInstance = SendMessage(NSAlert, GetSelector("init"));
|
||||
|
||||
// Create caption, text, and button text.
|
||||
IntPtr boxCaption = SendMessageWithParameter(NSStringClass, Selector, Marshal.StringToHGlobalAnsi(caption));
|
||||
IntPtr boxText = SendMessageWithParameter(NSStringClass, Selector, Marshal.StringToHGlobalAnsi(text));
|
||||
IntPtr boxButton = SendMessageWithParameter(NSStringClass, Selector, Marshal.StringToHGlobalAnsi(button));
|
||||
|
||||
// Set up the window.
|
||||
SendMessageWithParameter(SharedApp, GetSelector("setActivationPolicy:"), IntPtr.Zero); // Give it a window.
|
||||
SendMessageWithParameter(SharedApp, GetSelector("activateIgnoringOtherApps:"), (IntPtr) 1); // Force it to the front.
|
||||
|
||||
// Set up the message box.
|
||||
SendMessageWithParameter(AlertInstance, GetSelector("setAlertStyle:"), IntPtr.Zero); // Set style to warning.
|
||||
SendMessageWithParameter(AlertInstance, GetSelector("setMessageText:"), boxCaption);
|
||||
SendMessageWithParameter(AlertInstance, GetSelector("setInformativeText:"), boxText);
|
||||
SendMessageWithParameter(AlertInstance, GetSelector("addButtonWithTitle:"), boxButton);
|
||||
|
||||
// Send prompt to user, then clean up.
|
||||
SendMessage(AlertInstance, GetSelector("runModal"));
|
||||
SendMessage(AlertInstance, GetSelector("release"));
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user