LibInputNativeUnsafeMethods.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace Avalonia.LinuxFramebuffer.Input.LibInput
  4. {
  5. unsafe class LibInputNativeUnsafeMethods
  6. {
  7. [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  8. delegate int OpenRestrictedCallbackDelegate(IntPtr path, int flags, IntPtr userData);
  9. [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  10. delegate void CloseRestrictedCallbackDelegate(int fd, IntPtr userData);
  11. static int OpenRestricted(IntPtr path, int flags, IntPtr userData)
  12. {
  13. var fd = NativeUnsafeMethods.open(Marshal.PtrToStringAnsi(path), flags, 0);
  14. if (fd == -1)
  15. return -Marshal.GetLastWin32Error();
  16. return fd;
  17. }
  18. static void CloseRestricted(int fd, IntPtr userData)
  19. {
  20. NativeUnsafeMethods.close(fd);
  21. }
  22. private static readonly IntPtr* s_Interface;
  23. static LibInputNativeUnsafeMethods()
  24. {
  25. s_Interface = (IntPtr*)Marshal.AllocHGlobal(IntPtr.Size * 2);
  26. IntPtr Convert<TDelegate>(TDelegate del)
  27. {
  28. GCHandle.Alloc(del);
  29. return Marshal.GetFunctionPointerForDelegate(del);
  30. }
  31. s_Interface[0] = Convert<OpenRestrictedCallbackDelegate>(OpenRestricted);
  32. s_Interface[1] = Convert<CloseRestrictedCallbackDelegate>(CloseRestricted);
  33. }
  34. private const string LibInput = "libinput.so.10";
  35. [DllImport(LibInput)]
  36. public extern static IntPtr libinput_path_create_context(IntPtr* iface, IntPtr userData);
  37. public static IntPtr libinput_path_create_context() =>
  38. libinput_path_create_context(s_Interface, IntPtr.Zero);
  39. [DllImport(LibInput)]
  40. public extern static IntPtr libinput_path_add_device(IntPtr ctx, [MarshalAs(UnmanagedType.LPStr)] string path);
  41. [DllImport(LibInput)]
  42. public extern static IntPtr libinput_path_remove_device(IntPtr device);
  43. [DllImport(LibInput)]
  44. public extern static int libinput_get_fd(IntPtr ctx);
  45. [DllImport(LibInput)]
  46. public extern static void libinput_dispatch(IntPtr ctx);
  47. [DllImport(LibInput)]
  48. public extern static IntPtr libinput_get_event(IntPtr ctx);
  49. [DllImport(LibInput)]
  50. public extern static LibInputEventType libinput_event_get_type(IntPtr ev);
  51. public enum LibInputEventType
  52. {
  53. LIBINPUT_EVENT_NONE = 0,
  54. LIBINPUT_EVENT_DEVICE_ADDED,
  55. LIBINPUT_EVENT_DEVICE_REMOVED,
  56. LIBINPUT_EVENT_KEYBOARD_KEY = 300,
  57. LIBINPUT_EVENT_POINTER_MOTION = 400,
  58. LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE,
  59. LIBINPUT_EVENT_POINTER_BUTTON,
  60. LIBINPUT_EVENT_POINTER_AXIS,
  61. LIBINPUT_EVENT_TOUCH_DOWN = 500,
  62. LIBINPUT_EVENT_TOUCH_UP,
  63. LIBINPUT_EVENT_TOUCH_MOTION,
  64. LIBINPUT_EVENT_TOUCH_CANCEL,
  65. LIBINPUT_EVENT_TOUCH_FRAME,
  66. LIBINPUT_EVENT_TABLET_TOOL_AXIS = 600,
  67. LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY,
  68. LIBINPUT_EVENT_TABLET_TOOL_TIP,
  69. LIBINPUT_EVENT_TABLET_TOOL_BUTTON,
  70. LIBINPUT_EVENT_TABLET_PAD_BUTTON = 700,
  71. LIBINPUT_EVENT_TABLET_PAD_RING,
  72. LIBINPUT_EVENT_TABLET_PAD_STRIP,
  73. LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN = 800,
  74. LIBINPUT_EVENT_GESTURE_SWIPE_UPDATE,
  75. LIBINPUT_EVENT_GESTURE_SWIPE_END,
  76. LIBINPUT_EVENT_GESTURE_PINCH_BEGIN,
  77. LIBINPUT_EVENT_GESTURE_PINCH_UPDATE,
  78. LIBINPUT_EVENT_GESTURE_PINCH_END,
  79. LIBINPUT_EVENT_SWITCH_TOGGLE = 900,
  80. }
  81. [DllImport(LibInput)]
  82. public extern static void libinput_event_destroy(IntPtr ev);
  83. [DllImport(LibInput)]
  84. public extern static IntPtr libinput_event_get_touch_event(IntPtr ev);
  85. [DllImport(LibInput)]
  86. public extern static int libinput_event_touch_get_slot(IntPtr ev);
  87. [DllImport(LibInput)]
  88. public extern static ulong libinput_event_touch_get_time_usec(IntPtr ev);
  89. [DllImport(LibInput)]
  90. public extern static double libinput_event_touch_get_x_transformed(IntPtr ev, int width);
  91. [DllImport(LibInput)]
  92. public extern static double libinput_event_touch_get_y_transformed(IntPtr ev, int height);
  93. [DllImport(LibInput)]
  94. public extern static IntPtr libinput_event_get_pointer_event(IntPtr ev);
  95. [DllImport(LibInput)]
  96. public extern static ulong libinput_event_pointer_get_time_usec(IntPtr ev);
  97. [DllImport(LibInput)]
  98. public extern static double libinput_event_pointer_get_absolute_x_transformed(IntPtr ev, int width);
  99. [DllImport(LibInput)]
  100. public extern static double libinput_event_pointer_get_absolute_y_transformed(IntPtr ev, int height);
  101. [DllImport(LibInput)]
  102. public extern static int libinput_event_pointer_get_button(IntPtr ev);
  103. [DllImport(LibInput)]
  104. public extern static int libinput_event_pointer_get_button_state(IntPtr ev);
  105. }
  106. }