ObjectiveC.cs
1 using System; 2 using System.Runtime.InteropServices; 3 using System.Runtime.Versioning; 4 5 namespace Ryujinx.UI.Common.Helper 6 { 7 [SupportedOSPlatform("macos")] 8 public static partial class ObjectiveC 9 { 10 private const string ObjCRuntime = "/usr/lib/libobjc.A.dylib"; 11 12 [LibraryImport(ObjCRuntime, StringMarshalling = StringMarshalling.Utf8)] 13 private static partial IntPtr sel_getUid(string name); 14 15 [LibraryImport(ObjCRuntime, StringMarshalling = StringMarshalling.Utf8)] 16 private static partial IntPtr objc_getClass(string name); 17 18 [LibraryImport(ObjCRuntime)] 19 private static partial void objc_msgSend(IntPtr receiver, Selector selector); 20 21 [LibraryImport(ObjCRuntime)] 22 private static partial void objc_msgSend(IntPtr receiver, Selector selector, byte value); 23 24 [LibraryImport(ObjCRuntime)] 25 private static partial void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value); 26 27 [LibraryImport(ObjCRuntime)] 28 private static partial void objc_msgSend(IntPtr receiver, Selector selector, NSRect point); 29 30 [LibraryImport(ObjCRuntime)] 31 private static partial void objc_msgSend(IntPtr receiver, Selector selector, double value); 32 33 [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend")] 34 private static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector); 35 36 [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend")] 37 private static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, IntPtr param); 38 39 [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend", StringMarshalling = StringMarshalling.Utf8)] 40 private static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, string param); 41 42 [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend")] 43 [return: MarshalAs(UnmanagedType.Bool)] 44 private static partial bool bool_objc_msgSend(IntPtr receiver, Selector selector, IntPtr param); 45 46 public readonly struct Object 47 { 48 public readonly IntPtr ObjPtr; 49 50 private Object(IntPtr pointer) 51 { 52 ObjPtr = pointer; 53 } 54 55 public Object(string name) 56 { 57 ObjPtr = objc_getClass(name); 58 } 59 60 public void SendMessage(Selector selector) 61 { 62 objc_msgSend(ObjPtr, selector); 63 } 64 65 public void SendMessage(Selector selector, byte value) 66 { 67 objc_msgSend(ObjPtr, selector, value); 68 } 69 70 public void SendMessage(Selector selector, Object obj) 71 { 72 objc_msgSend(ObjPtr, selector, obj.ObjPtr); 73 } 74 75 public void SendMessage(Selector selector, NSRect point) 76 { 77 objc_msgSend(ObjPtr, selector, point); 78 } 79 80 public void SendMessage(Selector selector, double value) 81 { 82 objc_msgSend(ObjPtr, selector, value); 83 } 84 85 public Object GetFromMessage(Selector selector) 86 { 87 return new Object(IntPtr_objc_msgSend(ObjPtr, selector)); 88 } 89 90 public Object GetFromMessage(Selector selector, Object obj) 91 { 92 return new Object(IntPtr_objc_msgSend(ObjPtr, selector, obj.ObjPtr)); 93 } 94 95 public Object GetFromMessage(Selector selector, NSString nsString) 96 { 97 return new Object(IntPtr_objc_msgSend(ObjPtr, selector, nsString.StrPtr)); 98 } 99 100 public Object GetFromMessage(Selector selector, string param) 101 { 102 return new Object(IntPtr_objc_msgSend(ObjPtr, selector, param)); 103 } 104 105 public bool GetBoolFromMessage(Selector selector, Object obj) 106 { 107 return bool_objc_msgSend(ObjPtr, selector, obj.ObjPtr); 108 } 109 } 110 111 public readonly struct Selector 112 { 113 public readonly IntPtr SelPtr; 114 115 private Selector(string name) 116 { 117 SelPtr = sel_getUid(name); 118 } 119 120 public static implicit operator Selector(string value) => new(value); 121 } 122 123 public readonly struct NSString 124 { 125 public readonly IntPtr StrPtr; 126 127 public NSString(string aString) 128 { 129 IntPtr nsString = objc_getClass("NSString"); 130 StrPtr = IntPtr_objc_msgSend(nsString, "stringWithUTF8String:", aString); 131 } 132 133 public static implicit operator IntPtr(NSString nsString) => nsString.StrPtr; 134 } 135 136 public readonly struct NSPoint 137 { 138 public readonly double X; 139 public readonly double Y; 140 141 public NSPoint(double x, double y) 142 { 143 X = x; 144 Y = y; 145 } 146 } 147 148 public readonly struct NSRect 149 { 150 public readonly NSPoint Pos; 151 public readonly NSPoint Size; 152 153 public NSRect(double x, double y, double width, double height) 154 { 155 Pos = new NSPoint(x, y); 156 Size = new NSPoint(width, height); 157 } 158 } 159 } 160 }