A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

255 lines
8.6 KiB

using __u32 = System.UInt32;
using __s32 = System.Int32;
using __u16 = System.UInt16;
using System;
using System.Runtime.InteropServices;
// ReSharper disable FieldCanBeMadeReadOnly.Local
// ReSharper disable ArrangeTypeMemberModifiers
// ReSharper disable BuiltInTypeReferenceStyle
// ReSharper disable InconsistentNaming
namespace Avalonia.LinuxFramebuffer
{
unsafe class NativeUnsafeMethods
{
[DllImport("libc", EntryPoint = "open", SetLastError = true)]
public static extern int open(string pathname, int flags, int mode);
[DllImport("libc", EntryPoint = "close", SetLastError = true)]
public static extern int close(int fd);
[DllImport("libc", EntryPoint = "ioctl", SetLastError = true)]
public static extern int ioctl(int fd, FbIoCtl code, void* arg);
[DllImport("libc", EntryPoint = "mmap", SetLastError = true)]
public static extern IntPtr mmap(IntPtr addr, IntPtr length, int prot, int flags,
int fd, IntPtr offset);
[DllImport("libc", EntryPoint = "munmap", SetLastError = true)]
public static extern int munmap(IntPtr addr, IntPtr length);
[DllImport("libc", EntryPoint = "memcpy", SetLastError = true)]
public static extern int memcpy(IntPtr dest, IntPtr src, IntPtr length);
[DllImport("libc", EntryPoint = "select", SetLastError = true)]
public static extern int select(int nfds, void* rfds, void* wfds, void* exfds, IntPtr* timevals);
[DllImport("libevdev.so.2", EntryPoint = "libevdev_new_from_fd", SetLastError = true)]
public static extern int libevdev_new_from_fd(int fd, out IntPtr dev);
[DllImport("libevdev.so.2", EntryPoint = "libevdev_has_event_type", SetLastError = true)]
public static extern int libevdev_has_event_type(IntPtr dev, EvType type);
[DllImport("libevdev.so.2", EntryPoint = "libevdev_next_event", SetLastError = true)]
public static extern int libevdev_next_event(IntPtr dev, int flags, out input_event ev);
[DllImport("libevdev.so.2", EntryPoint = "libevdev_get_name", SetLastError = true)]
public static extern IntPtr libevdev_get_name(IntPtr dev);
[DllImport("libevdev.so.2", EntryPoint = "libevdev_get_abs_info", SetLastError = true)]
public static extern input_absinfo* libevdev_get_abs_info(IntPtr dev, int code);
}
enum FbIoCtl : uint
{
FBIOGET_VSCREENINFO = 0x4600,
FBIOPUT_VSCREENINFO = 0x4601,
FBIOGET_FSCREENINFO = 0x4602,
FBIOGET_VBLANK = 0x80204612u,
FBIO_WAITFORVSYNC = 0x40044620,
FBIOPAN_DISPLAY = 0x4606
}
[Flags]
enum VBlankFlags
{
FB_VBLANK_VBLANKING = 0x001 /* currently in a vertical blank */,
FB_VBLANK_HBLANKING = 0x002 /* currently in a horizontal blank */,
FB_VBLANK_HAVE_VBLANK = 0x004 /* vertical blanks can be detected */,
FB_VBLANK_HAVE_HBLANK = 0x008 /* horizontal blanks can be detected */,
FB_VBLANK_HAVE_COUNT = 0x010 /* global retrace counter is available */,
FB_VBLANK_HAVE_VCOUNT = 0x020 /* the vcount field is valid */,
FB_VBLANK_HAVE_HCOUNT = 0x040 /* the hcount field is valid */,
FB_VBLANK_VSYNCING = 0x080 /* currently in a vsync */,
FB_VBLANK_HAVE_VSYNC = 0x100 /* verical syncs can be detected */
}
[StructLayout(LayoutKind.Sequential)]
unsafe struct fb_vblank {
public VBlankFlags flags; /* FB_VBLANK flags */
__u32 count; /* counter of retraces since boot */
__u32 vcount; /* current scanline position */
__u32 hcount; /* current scandot position */
fixed __u32 reserved[4]; /* reserved for future compatibility */
};
[StructLayout(LayoutKind.Sequential)]
unsafe struct fb_fix_screeninfo
{
public fixed byte id[16]; /* identification string eg "TT Builtin" */
public IntPtr smem_start; /* Start of frame buffer mem */
/* (physical address) */
public __u32 smem_len; /* Length of frame buffer mem */
public __u32 type; /* see FB_TYPE_* */
public __u32 type_aux; /* Interleave for interleaved Planes */
public __u32 visual; /* see FB_VISUAL_* */
public __u16 xpanstep; /* zero if no hardware panning */
public __u16 ypanstep; /* zero if no hardware panning */
public __u16 ywrapstep; /* zero if no hardware ywrap */
public __u32 line_length; /* length of a line in bytes */
public IntPtr mmio_start; /* Start of Memory Mapped I/O */
/* (physical address) */
public __u32 mmio_len; /* Length of Memory Mapped I/O */
public __u32 accel; /* Type of acceleration available */
public fixed __u16 reserved[3]; /* Reserved for future compatibility */
};
[StructLayout(LayoutKind.Sequential)]
struct fb_bitfield
{
public __u32 offset; /* beginning of bitfield */
public __u32 length; /* length of bitfield */
public __u32 msb_right; /* != 0 : Most significant bit is */
/* right */
};
[StructLayout(LayoutKind.Sequential)]
unsafe struct fb_var_screeninfo
{
public __u32 xres; /* visible resolution */
public __u32 yres;
public __u32 xres_virtual; /* virtual resolution */
public __u32 yres_virtual;
public __u32 xoffset; /* offset from virtual to visible */
public __u32 yoffset; /* resolution */
public __u32 bits_per_pixel; /* guess what */
public __u32 grayscale; /* != 0 Graylevels instead of colors */
public fb_bitfield red; /* bitfield in fb mem if true color, */
public fb_bitfield green; /* else only length is significant */
public fb_bitfield blue;
public fb_bitfield transp; /* transparency */
public __u32 nonstd; /* != 0 Non standard pixel format */
public __u32 activate; /* see FB_ACTIVATE_* */
public __u32 height; /* height of picture in mm */
public __u32 width; /* width of picture in mm */
public __u32 accel_flags; /* acceleration flags (hints) */
/* Timing: All values in pixclocks, except pixclock (of course) */
public __u32 pixclock; /* pixel clock in ps (pico seconds) */
public __u32 left_margin; /* time from sync to picture */
public __u32 right_margin; /* time from picture to sync */
public __u32 upper_margin; /* time from sync to picture */
public __u32 lower_margin;
public __u32 hsync_len; /* length of horizontal sync */
public __u32 vsync_len; /* length of vertical sync */
public __u32 sync; /* see FB_SYNC_* */
public __u32 vmode; /* see FB_VMODE_* */
public fixed __u32 reserved[6]; /* Reserved for future compatibility */
};
enum EvType
{
EV_SYN = 0x00,
EV_KEY = 0x01,
EV_REL = 0x02,
EV_ABS = 0x03,
EV_MSC = 0x04,
EV_SW = 0x05,
EV_LED = 0x11,
EV_SND = 0x12,
EV_REP = 0x14,
EV_FF = 0x15,
EV_PWR = 0x16,
EV_FF_STATUS = 0x17,
}
[StructLayout(LayoutKind.Sequential)]
struct input_event
{
private IntPtr crap1, crap2;
public ushort type, code;
public int value;
}
[StructLayout(LayoutKind.Sequential)]
unsafe struct fd_set
{
public int count;
public fixed int fds [256];
}
enum AxisEventCode
{
REL_X = 0x00,
REL_Y = 0x01,
REL_Z = 0x02,
REL_RX = 0x03,
REL_RY = 0x04,
REL_RZ = 0x05,
REL_HWHEEL = 0x06,
REL_DIAL = 0x07,
REL_WHEEL = 0x08,
REL_MISC = 0x09,
REL_MAX = 0x0f
}
enum AbsAxis
{
ABS_X = 0x00,
ABS_Y = 0x01,
ABS_Z = 0x02,
ABS_RX = 0x03,
ABS_RY = 0x04,
ABS_RZ = 0x05,
ABS_THROTTLE = 0x06,
ABS_RUDDER = 0x07,
ABS_WHEEL = 0x08,
ABS_GAS = 0x09,
ABS_BRAKE = 0x0a,
ABS_HAT0X = 0x10,
ABS_HAT0Y = 0x11,
ABS_HAT1X = 0x12,
ABS_HAT1Y = 0x13,
ABS_HAT2X = 0x14,
ABS_HAT2Y = 0x15,
ABS_HAT3X = 0x16,
ABS_HAT3Y = 0x17,
ABS_PRESSURE = 0x18,
ABS_DISTANCE = 0x19,
ABS_TILT_X = 0x1a,
ABS_TILT_Y = 0x1b,
ABS_TOOL_WIDTH = 0x1c
}
enum EvKey
{
BTN_LEFT = 0x110,
BTN_RIGHT = 0x111,
BTN_MIDDLE = 0x112
}
[StructLayout(LayoutKind.Sequential)]
struct input_absinfo
{
public __s32 value;
public __s32 minimum;
public __s32 maximum;
public __s32 fuzz;
public __s32 flat;
public __s32 resolution;
}
}