/ src / Ryujinx.UI.Common / Helper / ObjectiveC.cs
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  }