internal static string DevicePath(IntPtr devptr) { unsafe { WrappedDevice *dev = (WrappedDevice *)devptr.ToPointer(); return(Marshal.PtrToStringAnsi(dev->path)); } }
internal void close_device() { unsafe { WrappedDevice *dev = (WrappedDevice *)self.ToPointer(); dev->buttons = IntPtr.Zero; dev->axes = IntPtr.Zero; buttons_handle.Free(); axes_handle.Free(); } }
internal Device(IntPtr devptr) { self = devptr; unsafe { WrappedDevice *dev = (WrappedDevice *)devptr.ToPointer(); path = Marshal.PtrToStringAnsi(dev->path); name = Marshal.PtrToStringAnsi(dev->name); num_buttons = dev->num_buttons; buttons = new Button[dev->num_buttons]; num_axes = dev->num_axes; axes = new Axis[dev->num_axes]; int bsize = Marshal.SizeOf(typeof(Button)); if (dev->num_buttons > 0) { for (int i = 0; i < dev->num_buttons; i++) { IntPtr bptr = new IntPtr(dev->buttons.ToInt64() + i * bsize); buttons[i] = (Button)Marshal.PtrToStructure(bptr, typeof(Button)); } buttons_handle = GCHandle.Alloc(buttons, GCHandleType.Pinned); dev->buttons = buttons_handle.AddrOfPinnedObject(); } int asize = Marshal.SizeOf(typeof(Axis)); if (dev->num_axes > 0) { for (int i = 0; i < dev->num_axes; i++) { IntPtr aptr = new IntPtr(dev->axes.ToInt64() + i * asize); axes[i] = (Axis)Marshal.PtrToStructure(aptr, typeof(Axis)); } axes_handle = GCHandle.Alloc(axes, GCHandleType.Pinned); dev->axes = axes_handle.AddrOfPinnedObject(); } } }