use libc::c_int; use ffi::*; use {Event}; use super::{Kind, Code}; #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] pub enum Absolute { Position(Position), Wheel(Wheel), Hat(Hat), Digi(Digi), Multi(Multi), } impl Into for Absolute { fn into(self) -> Event { Event::Absolute(self) } } impl super::Position for Absolute { } impl Kind for Absolute { fn kind(&self) -> c_int { EV_ABS } } impl Code for Absolute { fn code(&self) -> c_int { match self { &Absolute::Position(ref v) => v.code(), &Absolute::Wheel(ref v) => v.code(), &Absolute::Hat(ref v) => v.code(), &Absolute::Digi(ref v) => v.code(), &Absolute::Multi(ref v) => v.code(), } } } custom_derive! { #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(PositionVariants))] pub enum Position { X, Y, Z, RX, RY, RZ, } } impl Into for Position { fn into(self) -> Event { Event::Absolute(Absolute::Position(self)) } } impl super::Position for Position { } impl Kind for Position { fn kind(&self) -> c_int { EV_ABS } } impl Code for Position { fn code(&self) -> c_int { match self { &Position::X => ABS_X, &Position::Y => ABS_Y, &Position::Z => ABS_Z, &Position::RX => ABS_RX, &Position::RY => ABS_RY, &Position::RZ => ABS_RZ, } } } custom_derive! { #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(WheelVariants))] pub enum Wheel { Throttle, Rudder, Position, Gas, Brake, } } impl Into for Wheel { fn into(self) -> Event { Event::Absolute(Absolute::Wheel(self)) } } impl super::Position for Wheel { } impl Kind for Wheel { fn kind(&self) -> c_int { EV_ABS } } impl Code for Wheel { fn code(&self) -> c_int { match self { &Wheel::Throttle => ABS_THROTTLE, &Wheel::Rudder => ABS_RUDDER, &Wheel::Position => ABS_WHEEL, &Wheel::Gas => ABS_GAS, &Wheel::Brake => ABS_BRAKE, } } } custom_derive! { #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(HatVariants))] pub enum Hat { X0, Y0, X1, Y1, X2, Y2, X3, Y3, } } impl Into for Hat { fn into(self) -> Event { Event::Absolute(Absolute::Hat(self)) } } impl super::Position for Hat { } impl Kind for Hat { fn kind(&self) -> c_int { EV_ABS } } impl Code for Hat { fn code(&self) -> c_int { match self { &Hat::X0 => ABS_HAT0X, &Hat::Y0 => ABS_HAT0Y, &Hat::X1 => ABS_HAT1X, &Hat::Y1 => ABS_HAT1Y, &Hat::X2 => ABS_HAT2X, &Hat::Y2 => ABS_HAT2Y, &Hat::X3 => ABS_HAT3X, &Hat::Y3 => ABS_HAT3Y, } } } custom_derive! { #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(DigiVariants))] pub enum Digi { Pressure, Distance, TiltX, TiltY, ToolWidth, Volume, } } impl Into for Digi { fn into(self) -> Event { Event::Absolute(Absolute::Digi(self)) } } impl super::Position for Digi { } impl Kind for Digi { fn kind(&self) -> c_int { EV_ABS } } impl Code for Digi { fn code(&self) -> c_int { match self { &Digi::Pressure => ABS_PRESSURE, &Digi::Distance => ABS_DISTANCE, &Digi::TiltX => ABS_TILT_X, &Digi::TiltY => ABS_TILT_Y, &Digi::ToolWidth => ABS_TOOL_WIDTH, &Digi::Volume => ABS_VOLUME, } } } custom_derive! { #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, IterVariants(MultiVariants))] pub enum Multi { Slot, TouchMajor, TouchMinor, WidthMajor, WidthMinor, Orientation, PositionX, PositionY, ToolType, BlobId, TrackingId, Pressure, Distance, ToolX, ToolY, } } impl Into for Multi { fn into(self) -> Event { Event::Absolute(Absolute::Multi(self)) } } impl super::Position for Multi { } impl Kind for Multi { fn kind(&self) -> c_int { EV_ABS } } impl Code for Multi { fn code(&self) -> c_int { match self { &Multi::Slot => ABS_MT_SLOT, &Multi::TouchMajor => ABS_MT_TOUCH_MAJOR, &Multi::TouchMinor => ABS_MT_TOUCH_MINOR, &Multi::WidthMajor => ABS_MT_WIDTH_MAJOR, &Multi::WidthMinor => ABS_MT_WIDTH_MINOR, &Multi::Orientation => ABS_MT_ORIENTATION, &Multi::PositionX => ABS_MT_POSITION_X, &Multi::PositionY => ABS_MT_POSITION_Y, &Multi::ToolType => ABS_MT_TOOL_TYPE, &Multi::BlobId => ABS_MT_BLOB_ID, &Multi::TrackingId => ABS_MT_TRACKING_ID, &Multi::Pressure => ABS_MT_PRESSURE, &Multi::Distance => ABS_MT_DISTANCE, &Multi::ToolX => ABS_MT_TOOL_X, &Multi::ToolY => ABS_MT_TOOL_Y, } } }