#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
use std::time::SystemTime;
use std::{fmt, fmt::Display};
pub type GrabCallback = fn(event: Event) -> Option<Event>;
#[derive(Debug)]
#[non_exhaustive]
pub enum ListenError {
EventTapError,
LoopSourceError,
MissingDisplayError,
KeyboardError,
RecordContextEnablingError,
RecordContextError,
XRecordExtensionError,
KeyHookError(u32),
MouseHookError(u32),
}
#[derive(Debug)]
#[non_exhaustive]
pub enum GrabError {
ListenError,
EventTapError,
LoopSourceError,
MissingDisplayError,
MissingScreenError,
InvalidFileDescriptor,
KeyboardError,
KeyHookError(u32),
MouseHookError(u32),
SimulateError,
ExitGrabError(String),
IoError(std::io::Error),
}
#[non_exhaustive]
#[derive(Debug)]
pub enum DisplayError {
NoDisplay,
ConversionError,
}
impl From<SimulateError> for GrabError {
fn from(_: SimulateError) -> GrabError {
GrabError::SimulateError
}
}
#[derive(Debug)]
pub struct SimulateError;
impl Display for SimulateError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Could not simulate event")
}
}
impl std::error::Error for SimulateError {}
use strum_macros::EnumIter; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, EnumIter)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Key {
Alt,
AltGr,
Backspace,
CapsLock,
ControlLeft,
ControlRight,
Delete,
DownArrow,
End,
Escape,
F1,
F10,
F11,
F12,
F13,
F14,
F15,
F16,
F17,
F18,
F19,
F20,
F21,
F22,
F23,
F24,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
Home,
LeftArrow,
MetaLeft,
MetaRight,
PageDown,
PageUp,
Return,
RightArrow,
ShiftLeft,
ShiftRight,
Space,
Tab,
UpArrow,
PrintScreen,
ScrollLock,
Pause,
NumLock,
BackQuote,
Num1,
Num2,
Num3,
Num4,
Num5,
Num6,
Num7,
Num8,
Num9,
Num0,
Minus,
Equal,
KeyQ,
KeyW,
KeyE,
KeyR,
KeyT,
KeyY,
KeyU,
KeyI,
KeyO,
KeyP,
LeftBracket,
RightBracket,
KeyA,
KeyS,
KeyD,
KeyF,
KeyG,
KeyH,
KeyJ,
KeyK,
KeyL,
SemiColon,
Quote,
BackSlash,
IntlBackslash,
IntlRo, IntlYen, KanaMode, KeyZ,
KeyX,
KeyC,
KeyV,
KeyB,
KeyN,
KeyM,
Comma,
Dot,
Slash,
Insert,
KpReturn,
KpMinus,
KpPlus,
KpMultiply,
KpDivide,
KpDecimal,
KpEqual,
KpComma,
Kp0,
Kp1,
Kp2,
Kp3,
Kp4,
Kp5,
Kp6,
Kp7,
Kp8,
Kp9,
VolumeUp,
VolumeDown,
VolumeMute,
Lang1, Lang2, Lang3, Lang4, Lang5, Function,
Apps,
Cancel,
Clear,
Kana,
Hangul,
Junja,
Final,
Hanja,
Hanji,
Print,
Select,
Execute,
Help,
Sleep,
Separator,
Unknown(u32),
RawKey(RawKey),
}
#[cfg(not(target_os = "macos"))]
pub type KeyCode = u32;
#[cfg(target_os = "macos")]
pub type KeyCode = crate::CGKeyCode;
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, EnumIter)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum RawKey {
ScanCode(KeyCode),
WinVirtualKeycode(KeyCode),
LinuxXorgKeycode(KeyCode),
LinuxConsoleKeycode(KeyCode),
MacVirtualKeycode(KeyCode),
}
impl Default for RawKey {
fn default() -> Self {
Self::ScanCode(0)
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Button {
Left,
Right,
Middle,
Unknown(u8),
}
#[derive(Debug, Copy, Clone, PartialEq)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum EventType {
KeyPress(Key),
KeyRelease(Key),
ButtonPress(Button),
ButtonRelease(Button),
MouseMove {
x: f64,
y: f64,
},
Wheel {
delta_x: i64,
delta_y: i64,
},
}
#[derive(Debug, Clone, PartialEq, Default)]
pub struct UnicodeInfo {
pub name: Option<String>,
pub unicode: Vec<u16>,
pub is_dead: bool,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub struct Event {
pub time: SystemTime,
pub unicode: Option<UnicodeInfo>,
pub event_type: EventType,
pub platform_code: u32,
pub position_code: u32,
pub usb_hid: u32,
#[cfg(target_os = "windows")]
pub extra_data: winapi::shared::basetsd::ULONG_PTR,
#[cfg(target_os = "macos")]
pub extra_data: i64,
}
pub trait KeyboardState {
fn add(&mut self, event_type: &EventType) -> Option<UnicodeInfo>;
}