use crate::keyboard::key::KeyboardKey;
use ampsc::{ChannelConsumer, ChannelProducer};
use atspi::events::mouse::ButtonEvent;
use atspi::proxy::device_event_controller::{DeviceEvent, DeviceEventControllerProxy, EventType};
use some_executor::hint::Hint;
use some_executor::task::{Configuration, Task};
use some_executor::{Priority, SomeExecutor};
use std::sync::OnceLock;
use std::time::Instant;
static ONCE_SENDER: OnceLock<ChannelProducer<Event>> = OnceLock::new();
enum Event {
Key(KeyboardKey, bool),
Mouse(),
}
async fn ax_loop(mut receiver: ChannelConsumer<Event>) {
let connection = atspi::AccessibilityConnection::new().await;
let connection = match connection {
Ok(c) => c,
Err(e) => {
logwise::error_async!(
"Failed to connect to ATSPI: {e}",
e = logwise::privacy::LogIt(e)
);
return;
}
};
let start_time = Instant::now();
let device = DeviceEventControllerProxy::new(connection.connection())
.await
.expect("No device event controller proxy");
let mut modifiers: i32 = 0;
loop {
let event = receiver.receive().await.expect("No event");
match event {
Event::Key(key, pressed) => {
let event_type = if pressed {
EventType::KeyPressed
} else {
EventType::KeyReleased
};
let is_lock = key == KeyboardKey::CapsLock || key == KeyboardKey::NumLock;
let late_toggle_off;
if is_lock {
if !pressed {
if key_to_modifier(key) & modifiers == 0 {
modifiers |= key_to_modifier(key);
late_toggle_off = false;
} else {
late_toggle_off = true;
}
} else {
late_toggle_off = false;
}
} else {
late_toggle_off = false;
}
let is_numlock_enabled = modifiers & key_to_modifier(KeyboardKey::NumLock) != 0;
let device_event = DeviceEvent {
event_type,
id: key_to_id(key, is_numlock_enabled),
hw_code: key_to_x11(key),
modifiers,
timestamp: start_time.elapsed().as_millis() as i32,
event_string: key_to_name(key, is_numlock_enabled),
is_text: key_is_text_input(key),
};
device
.notify_listeners_sync(&device_event)
.await
.expect("Failed to notify listeners");
if is_lock {
if late_toggle_off {
modifiers &= !key_to_modifier(key);
}
} else {
if pressed {
modifiers |= key_to_modifier(key);
} else {
modifiers &= !key_to_modifier(key);
}
}
}
Event::Mouse() => {
let event = ButtonEvent {
item: Default::default(),
detail: "".to_string(),
mouse_x: 0,
mouse_y: 0,
};
connection
.send_event(event)
.await
.expect("Can't send event");
}
}
}
}
fn ax_init() -> ChannelProducer<Event> {
ONCE_SENDER
.get_or_init(|| {
let (sender, receiver) = ampsc::channel();
let mut ex = some_executor::current_executor::current_executor();
let t = Task::without_notifications(
"linux ax".to_string(),
ax_loop(receiver),
Configuration::new(Hint::IO, Priority::UserInteractive, Instant::now()),
)
.into_objsafe();
let o = ex.spawn_objsafe(t);
std::mem::forget(o);
sender
})
.clone()
}
pub fn ax_press(key: KeyboardKey, pressed: bool) {
let sender = ax_init();
let mut ex = some_executor::current_executor::current_executor();
let t = Task::without_notifications(
"linux ax".to_string(),
async move {
let mut sender = sender;
sender
.send(Event::Key(key, pressed))
.await
.expect("Failed to send event");
sender.async_drop().await;
},
Configuration::new(Hint::IO, Priority::UserInteractive, Instant::now()),
)
.into_objsafe();
let o = ex.spawn_objsafe(t);
std::mem::forget(o);
}
pub fn ax_mouse() {
let sender = ax_init();
let mut ex = some_executor::current_executor::current_executor();
let t = Task::without_notifications(
"linux ax".to_string(),
async move {
let mut sender = sender;
sender
.send(Event::Mouse())
.await
.expect("Failed to send event");
sender.async_drop().await;
},
Configuration::new(Hint::IO, Priority::UserInteractive, Instant::now()),
)
.into_objsafe();
let o = ex.spawn_objsafe(t);
std::mem::forget(o);
}
fn key_to_id(key: KeyboardKey, is_numlock_enabled: bool) -> i32 {
match key {
KeyboardKey::A => 0x0061, KeyboardKey::B => 0x0062, KeyboardKey::C => 0x0063, KeyboardKey::D => 0x0064, KeyboardKey::E => 0x0065, KeyboardKey::F => 0x0066, KeyboardKey::G => 0x0067, KeyboardKey::H => 0x0068, KeyboardKey::I => 0x0069, KeyboardKey::J => 0x006a, KeyboardKey::K => 0x006b, KeyboardKey::L => 0x006c, KeyboardKey::M => 0x006d, KeyboardKey::N => 0x006e, KeyboardKey::O => 0x006f, KeyboardKey::P => 0x0070, KeyboardKey::Q => 0x0071, KeyboardKey::R => 0x0072, KeyboardKey::S => 0x0073, KeyboardKey::T => 0x0074, KeyboardKey::U => 0x0075, KeyboardKey::V => 0x0076, KeyboardKey::W => 0x0077, KeyboardKey::X => 0x0078, KeyboardKey::Y => 0x0079, KeyboardKey::Z => 0x007a,
KeyboardKey::Num0 => 0x0030, KeyboardKey::Num1 => 0x0031, KeyboardKey::Num2 => 0x0032, KeyboardKey::Num3 => 0x0033, KeyboardKey::Num4 => 0x0034, KeyboardKey::Num5 => 0x0035, KeyboardKey::Num6 => 0x0036, KeyboardKey::Num7 => 0x0037, KeyboardKey::Num8 => 0x0038, KeyboardKey::Num9 => 0x0039,
KeyboardKey::Keypad0 => {
if is_numlock_enabled {
0xffb0
} else {
0xff95
}
} KeyboardKey::Keypad1 => {
if is_numlock_enabled {
0xffb1
} else {
0xff9c
}
} KeyboardKey::Keypad2 => {
if is_numlock_enabled {
0xffb2
} else {
0xff99
}
} KeyboardKey::Keypad3 => {
if is_numlock_enabled {
0xffb3
} else {
0xff9b
}
} KeyboardKey::Keypad4 => {
if is_numlock_enabled {
0xffb4
} else {
0xff96
}
} KeyboardKey::Keypad5 => {
if is_numlock_enabled {
0xffb5
} else {
0xff9d
}
} KeyboardKey::Keypad6 => {
if is_numlock_enabled {
0xffb6
} else {
0xff98
}
} KeyboardKey::Keypad7 => {
if is_numlock_enabled {
0xffb7
} else {
0xff97
}
} KeyboardKey::Keypad8 => {
if is_numlock_enabled {
0xffb8
} else {
0xff9a
}
} KeyboardKey::Keypad9 => {
if is_numlock_enabled {
0xffb9
} else {
0xff9a
}
} KeyboardKey::KeypadDecimal => {
if is_numlock_enabled {
0xffae
} else {
0xff9f
}
} KeyboardKey::KeypadMultiply => 0xffaa, KeyboardKey::KeypadPlus => 0xffab, KeyboardKey::KeypadClear => 0xff0b, KeyboardKey::KeypadDivide => 0xffaf, KeyboardKey::KeypadEnter => 0xff8d, KeyboardKey::KeypadMinus => 0xffad, KeyboardKey::KeypadEquals => 0xffbd,
KeyboardKey::F1 => 0xffbe, KeyboardKey::F2 => 0xffbf, KeyboardKey::F3 => 0xffc0, KeyboardKey::F4 => 0xffc1, KeyboardKey::F5 => 0xffc2, KeyboardKey::F6 => 0xffc3, KeyboardKey::F7 => 0xffc4, KeyboardKey::F8 => 0xffc5, KeyboardKey::F9 => 0xffc6, KeyboardKey::F10 => 0xffc7, KeyboardKey::F11 => 0xffc8, KeyboardKey::F12 => 0xffc9, KeyboardKey::F13 => 0xffca, KeyboardKey::F14 => 0xffcb, KeyboardKey::F15 => 0xffcc, KeyboardKey::F16 => 0xffcd, KeyboardKey::F17 => 0xffce, KeyboardKey::F18 => 0xffcf, KeyboardKey::F19 => 0xffd0, KeyboardKey::F20 => 0xffd1, KeyboardKey::F21 => 0xffd2, KeyboardKey::F22 => 0xffd3, KeyboardKey::F23 => 0xffd4, KeyboardKey::F24 => 0xffd5,
KeyboardKey::Space => 0x0020, KeyboardKey::Minus => 0x002d, KeyboardKey::Equal => 0x003d, KeyboardKey::LeftBracket => 0x005b, KeyboardKey::RightBracket => 0x005d, KeyboardKey::Backslash => 0x005c, KeyboardKey::Semicolon => 0x003b, KeyboardKey::Quote => 0x0027, KeyboardKey::Grave => 0x0060, KeyboardKey::Comma => 0x002c, KeyboardKey::Period => 0x002e, KeyboardKey::Slash => 0x002f,
KeyboardKey::Return => 0xff0d, KeyboardKey::Tab => 0xff09, KeyboardKey::Delete => 0xff08, KeyboardKey::ForwardDelete => 0xffff, KeyboardKey::Escape => 0xff1b, KeyboardKey::Home => 0xff50, KeyboardKey::PageUp => 0xff55, KeyboardKey::PageDown => 0xff56, KeyboardKey::End => 0xff57, KeyboardKey::Help => 0xff6a, KeyboardKey::LeftArrow => 0xff51, KeyboardKey::RightArrow => 0xff53, KeyboardKey::DownArrow => 0xff54, KeyboardKey::UpArrow => 0xff52,
KeyboardKey::Shift => 0xffe1, KeyboardKey::RightShift => 0xffe2, KeyboardKey::Control => 0xffe3, KeyboardKey::RightControl => 0xffe4, KeyboardKey::Option => 0xffe9, KeyboardKey::RightOption => 0xffea, KeyboardKey::Command => 0xffeb, KeyboardKey::RightCommand => 0xffec, KeyboardKey::Function => 0xfd1e, KeyboardKey::CapsLock => 0xffe5,
KeyboardKey::VolumeUp => 0x1008ff13, KeyboardKey::VolumeDown => 0x1008ff11, KeyboardKey::Mute => 0x1008ff12, KeyboardKey::Play => 0x1008ff14, KeyboardKey::Stop => 0x1008ff15, KeyboardKey::PreviousTrack => 0x1008ff16, KeyboardKey::NextTrack => 0x1008ff17, KeyboardKey::Eject => 0x1008ff2c,
KeyboardKey::PrintScreen => 0xff61, KeyboardKey::ScrollLock => 0xff14, KeyboardKey::Pause => 0xff13, KeyboardKey::Insert => 0xff63, KeyboardKey::NumLock => 0xff7f, KeyboardKey::ContextMenu => 0xff67, KeyboardKey::Power => 0x1008ff2a,
KeyboardKey::BrowserBack => 0x1008ff26, KeyboardKey::BrowserForward => 0x1008ff27, KeyboardKey::BrowserRefresh => 0x1008ff29, KeyboardKey::BrowserStop => 0x1008ff28, KeyboardKey::BrowserSearch => 0x1008ff1b, KeyboardKey::BrowserFavorites => 0x1008ff30, KeyboardKey::BrowserHome => 0x1008ff18,
KeyboardKey::LaunchMail => 0x1008ff19, KeyboardKey::MediaSelect => 0x1008ff32, KeyboardKey::LaunchApp1 => 0x1008ff1c, KeyboardKey::LaunchApp2 => 0x1008ff1d,
KeyboardKey::JISKana => 0xff2d, KeyboardKey::JISEisu => 0xff2f, KeyboardKey::JISYen => 0x0a5, KeyboardKey::JISUnderscore => 0x5f, KeyboardKey::JISKeypadComma => 0xffac, KeyboardKey::ISOSection => 0xa7, KeyboardKey::InternationalBackslash => 0x5c,
KeyboardKey::Again => 0xff66, KeyboardKey::Undo => 0xff65, KeyboardKey::Cut => 0xff63, KeyboardKey::Copy => 0xff62, KeyboardKey::Paste => 0xff63, KeyboardKey::Find => 0xff68, KeyboardKey::Props => 0xff62, KeyboardKey::Select => 0xff60, KeyboardKey::Open => 0xff62,
KeyboardKey::Convert => 0xff21, KeyboardKey::NonConvert => 0xff22,
KeyboardKey::WakeUp => 0x1008ff2b, KeyboardKey::ContextualMenu => 0xff67, }
}
fn key_to_x11(key: KeyboardKey) -> i32 {
match key {
KeyboardKey::Q => 24,
KeyboardKey::W => 25,
KeyboardKey::E => 26,
KeyboardKey::R => 27,
KeyboardKey::T => 28,
KeyboardKey::Y => 29,
KeyboardKey::U => 30,
KeyboardKey::I => 31,
KeyboardKey::O => 32,
KeyboardKey::P => 33,
KeyboardKey::A => 38,
KeyboardKey::S => 39,
KeyboardKey::D => 40,
KeyboardKey::F => 41,
KeyboardKey::G => 42,
KeyboardKey::H => 43,
KeyboardKey::J => 44,
KeyboardKey::K => 45,
KeyboardKey::L => 46,
KeyboardKey::Z => 52,
KeyboardKey::X => 53,
KeyboardKey::C => 54,
KeyboardKey::V => 55,
KeyboardKey::B => 56,
KeyboardKey::N => 57,
KeyboardKey::M => 58,
KeyboardKey::Num1 => 10,
KeyboardKey::Num2 => 11,
KeyboardKey::Num3 => 12,
KeyboardKey::Num4 => 13,
KeyboardKey::Num5 => 14,
KeyboardKey::Num6 => 15,
KeyboardKey::Num7 => 16,
KeyboardKey::Num8 => 17,
KeyboardKey::Num9 => 18,
KeyboardKey::Num0 => 19,
KeyboardKey::F1 => 67,
KeyboardKey::F2 => 68,
KeyboardKey::F3 => 69,
KeyboardKey::F4 => 70,
KeyboardKey::F5 => 71,
KeyboardKey::F6 => 72,
KeyboardKey::F7 => 73,
KeyboardKey::F8 => 74,
KeyboardKey::F9 => 75,
KeyboardKey::F10 => 76,
KeyboardKey::F11 => 95,
KeyboardKey::F12 => 96,
KeyboardKey::F13 => 191, KeyboardKey::F14 => 192,
KeyboardKey::F15 => 193,
KeyboardKey::F16 => 194,
KeyboardKey::F17 => 195,
KeyboardKey::F18 => 196,
KeyboardKey::F19 => 197,
KeyboardKey::F20 => 198,
KeyboardKey::F21 => 199,
KeyboardKey::F22 => 200,
KeyboardKey::F23 => 201,
KeyboardKey::F24 => 202,
KeyboardKey::Minus => 20,
KeyboardKey::Equal => 21,
KeyboardKey::LeftBracket => 34,
KeyboardKey::RightBracket => 35,
KeyboardKey::Semicolon => 47,
KeyboardKey::Quote => 48,
KeyboardKey::Grave => 49,
KeyboardKey::Backslash => 51,
KeyboardKey::Comma => 59,
KeyboardKey::Period => 60,
KeyboardKey::Slash => 61,
KeyboardKey::Shift => 50,
KeyboardKey::RightShift => 62,
KeyboardKey::Control => 37,
KeyboardKey::RightControl => 105,
KeyboardKey::Option => 64, KeyboardKey::RightOption => 108, KeyboardKey::Command => 133, KeyboardKey::RightCommand => 134, KeyboardKey::Function => 135, KeyboardKey::CapsLock => 66,
KeyboardKey::Return => 36,
KeyboardKey::Tab => 23,
KeyboardKey::Space => 65,
KeyboardKey::Delete => 22, KeyboardKey::ForwardDelete => 119, KeyboardKey::Escape => 9,
KeyboardKey::Home => 110,
KeyboardKey::PageUp => 112,
KeyboardKey::PageDown => 117,
KeyboardKey::End => 115,
KeyboardKey::LeftArrow => 113,
KeyboardKey::RightArrow => 114,
KeyboardKey::DownArrow => 116,
KeyboardKey::UpArrow => 111,
KeyboardKey::KeypadDecimal => 91,
KeyboardKey::KeypadMultiply => 63,
KeyboardKey::KeypadPlus => 86,
KeyboardKey::KeypadClear => 91, KeyboardKey::KeypadDivide => 106,
KeyboardKey::KeypadEnter => 104,
KeyboardKey::KeypadMinus => 82,
KeyboardKey::KeypadEquals => 125,
KeyboardKey::Keypad0 => 90,
KeyboardKey::Keypad1 => 87,
KeyboardKey::Keypad2 => 88,
KeyboardKey::Keypad3 => 89,
KeyboardKey::Keypad4 => 83,
KeyboardKey::Keypad5 => 84,
KeyboardKey::Keypad6 => 85,
KeyboardKey::Keypad7 => 79,
KeyboardKey::Keypad8 => 80,
KeyboardKey::Keypad9 => 81,
KeyboardKey::NumLock => 77,
KeyboardKey::ScrollLock => 78,
KeyboardKey::VolumeUp => 123,
KeyboardKey::VolumeDown => 122,
KeyboardKey::Mute => 121,
KeyboardKey::Play => 172,
KeyboardKey::Stop => 174,
KeyboardKey::PreviousTrack => 173,
KeyboardKey::NextTrack => 171,
KeyboardKey::PrintScreen => 107,
KeyboardKey::Pause => 127,
KeyboardKey::Insert => 118,
KeyboardKey::Power => 124,
KeyboardKey::Eject => 169,
KeyboardKey::BrowserBack => 166,
KeyboardKey::BrowserForward => 167,
KeyboardKey::BrowserRefresh => 181,
KeyboardKey::BrowserStop => 174, KeyboardKey::BrowserSearch => 225,
KeyboardKey::BrowserFavorites => 164,
KeyboardKey::BrowserHome => 180,
KeyboardKey::LaunchMail => 163,
KeyboardKey::MediaSelect => 234,
KeyboardKey::LaunchApp1 => 156,
KeyboardKey::LaunchApp2 => 157,
KeyboardKey::Convert => 100, KeyboardKey::NonConvert => 102, KeyboardKey::JISKana => 101, KeyboardKey::JISEisu => 98, KeyboardKey::JISYen => 94, KeyboardKey::JISUnderscore => 20, KeyboardKey::JISKeypadComma => 129,
KeyboardKey::Help => 146,
KeyboardKey::Again => 137,
KeyboardKey::Undo => 139,
KeyboardKey::Cut => 145,
KeyboardKey::Copy => 141,
KeyboardKey::Paste => 143,
KeyboardKey::Find => 144,
KeyboardKey::Props => 138, KeyboardKey::Select => 0, KeyboardKey::Open => 142,
KeyboardKey::ContextMenu => 135, KeyboardKey::ContextualMenu => 135, KeyboardKey::WakeUp => 151,
KeyboardKey::ISOSection => 94, KeyboardKey::InternationalBackslash => 94, }
}
fn key_to_name(key: KeyboardKey, is_numlock_enabled: bool) -> &'static str {
match key {
KeyboardKey::A => "a",
KeyboardKey::B => "b",
KeyboardKey::C => "c",
KeyboardKey::D => "d",
KeyboardKey::E => "e",
KeyboardKey::F => "f",
KeyboardKey::G => "g",
KeyboardKey::H => "h",
KeyboardKey::I => "i",
KeyboardKey::J => "j",
KeyboardKey::K => "k",
KeyboardKey::L => "l",
KeyboardKey::M => "m",
KeyboardKey::N => "n",
KeyboardKey::O => "o",
KeyboardKey::P => "p",
KeyboardKey::Q => "q",
KeyboardKey::R => "r",
KeyboardKey::S => "s",
KeyboardKey::T => "t",
KeyboardKey::U => "u",
KeyboardKey::V => "v",
KeyboardKey::W => "w",
KeyboardKey::X => "x",
KeyboardKey::Y => "y",
KeyboardKey::Z => "z",
KeyboardKey::Num0 => "0",
KeyboardKey::Num1 => "1",
KeyboardKey::Num2 => "2",
KeyboardKey::Num3 => "3",
KeyboardKey::Num4 => "4",
KeyboardKey::Num5 => "5",
KeyboardKey::Num6 => "6",
KeyboardKey::Num7 => "7",
KeyboardKey::Num8 => "8",
KeyboardKey::Num9 => "9",
KeyboardKey::Space => "space",
KeyboardKey::Minus => "-",
KeyboardKey::Equal => "=",
KeyboardKey::LeftBracket => "[",
KeyboardKey::RightBracket => "]",
KeyboardKey::Backslash => "\\",
KeyboardKey::Semicolon => ";",
KeyboardKey::Quote => "'",
KeyboardKey::Grave => "`",
KeyboardKey::Comma => ",",
KeyboardKey::Period => ".",
KeyboardKey::Slash => "/",
KeyboardKey::Shift => "Shift_L",
KeyboardKey::RightShift => "Shift_R",
KeyboardKey::Control => "Control_L",
KeyboardKey::RightControl => "Control_R",
KeyboardKey::Option => "Alt_L",
KeyboardKey::RightOption => "Alt_R",
KeyboardKey::Command => "Meta_L",
KeyboardKey::RightCommand => "Meta_R",
KeyboardKey::Function => "VoidSymbol", KeyboardKey::CapsLock => "Caps_Lock",
KeyboardKey::F1 => "F1",
KeyboardKey::F2 => "F2",
KeyboardKey::F3 => "F3",
KeyboardKey::F4 => "F4",
KeyboardKey::F5 => "F5",
KeyboardKey::F6 => "F6",
KeyboardKey::F7 => "F7",
KeyboardKey::F8 => "F8",
KeyboardKey::F9 => "F9",
KeyboardKey::F10 => "F10",
KeyboardKey::F11 => "F11",
KeyboardKey::F12 => "F12",
KeyboardKey::F13 => "F13",
KeyboardKey::F14 => "F14",
KeyboardKey::F15 => "F15",
KeyboardKey::F16 => "F16",
KeyboardKey::F17 => "F17",
KeyboardKey::F18 => "F18",
KeyboardKey::F19 => "F19",
KeyboardKey::F20 => "F20",
KeyboardKey::F21 => "F21",
KeyboardKey::F22 => "F22",
KeyboardKey::F23 => "F23",
KeyboardKey::F24 => "F24",
KeyboardKey::Return => "Return",
KeyboardKey::Tab => "Tab",
KeyboardKey::Delete => "BackSpace",
KeyboardKey::ForwardDelete => "Delete",
KeyboardKey::Escape => "Escape",
KeyboardKey::Home => "Home",
KeyboardKey::PageUp => "Page_Up",
KeyboardKey::PageDown => "Page_Down",
KeyboardKey::End => "End",
KeyboardKey::LeftArrow => "Left",
KeyboardKey::RightArrow => "Right",
KeyboardKey::DownArrow => "Down",
KeyboardKey::UpArrow => "Up",
KeyboardKey::Help => "Help",
KeyboardKey::KeypadDecimal => {
if is_numlock_enabled {
"."
} else {
"KP_Delete"
}
}
KeyboardKey::KeypadMultiply => "*",
KeyboardKey::KeypadPlus => "+",
KeyboardKey::KeypadClear => "Clear",
KeyboardKey::KeypadDivide => "/",
KeyboardKey::KeypadEnter => "KP_Enter",
KeyboardKey::KeypadMinus => "-",
KeyboardKey::KeypadEquals => "=",
KeyboardKey::Keypad0 => {
if is_numlock_enabled {
"0"
} else {
"KP_Insert"
}
}
KeyboardKey::Keypad1 => {
if is_numlock_enabled {
"1"
} else {
"KP_End"
}
}
KeyboardKey::Keypad2 => {
if is_numlock_enabled {
"2"
} else {
"KP_Down"
}
}
KeyboardKey::Keypad3 => {
if is_numlock_enabled {
"3"
} else {
"KP_Next"
}
} KeyboardKey::Keypad4 => {
if is_numlock_enabled {
"4"
} else {
"KP_Left"
}
}
KeyboardKey::Keypad5 => {
if is_numlock_enabled {
"5"
} else {
"KP_Begin"
}
}
KeyboardKey::Keypad6 => {
if is_numlock_enabled {
"6"
} else {
"KP_Right"
}
}
KeyboardKey::Keypad7 => {
if is_numlock_enabled {
"7"
} else {
"KP_Home"
}
}
KeyboardKey::Keypad8 => {
if is_numlock_enabled {
"8"
} else {
"KP_Up"
}
}
KeyboardKey::Keypad9 => {
if is_numlock_enabled {
"9"
} else {
"KP_Page_Up"
}
}
KeyboardKey::NumLock => "Num_Lock",
KeyboardKey::ScrollLock => "Scroll_Lock",
KeyboardKey::PrintScreen => "Print",
KeyboardKey::Pause => "Pause",
KeyboardKey::Insert => "Insert",
KeyboardKey::ContextMenu => "Menu",
KeyboardKey::Power => "PowerOff",
KeyboardKey::VolumeUp => "AudioRaiseVolume",
KeyboardKey::VolumeDown => "AudioLowerVolume",
KeyboardKey::Mute => "AudioMute",
KeyboardKey::Play => "AudioPlay",
KeyboardKey::Stop => "AudioStop",
KeyboardKey::PreviousTrack => "AudioPrev",
KeyboardKey::NextTrack => "AudioNext",
KeyboardKey::BrowserBack => "Back",
KeyboardKey::BrowserForward => "Forward",
KeyboardKey::BrowserRefresh => "Refresh",
KeyboardKey::BrowserStop => "Stop",
KeyboardKey::BrowserSearch => "Search",
KeyboardKey::BrowserFavorites => "Favorites",
KeyboardKey::BrowserHome => "HomePage",
KeyboardKey::LaunchMail => "Mail",
KeyboardKey::MediaSelect => "AudioMedia",
KeyboardKey::LaunchApp1 => "Launch0",
KeyboardKey::LaunchApp2 => "Launch1",
KeyboardKey::Convert => "Henkan",
KeyboardKey::NonConvert => "Muhenkan",
KeyboardKey::JISKana => "Kana_Lock",
KeyboardKey::JISEisu => "Eisu_toggle",
KeyboardKey::JISYen => "yen",
KeyboardKey::JISUnderscore => "underscore",
KeyboardKey::JISKeypadComma => "KP_Separator",
KeyboardKey::ISOSection => "section",
KeyboardKey::InternationalBackslash => "backslash",
KeyboardKey::Again => "Redo",
KeyboardKey::Undo => "Undo",
KeyboardKey::Cut => "Cut",
KeyboardKey::Copy => "Copy",
KeyboardKey::Paste => "Paste",
KeyboardKey::Find => "Find",
KeyboardKey::Props => "Execute",
KeyboardKey::Select => "Select",
KeyboardKey::Open => "Open",
KeyboardKey::WakeUp => "WakeUp",
KeyboardKey::Eject => "Eject",
KeyboardKey::ContextualMenu => "Menu",
}
}
fn key_to_modifier(key: KeyboardKey) -> i32 {
match key {
KeyboardKey::Shift | KeyboardKey::RightShift => 1 << 0,
KeyboardKey::CapsLock => 1 << 1,
KeyboardKey::Control | KeyboardKey::RightControl => 1 << 2,
KeyboardKey::Option | KeyboardKey::RightOption => 1 << 3,
KeyboardKey::Command | KeyboardKey::RightCommand => 1 << 6,
KeyboardKey::NumLock => 1 << 14,
_ => 0,
}
}
fn key_is_text_input(key: KeyboardKey) -> bool {
match key {
KeyboardKey::A
| KeyboardKey::B
| KeyboardKey::C
| KeyboardKey::D
| KeyboardKey::E
| KeyboardKey::F
| KeyboardKey::G
| KeyboardKey::H
| KeyboardKey::I
| KeyboardKey::J
| KeyboardKey::K
| KeyboardKey::L
| KeyboardKey::M
| KeyboardKey::N
| KeyboardKey::O
| KeyboardKey::P
| KeyboardKey::Q
| KeyboardKey::R
| KeyboardKey::S
| KeyboardKey::T
| KeyboardKey::U
| KeyboardKey::V
| KeyboardKey::W
| KeyboardKey::X
| KeyboardKey::Y
| KeyboardKey::Z => true,
KeyboardKey::Num0
| KeyboardKey::Num1
| KeyboardKey::Num2
| KeyboardKey::Num3
| KeyboardKey::Num4
| KeyboardKey::Num5
| KeyboardKey::Num6
| KeyboardKey::Num7
| KeyboardKey::Num8
| KeyboardKey::Num9 => true,
KeyboardKey::Space
| KeyboardKey::Minus
| KeyboardKey::Equal
| KeyboardKey::LeftBracket
| KeyboardKey::RightBracket
| KeyboardKey::Backslash
| KeyboardKey::Semicolon
| KeyboardKey::Quote
| KeyboardKey::Grave
| KeyboardKey::Comma
| KeyboardKey::Period
| KeyboardKey::Slash => true,
KeyboardKey::Keypad0
| KeyboardKey::Keypad1
| KeyboardKey::Keypad2
| KeyboardKey::Keypad3
| KeyboardKey::Keypad4
| KeyboardKey::Keypad5
| KeyboardKey::Keypad6
| KeyboardKey::Keypad7
| KeyboardKey::Keypad8
| KeyboardKey::Keypad9
| KeyboardKey::KeypadDecimal
| KeyboardKey::KeypadMultiply
| KeyboardKey::KeypadPlus
| KeyboardKey::KeypadDivide
| KeyboardKey::KeypadMinus
| KeyboardKey::KeypadEquals => true,
KeyboardKey::JISYen | KeyboardKey::JISUnderscore | KeyboardKey::JISKeypadComma => true,
_ => false,
}
}