ObjectiveC.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.IO;
  3. using System.Runtime.InteropServices;
  4. using System.Runtime.Versioning;
  5. using System.Text;
  6. namespace Ryujinx.Ui.Common.Helper
  7. {
  8. [SupportedOSPlatform("macos")]
  9. public static partial class ObjectiveC
  10. {
  11. private const string ObjCRuntime = "/usr/lib/libobjc.A.dylib";
  12. [LibraryImport(ObjCRuntime, StringMarshalling = StringMarshalling.Utf8)]
  13. private static unsafe partial IntPtr sel_getUid(string name);
  14. [LibraryImport(ObjCRuntime, StringMarshalling = StringMarshalling.Utf8)]
  15. public static partial IntPtr objc_getClass(string name);
  16. [LibraryImport(ObjCRuntime)]
  17. public static partial void objc_msgSend(IntPtr receiver, Selector selector);
  18. [LibraryImport(ObjCRuntime)]
  19. public static partial void objc_msgSend(IntPtr receiver, Selector selector, byte value);
  20. [LibraryImport(ObjCRuntime)]
  21. public static partial void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value);
  22. [LibraryImport(ObjCRuntime)]
  23. public static partial void objc_msgSend(IntPtr receiver, Selector selector, NSRect point);
  24. [LibraryImport(ObjCRuntime)]
  25. public static partial void objc_msgSend(IntPtr receiver, Selector selector, double value);
  26. [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend")]
  27. public static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector);
  28. [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend")]
  29. public static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, IntPtr param);
  30. [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend", StringMarshalling = StringMarshalling.Utf8)]
  31. public static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector, string param);
  32. [LibraryImport(ObjCRuntime, EntryPoint = "objc_msgSend")]
  33. [return: MarshalAs(UnmanagedType.Bool)]
  34. public static partial bool bool_objc_msgSend(IntPtr receiver, Selector selector, IntPtr param);
  35. public struct Selector
  36. {
  37. public readonly IntPtr SelPtr;
  38. public unsafe Selector(string name)
  39. {
  40. SelPtr = sel_getUid(name);
  41. }
  42. public static implicit operator Selector(string value) => new(value);
  43. }
  44. public struct NSString
  45. {
  46. public readonly IntPtr StrPtr;
  47. public NSString(string aString)
  48. {
  49. IntPtr nsString = objc_getClass("NSString");
  50. StrPtr = IntPtr_objc_msgSend(nsString, "stringWithUTF8String:", aString);
  51. }
  52. public static implicit operator IntPtr(NSString nsString) => nsString.StrPtr;
  53. }
  54. public readonly struct NSPoint
  55. {
  56. public readonly double X;
  57. public readonly double Y;
  58. public NSPoint(double x, double y)
  59. {
  60. X = x;
  61. Y = y;
  62. }
  63. }
  64. public readonly struct NSRect
  65. {
  66. public readonly NSPoint Pos;
  67. public readonly NSPoint Size;
  68. public NSRect(double x, double y, double width, double height)
  69. {
  70. Pos = new NSPoint(x, y);
  71. Size = new NSPoint(width, height);
  72. }
  73. }
  74. }
  75. }