use crate::ffi::dmHID;
pub struct Context {
ptr: *mut dmHID::Context,
}
impl Context {
pub fn new(ptr: *mut dmHID::Context) -> Self {
Self { ptr }
}
pub fn get_keyboard(&self, index: u8) -> Option<Keyboard> {
let keyboard = unsafe { dmHID::GetKeyboard(self.ptr, index) };
Keyboard::new(keyboard)
}
pub fn get_mouse(&self, index: u8) -> Option<Mouse> {
let mouse = unsafe { dmHID::GetMouse(self.ptr, index) };
Mouse::new(mouse)
}
pub fn get_touch_device(&self, index: u8) -> Option<TouchDevice> {
let touch_device = unsafe { dmHID::GetTouchDevice(self.ptr, index) };
TouchDevice::new(touch_device)
}
pub fn get_gamepad(&self, index: u8) -> Option<Gamepad> {
let gamepad = unsafe { dmHID::GetGamepad(self.ptr, index) };
Gamepad::new(gamepad)
}
pub fn add_keyboard_char(&self, char: i32) {
unsafe { dmHID::AddKeyboardChar(self.ptr, char) }
}
}
pub struct Keyboard {
ptr: *mut dmHID::Keyboard,
}
impl Keyboard {
pub fn new(ptr: *mut dmHID::Keyboard) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { ptr })
}
}
pub fn set_key(&self, key: Key, value: bool) {
unsafe { dmHID::SetKey(self.ptr, key.into(), value) }
}
}
pub struct Mouse {
ptr: *mut dmHID::Mouse,
}
impl Mouse {
pub fn new(ptr: *mut dmHID::Mouse) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { ptr })
}
}
pub fn set_button(&self, button: MouseButton, value: bool) {
unsafe { dmHID::SetMouseButton(self.ptr, button.into(), value) }
}
pub fn set_position(&self, x: i32, y: i32) {
unsafe { dmHID::SetMousePosition(self.ptr, x, y) }
}
pub fn set_wheel(&self, value: i32) {
unsafe { dmHID::SetMouseWheel(self.ptr, value) }
}
pub fn get_packet(&self) -> Option<MousePacket> {
let mut raw_packet = dmHID::MousePacket {
m_PositionX: 0,
m_PositionY: 0,
m_Wheel: 0,
m_Buttons: [0; 1],
};
let ok = unsafe { dmHID::GetMousePacket(self.ptr, &mut raw_packet) };
if ok {
Some(raw_packet.into())
} else {
None
}
}
pub fn get_button(&self, button: MouseButton) -> Option<bool> {
let packet = self.get_packet()?;
Some(packet.get_button(button))
}
}
#[derive(Clone, Copy)]
pub struct MousePacket {
pub x: i32,
pub y: i32,
pub wheel: i32,
pub buttons: u32,
raw_packet: dmHID::MousePacket,
}
impl MousePacket {
pub fn get_button(&self, button: MouseButton) -> bool {
let mut packet_clone = *self;
unsafe { dmHID::GetMouseButton(&mut packet_clone.raw_packet, button.into()) }
}
}
impl From<dmHID::MousePacket> for MousePacket {
fn from(raw_packet: dmHID::MousePacket) -> Self {
Self {
x: raw_packet.m_PositionX,
y: raw_packet.m_PositionY,
wheel: raw_packet.m_Wheel,
buttons: raw_packet.m_Buttons[0],
raw_packet,
}
}
}
pub struct TouchDevice {
ptr: *mut dmHID::TouchDevice,
}
impl TouchDevice {
pub fn new(ptr: *mut dmHID::TouchDevice) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { ptr })
}
}
pub fn add_touch(&self, x: i32, y: i32, id: u32, phase: Phase) {
unsafe { dmHID::AddTouch(self.ptr, x, y, id, phase.into()) }
}
}
pub struct Gamepad {
ptr: *mut dmHID::Gamepad,
}
impl Gamepad {
pub fn new(ptr: *mut dmHID::Gamepad) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { ptr })
}
}
pub fn set_button(&self, button: u32, pressed: bool) {
unsafe { dmHID::SetGamepadButton(self.ptr, button, pressed) }
}
pub fn set_axis(&self, axis: u32, value: f32) {
unsafe { dmHID::SetGamepadAxis(self.ptr, axis, value) }
}
}
#[allow(missing_docs)]
pub enum Phase {
Began,
Moved,
Stationary,
Ended,
Cancelled,
}
impl From<Phase> for u32 {
fn from(phase: Phase) -> Self {
phase as u32
}
}
#[allow(missing_docs)]
pub enum MouseButton {
Left,
Middle,
Right,
M1,
M2,
M3,
M4,
M5,
M6,
M7,
M8,
}
impl From<MouseButton> for u32 {
fn from(button: MouseButton) -> Self {
match button {
MouseButton::Left => 0,
MouseButton::Middle => 2,
MouseButton::Right => 1,
MouseButton::M1 => 0,
MouseButton::M2 => 1,
MouseButton::M3 => 2,
MouseButton::M4 => 3,
MouseButton::M5 => 4,
MouseButton::M6 => 5,
MouseButton::M7 => 6,
MouseButton::M8 => 7,
}
}
}
#[allow(missing_docs)]
#[repr(u32)]
pub enum Key {
Space = 32,
Exclaim,
DoubleQuote,
Hash,
Dollar,
Percent, Ampersand,
Apostrophe,
ParenLeft,
ParenRight,
Asterisk,
Plus,
Comma,
Minus,
Period,
Slash,
Zero,
One,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Colon,
Semicolon,
Less,
Equals,
Greater,
Question,
At,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
BracketLeft,
Backslash,
BracketRight,
Caret,
Underscore,
Backquote,
BraceLeft = 123,
Pipe,
BraceRight,
Tilde,
Escape = 256 + 1,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
Up = 256 + 27,
Down,
Left,
Right,
ShiftLeft,
ShiftRight,
ControlLeft,
ControlRight,
AltLeft,
AltRight,
Tab,
Enter,
Backspace,
Insert,
Delete,
PageUp,
PageDown,
Home,
End,
Kp0,
Kp1,
Kp2,
Kp3,
Kp4,
Kp5,
Kp6,
Kp7,
Kp8,
Kp9,
KpDivide,
KpMultiply,
KpSubtract,
KpAdd,
KpDecimal,
KpEqual,
KpEnter,
KpNumLock,
CapsLock,
ScollLock,
Pause,
SuperLeft,
SuperRight,
Menu,
Back,
}
impl From<Key> for u32 {
fn from(key: Key) -> Self {
key as u32
}
}