blob: a57dbb25e251029f56c079d3c0802a82641f4ad7 [file] [log] [blame]
use crate::compat::{
ABS_CNT, EV_CNT, FF_CNT, INPUT_PROP_CNT, LED_CNT, MSC_CNT, REL_CNT, SND_CNT, SW_CNT,
};
/// Event types supported by the device.
///
/// Values correspond to [/usr/include/linux/input-event-codes.h](https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h)
///
/// This is implemented as a newtype around the u16 "type" field of `input_event`.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct EventType(pub u16);
evdev_enum!(
EventType,
Array,
/// A bookkeeping event. Usually not important to applications.
SYNCHRONIZATION = 0x00,
/// A key changed state. A key, or button, is usually a momentary switch (in the circuit sense). It has two
/// states: down, or up. There are events for when keys are pressed (become down) and
/// released (become up). There are also "key repeats", where multiple events are sent
/// while a key is down.
KEY = 0x01,
/// Movement on a relative axis. There is no absolute coordinate frame, just the fact that
/// there was a change of a certain amount of units. Used for things like mouse movement or
/// scroll wheels.
RELATIVE = 0x02,
/// Movement on an absolute axis. Used for things such as touch events and joysticks.
ABSOLUTE = 0x03,
/// Miscellaneous events that don't fall into other categories. For example, Key presses may
/// send `MSC_SCAN` events before each KEY event
MISC = 0x04,
/// Change in a switch value. Switches are boolean conditions and usually correspond to a
/// toggle switch of some kind in hardware.
SWITCH = 0x05,
/// An LED was toggled.
LED = 0x11,
/// A sound was made.
SOUND = 0x12,
/// There are no events of this type, to my knowledge, but represents metadata about key
/// repeat configuration.
REPEAT = 0x14,
/// Looking at the source of [`fftest`](https://github.com/flosse/linuxconsole/blob/master/utils/fftest.c)
/// This seems to be sent to the device with a previusly obtained effect id as a code in order to toggle the effect.
FORCEFEEDBACK = 0x15,
/// I think this is unused?
POWER = 0x16,
/// A force feedback effect's state changed.
FORCEFEEDBACKSTATUS = 0x17,
/// An event originating from uinput.
UINPUT = 0x0101,
);
impl EventType {
pub(crate) const COUNT: usize = EV_CNT;
}
/// A "synchronization" message type published by the kernel into the events stream.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct SynchronizationCode(pub u16);
evdev_enum!(
SynchronizationCode,
/// Used to mark the end of a single atomic "reading" from the device.
SYN_REPORT = 0,
/// Appears to be unused.
SYN_CONFIG = 1,
/// "Used to synchronize and separate touch events"
SYN_MT_REPORT = 2,
/// Ring buffer filled, events were dropped.
SYN_DROPPED = 3,
);
/// Device properties.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct PropType(pub u16);
evdev_enum!(
PropType,
Array,
/// This input device needs a pointer ("cursor") for the user to know its state.
POINTER = 0x00,
/// "direct input devices", according to the header.
DIRECT = 0x01,
/// "has button(s) under pad", according to the header.
BUTTONPAD = 0x02,
/// Touch rectangle only (I think this means that if there are multiple touches, then the
/// bounding rectangle of all the touches is returned, not each touch).
SEMI_MT = 0x03,
/// "softbuttons at top of pad", according to the header.
TOPBUTTONPAD = 0x04,
/// Is a pointing stick ("nub" etc, <https://xkcd.com/243/>)
POINTING_STICK = 0x05,
/// Has an accelerometer. Probably reports relative events in that case?
ACCELEROMETER = 0x06,
);
impl PropType {
pub(crate) const COUNT: usize = INPUT_PROP_CNT;
}
/// A type of relative axis measurement, typically produced by mice.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct RelativeAxisCode(pub u16);
evdev_enum!(
RelativeAxisCode,
Array,
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_RESERVED = 0x0a,
REL_WHEEL_HI_RES = 0x0b,
REL_HWHEEL_HI_RES = 0x0c,
);
impl RelativeAxisCode {
pub(crate) const COUNT: usize = REL_CNT;
}
/// A type of absolute axis measurement, typically used for touch events and joysticks.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct AbsoluteAxisCode(pub u16);
evdev_enum!(
AbsoluteAxisCode,
Array,
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,
ABS_VOLUME = 0x20,
ABS_MISC = 0x28,
/// "MT slot being modified"
ABS_MT_SLOT = 0x2f,
/// "Major axis of touching ellipse"
ABS_MT_TOUCH_MAJOR = 0x30,
/// "Minor axis (omit if circular)"
ABS_MT_TOUCH_MINOR = 0x31,
/// "Major axis of approaching ellipse"
ABS_MT_WIDTH_MAJOR = 0x32,
/// "Minor axis (omit if circular)"
ABS_MT_WIDTH_MINOR = 0x33,
/// "Ellipse orientation"
ABS_MT_ORIENTATION = 0x34,
/// "Center X touch position"
ABS_MT_POSITION_X = 0x35,
/// "Center Y touch position"
ABS_MT_POSITION_Y = 0x36,
/// "Type of touching device"
ABS_MT_TOOL_TYPE = 0x37,
/// "Group a set of packets as a blob"
ABS_MT_BLOB_ID = 0x38,
/// "Unique ID of the initiated contact"
ABS_MT_TRACKING_ID = 0x39,
/// "Pressure on contact area"
ABS_MT_PRESSURE = 0x3a,
/// "Contact over distance"
ABS_MT_DISTANCE = 0x3b,
/// "Center X tool position"
ABS_MT_TOOL_X = 0x3c,
/// "Center Y tool position"
ABS_MT_TOOL_Y = 0x3d,
);
impl AbsoluteAxisCode {
pub(crate) const COUNT: usize = ABS_CNT;
}
/// An event type corresponding to a physical or virtual switch.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct SwitchCode(pub u16);
evdev_enum!(
SwitchCode,
Array,
/// "set = lid shut"
SW_LID = 0x00,
/// "set = tablet mode"
SW_TABLET_MODE = 0x01,
/// "set = inserted"
SW_HEADPHONE_INSERT = 0x02,
/// "rfkill master switch, type 'any'"
SW_RFKILL_ALL = 0x03,
/// "set = inserted"
SW_MICROPHONE_INSERT = 0x04,
/// "set = plugged into doc"
SW_DOCK = 0x05,
/// "set = inserted"
SW_LINEOUT_INSERT = 0x06,
/// "set = mechanical switch set"
SW_JACK_PHYSICAL_INSERT = 0x07,
/// "set = inserted"
SW_VIDEOOUT_INSERT = 0x08,
/// "set = lens covered"
SW_CAMERA_LENS_COVER = 0x09,
/// "set = keypad slide out"
SW_KEYPAD_SLIDE = 0x0a,
/// "set = front proximity sensor active"
SW_FRONT_PROXIMITY = 0x0b,
/// "set = rotate locked/disabled"
SW_ROTATE_LOCK = 0x0c,
/// "set = inserted"
SW_LINEIN_INSERT = 0x0d,
/// "set = device disabled"
SW_MUTE_DEVICE = 0x0e,
/// "set = pen inserted"
SW_PEN_INSERTED = 0x0f,
/// "set = cover closed"
SW_MACHINE_COVER = 0x10,
);
impl SwitchCode {
pub(crate) const COUNT: usize = SW_CNT;
}
/// LEDs specified by USB HID.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct LedCode(pub u16);
evdev_enum!(
LedCode,
Array,
LED_NUML = 0x00,
LED_CAPSL = 0x01,
LED_SCROLLL = 0x02,
LED_COMPOSE = 0x03,
LED_KANA = 0x04,
/// "Stand-by"
LED_SLEEP = 0x05,
LED_SUSPEND = 0x06,
LED_MUTE = 0x07,
/// "Generic indicator"
LED_MISC = 0x08,
/// "Message waiting"
LED_MAIL = 0x09,
/// "External power connected"
LED_CHARGING = 0x0a,
);
impl LedCode {
pub(crate) const COUNT: usize = LED_CNT;
}
/// Various miscellaneous event types.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct MiscCode(pub u16);
evdev_enum!(
MiscCode,
Array,
/// Serial number, only exported for tablets ("Transducer Serial Number")
MSC_SERIAL = 0x00,
/// Only used by the PowerMate driver, right now.
MSC_PULSELED = 0x01,
/// Completely unused.
MSC_GESTURE = 0x02,
/// "Raw" event, rarely used.
MSC_RAW = 0x03,
/// Key scancode
MSC_SCAN = 0x04,
/// Completely unused.
MSC_TIMESTAMP = 0x05,
);
impl MiscCode {
pub(crate) const COUNT: usize = MSC_CNT;
}
/// Force feedback effect types
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct FFEffectCode(pub u16);
evdev_enum!(
FFEffectCode,
Array,
/// Rumble effects.
FF_RUMBLE = 0x50,
/// Can render periodic effects with any of the waveforms.
FF_PERIODIC = 0x51,
/// Can render constant force effects.
FF_CONSTANT = 0x52,
/// Can simulate the presence of a spring.
FF_SPRING = 0x53,
/// Can simulate friction.
FF_FRICTION = 0x54,
/// Can simulate damper effects.
FF_DAMPER = 0x55,
/// Can simulate inertia.
FF_INERTIA = 0x56,
/// Can render ramp effects.
FF_RAMP = 0x57,
/// Square waveform.
FF_SQUARE = 0x58,
/// Triangle waveform.
FF_TRIANGLE = 0x59,
/// Sine waveform.
FF_SINE = 0x5a,
/// Sawtooth up waveform.
FF_SAW_UP = 0x5b,
/// Sawtooth down waveform.
FF_SAW_DOWN = 0x5c,
/// Custom waveform.
FF_CUSTOM = 0x5d,
/// The gain is adjustable.
FF_GAIN = 0x60,
/// The autocenter is adjustable.
FF_AUTOCENTER = 0x61,
);
impl FFEffectCode {
pub(crate) const COUNT: usize = FF_CNT;
}
/// Force feedback effect status
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct FFStatusCode(pub u16);
evdev_enum!(
FFStatusCode,
Array,
/// The force feedback event is currently stopped.
FF_STATUS_STOPPED = 0x00,
/// The force feedback event is currently playing.
FF_STATUS_PLAYING = 0x01,
);
impl FFStatusCode {
pub(crate) const COUNT: usize = 2;
}
#[derive(Copy, Clone, PartialEq, Eq)]
pub struct RepeatCode(pub u16);
evdev_enum!(RepeatCode, REP_DELAY = 0x00, REP_PERIOD = 0x01,);
// impl RepeatType {
// pub(crate) const COUNT: usize = libc::REP_CNT;
// }
/// A type associated with simple sounds, such as beeps or tones.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct SoundCode(pub u16);
evdev_enum!(
SoundCode,
Array,
SND_CLICK = 0x00,
SND_BELL = 0x01,
SND_TONE = 0x02,
);
impl SoundCode {
pub(crate) const COUNT: usize = SND_CNT;
}
/// A uinput event published by the kernel into the events stream for uinput devices.
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct UInputCode(pub u16);
evdev_enum!(
UInputCode,
/// The virtual uinput device is uploading a force feedback effect.
UI_FF_UPLOAD = 1,
/// The virtual uinput device is erasing a force feedback event.
UI_FF_ERASE = 2,
);
// some more structs without any constats. They are only there to
// porvide a consitatnt type system and simple code generation.
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PowerCode(pub u16);
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct OtherCode(pub u16, pub u16);