From 950bbaa9904ef3af61ac1ef52647f3dcb0083adb Mon Sep 17 00:00:00 2001
From: Haitham <128622475+haithium@users.noreply.github.com>
Date: Sun, 31 May 2026 15:40:21 +0300
Subject: [PATCH 1/4] docs: update index.md
Expanded documentation for the evdev Lua module, detailing compatibility, installation, use cases, and quick start examples.
---
docs/index.md | 60 +++++++++++++++++++++++++++++++++++----------------
1 file changed, 42 insertions(+), 18 deletions(-)
diff --git a/docs/index.md b/docs/index.md
index 2a4c19b..dfe8618 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,26 +1,50 @@
# What is evdev?
-`evdev` provides Lua bindings for working with Linux input devices through the
-evdev interface.
+`evdev` is a Lua module for working with Linux input devices through the evdev
+interface.
-It lets Lua discover Linux input devices, read raw events, grab devices, and
-create virtual input devices with uinput.
+Compatible with Lua 5.1, 5.2, 5.3, 5.4, 5.5, and LuaJIT.
-## Compatibility
+Use `evdev` to read events from keyboards, mice, gamepads, and other
+`/dev/input` devices, grab a device while handling input yourself, or create
+virtual keyboards, mice, and controllers through `/dev/uinput`.
-`evdev` supports:
+## Install
-- Lua 5.1
-- Lua 5.2
-- Lua 5.3
-- Lua 5.4
-- Lua 5.5
-- LuaJIT
+::: code-group
-## Use Cases
+```sh [LuaRocks]
+luarocks install bluelua-evdev
+```
-- Build input automation tools.
-- Read keyboard, mouse, gamepad, and other Linux input events from Lua.
-- Inspect devices under `/dev/input`.
-- Grab a device while handling input yourself.
-- Create virtual keyboards, mice, or controllers for tests and tooling.
+:::
+
+## Quick Start
+
+::: code-group
+
+```lua [lis-devices.lua]
+local evdev = require "evdev"
+
+for _, info in ipairs(devices) do
+ print(info.path, info.name)
+end
+```
+
+```lua [open-device.lua]
+local evdev = require "evdev"
+
+local dev = assert(evdev.device("/dev/input/event3"))
+print("opened:", dev.name)
+```
+
+```lua [read-events.lua]
+local evdev = require "evdev"
+local dev = assert(evdev.device("/dev/input/event3"))
+
+for event in dev:events() do
+ print(event.type, event.code, event.value)
+end
+```
+
+:::
From 2b9e30d37ca531abee61b19e5f38d6591c060f5a Mon Sep 17 00:00:00 2001
From: Haitham <128622475+haithium@users.noreply.github.com>
Date: Sun, 31 May 2026 15:41:30 +0300
Subject: [PATCH 2/4] ci: add lint.yml
---
.github/workflows/lint.yml | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 .github/workflows/lint.yml
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000..fcf3fa4
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,30 @@
+name: Lint
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/lint.yml"
+ - ".markdownlint-cli2.jsonc"
+ - ".stylua.toml"
+ - "src/**/*.lua"
+ - "**/*.md"
+ pull_request:
+ paths:
+ - ".github/workflows/lint.yml"
+ - ".markdownlint-cli2.jsonc"
+ - ".stylua.toml"
+ - "**/*.lua"
+ - "**/*.md"
+ workflow_dispatch:
+
+jobs:
+ stylua:
+ uses: BlueLua/bluelua.github.io/.github/workflows/stylua.yml@main
+
+ luacheck:
+ uses: BlueLua/bluelua.github.io/.github/workflows/luacheck.yml@main
+
+ markdownlint:
+ uses: BlueLua/bluelua.github.io/.github/workflows/markdownlint.yml@main
From d4e7ff37a495a9b969afb61b5fc90a9cc4be9664 Mon Sep 17 00:00:00 2001
From: Haitham <128622475+haithium@users.noreply.github.com>
Date: Sun, 31 May 2026 15:42:28 +0300
Subject: [PATCH 3/4] ci: add GitHub Actions workflow to generate docs
---
.github/workflows/generate-docs.yml | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
create mode 100644 .github/workflows/generate-docs.yml
diff --git a/.github/workflows/generate-docs.yml b/.github/workflows/generate-docs.yml
new file mode 100644
index 0000000..38b240e
--- /dev/null
+++ b/.github/workflows/generate-docs.yml
@@ -0,0 +1,17 @@
+name: Generate docs
+
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/generate-docs.yml"
+ - "types/**"
+ workflow_dispatch:
+
+jobs:
+ generate-docs:
+ permissions:
+ contents: write
+ pull-requests: write
+ uses: BlueLua/bluelua.github.io/.github/workflows/generate-docs.yml@main
From 11145196d39e0ab8c1b7a74afde02435c6956cf0 Mon Sep 17 00:00:00 2001
From: haithium <128622475+haithium@users.noreply.github.com>
Date: Sun, 31 May 2026 12:42:43 +0000
Subject: [PATCH 4/4] docs: generate API docs
---
docs/device.md | 340 ++++
docs/devices.md | 127 ++
docs/ecodes.md | 4759 ++++++++++++++++++++++++++++++++++++++++++++++
docs/evdev.md | 8 +
docs/events.md | 177 ++
docs/selector.md | 172 ++
docs/uinput.md | 151 ++
7 files changed, 5734 insertions(+)
create mode 100644 docs/device.md
create mode 100644 docs/devices.md
create mode 100644 docs/ecodes.md
create mode 100644 docs/evdev.md
create mode 100644 docs/events.md
create mode 100644 docs/selector.md
create mode 100644 docs/uinput.md
diff --git a/docs/device.md b/docs/device.md
new file mode 100644
index 0000000..84398e5
--- /dev/null
+++ b/docs/device.md
@@ -0,0 +1,340 @@
+---
+description: "One Linux input event returned by `Device:read()`."
+---
+
+# `device`
+
+One Linux input event returned by `Device:read()`.
+
+## Functions
+
+| Function | Description |
+| --------------------------------------------- | --------------------------------------------------------------------- |
+| [`close()`](#fn-close) | Close the device. |
+| [`events()`](#fn-events) | Return an iterator that waits for and yields input events one by one. |
+| [`fd()`](#fn-fd) | Return the underlying Linux file descriptor. |
+| [`flush()`](#fn-flush) | Drain queued events and return how many were discarded. |
+| [`get_repeat()`](#fn-get-repeat) | Return the current auto-repeat delay and period in milliseconds. |
+| [`grab()`](#fn-grab) | Take exclusive control of the input device. |
+| [`is_device(value)`](#fn-is-device) | Return whether a value is an `evdev.Device` instance. |
+| [`is_open()`](#fn-is-open) | Return whether this device handle still has an open file descriptor. |
+| [`open(path)`](#fn-open) | Open an input device by path. |
+| [`poll()`](#fn-poll) | Wait in the kernel until this device has input available. |
+| [`read()`](#fn-read) | Read one input event. Returns `nil` when no event is queued. |
+| [`set_repeat(delay, period)`](#fn-set-repeat) | Set the auto-repeat delay and period in milliseconds. |
+| [`ungrab()`](#fn-ungrab) | Release exclusive control of the input device. |
+
+
+
+### `close()`
+
+Close the device.
+
+**Return**:
+
+- `ok` (`boolean`): `true` when the device closes successfully.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+print(dev:is_open()) --> true
+dev:close()
+print(dev:is_open()) --> false
+```
+
+
+
+### `events()`
+
+Return an iterator that waits for and yields input events one by one.
+
+**Return**:
+
+- `evdev.event?` (`fun():`)
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+for e in dev:events() do
+ if e.type == ecodes.EV_KEY then
+ print(e.code, e.value)
+ end
+end
+```
+
+
+
+### `fd()`
+
+Return the underlying Linux file descriptor.
+
+**Return**:
+
+- `fd` (`evdev.fd?`): Linux file descriptor.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+local fd = dev:fd()
+print(fd)
+```
+
+
+
+### `flush()`
+
+Drain queued events and return how many were discarded.
+
+This is useful after grabbing a device when you want to ignore any stale events
+that were already queued.
+
+**Return**:
+
+- `count` (`integer?`): Number of discarded events.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+assert(dev:grab())
+os.execute("sleep 3")
+
+-- Move the mouse or press keys during the sleep.
+
+local dropped = assert(dev:flush())
+print("discarded", dropped, "stale events")
+```
+
+
+
+### `get_repeat()`
+
+Return the current auto-repeat delay and period in milliseconds.
+
+**Return**:
+
+- `delay` (`integer?`): Initial delay before repeating (milliseconds).
+- `period` (`integer?`): Interval between repeats (milliseconds).
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+local delay, period, err = dev:get_repeat()
+assert(delay, err)
+print(delay, period)
+```
+
+
+
+### `grab()`
+
+Take exclusive control of the input device.
+
+**Return**:
+
+- `ok` (`true?`): `true` when the device is grabbed successfully.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+assert(dev:grab())
+```
+
+
+
+### `is_device(value)`
+
+Return whether a value is an `evdev.Device` instance.
+
+**Parameters**:
+
+- `value` (`any`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local is_device = evdev.device.is_device
+
+local dev = assert(Device("/dev/input/eventX"))
+print(is_device(dev)) --> true
+print(is_device({})) --> false
+```
+
+
+
+### `is_open()`
+
+Return whether this device handle still has an open file descriptor.
+
+**Return**:
+
+- `isOpen` (`boolean`): `true` when the device is still open.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+if dev:is_open()
+ then dev:close()
+end
+```
+
+
+
+### `open(path)`
+
+Open an input device by path.
+
+**Parameters**:
+
+- `path` (`evdev.path`)
+
+**Return**:
+
+- `dev` (`evdev.Device?`): Open input device.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+```
+
+
+
+### `poll()`
+
+Wait in the kernel until this device has input available.
+
+This does not spin the CPU. It returns when `read()` can fetch at least one
+queued event.
+
+**Return**:
+
+- `ready` (`boolean?`): `true` when input is ready to read.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local ecodes = evdev.ecodes
+
+local dev = assert(Device("/dev/input/eventX"))
+
+-- This is the manual form of `dev:events()`.
+while true do
+ if assert(dev:poll()) then
+ local e = assert(dev:read())
+ if e.type == ecodes.EV_KEY then
+ print(e.code, e.value)
+ end
+ end
+end
+```
+
+
+
+### `read()`
+
+Read one input event. Returns `nil` when no event is queued.
+
+**Return**:
+
+- `event` (`evdev.event?`): Next queued input event.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+-- This is the manual form of `dev:events()`.
+while true do
+ if assert(dev:poll()) then
+ local e = assert(dev:read())
+ if e.type == ecodes.EV_KEY then
+ print(e.code, e.value)
+ end
+ end
+end
+```
+
+
+
+### `set_repeat(delay, period)`
+
+Set the auto-repeat delay and period in milliseconds.
+
+**Parameters**:
+
+- `delay` (`integer`): Initial delay before repeating (milliseconds).
+- `period` (`integer`): Interval between repeats (milliseconds).
+
+**Return**:
+
+- `ok` (`true?`): `true` when the repeat settings are updated successfully.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+
+local delay, period, err = dev:get_repeat()
+assert(delay, err)
+print(delay, period)
+
+assert(dev:set_repeat(300, 40))
+print(dev:get_repeat())
+```
+
+
+
+### `ungrab()`
+
+Release exclusive control of the input device.
+
+**Return**:
+
+- `ok` (`true?`): `true` when the grab is released successfully.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local dev = assert(Device("/dev/input/eventX"))
+assert(dev:grap())
+assert(dev:ungrab())
+```
diff --git a/docs/devices.md b/docs/devices.md
new file mode 100644
index 0000000..e664244
--- /dev/null
+++ b/docs/devices.md
@@ -0,0 +1,127 @@
+---
+description: "Input device discovery helpers."
+---
+
+# `devices`
+
+Input device discovery helpers.
+
+```lua
+local devices = assert(evdev.devices.list_devices())
+print(#devices)
+```
+
+## Functions
+
+| Function | Description |
+| -------------------------------------- | --------------------------------------------------------------------------- |
+| [`device_info(path)`](#fn-device-info) | Read metadata for one input device by path. |
+| [`find(query)`](#fn-find) | Return the first discovered input device matching a path or a device name. |
+| [`find_all(query)`](#fn-find-all) | Return all discovered input devices matching a path, alias, or device name. |
+| [`list_devices()`](#fn-list-devices) | List evdev input devices under `/dev/input`. |
+
+
+
+### `device_info(path)`
+
+Read metadata for one input device by path.
+
+**Parameters**:
+
+- `path` (`evdev.path`)
+
+**Return**:
+
+- `info` (`evdev.deviceInfo?`)
+- `err` (`string?`)
+
+**Example**:
+
+```lua
+local dev = assert(evdev.devices.device_info("/dev/input/event3"))
+print(dev.name)
+```
+
+
+
+### `find(query)`
+
+Return the first discovered input device matching a path or a device name.
+
+**Parameters**:
+
+- `query` (`string`): Exact device path, by-id path, by-path path, or device
+ name.
+
+**Return**:
+
+- `dev` (`evdev.deviceInfo?`)
+- `err` (`string?`)
+
+**Example**:
+
+```lua
+local find = evdev.devices.find
+
+local by_event_path = find("/dev/input/event3")
+local by_path_alias = find("/dev/input/by-path/platform-i8042-serio-0-event-kbd")
+local by_id_alias = find("/dev/input/by-id/usb-Example-event-kbd")
+local by_name = find("AT Translated Set 2 keyboard")
+
+print(by_event_path and by_event_path.name)
+print(by_path_alias and by_path_alias.path)
+print(by_id_alias and by_id_alias.path)
+print(by_name and by_name.path)
+```
+
+
+
+### `find_all(query)`
+
+Return all discovered input devices matching a path, alias, or device name.
+
+**Parameters**:
+
+- `query` (`string`): Exact device path, by-id path, by-path path, or device
+ name.
+
+**Return**:
+
+- `devs` (`evdev.deviceInfo[]?`)
+- `err` (`string?`)
+
+**Example**:
+
+```lua
+local find_all = evdev.devices.find_all
+
+local by_event_path = assert(find_all("/dev/input/event3"))
+local by_path_alias = assert(find_all("/dev/input/by-path/platform-i8042-serio-0-event-kbd"))
+local by_id_alias = assert(find_all("/dev/input/by-id/usb-Example-event-kbd"))
+local by_name = assert(find_all("AT Translated Set 2 keyboard"))
+
+print(#by_event_path)
+print(#by_path_alias)
+print(#by_id_alias)
+print(#by_name)
+```
+
+
+
+### `list_devices()`
+
+List evdev input devices under `/dev/input`.
+
+**Return**:
+
+- `devs` (`evdev.deviceInfo[]?`)
+- `err` (`string?`)
+
+**Example**:
+
+```lua
+local devs = assert(evdev.devices.list_devices()
+for _, dev in ipairs(devs) do
+ print(dev.path, dev.name)
+end
+```
diff --git a/docs/ecodes.md b/docs/ecodes.md
new file mode 100644
index 0000000..0c9291e
--- /dev/null
+++ b/docs/ecodes.md
@@ -0,0 +1,4759 @@
+# `ecodes`
+
+## Fields
+
+| Field | Description |
+| --------------------------------------------------------------- | ----------- |
+| [`BTN_0`](#btn-0) | `256` |
+| [`BTN_1`](#btn-1) | `257` |
+| [`BTN_2`](#btn-2) | `258` |
+| [`BTN_3`](#btn-3) | `259` |
+| [`BTN_4`](#btn-4) | `260` |
+| [`BTN_5`](#btn-5) | `261` |
+| [`BTN_6`](#btn-6) | `262` |
+| [`BTN_7`](#btn-7) | `263` |
+| [`BTN_8`](#btn-8) | `264` |
+| [`BTN_9`](#btn-9) | `265` |
+| [`BTN_A`](#btn-a) | `304` |
+| [`BTN_B`](#btn-b) | `305` |
+| [`BTN_BACK`](#btn-back) | `278` |
+| [`BTN_BASE`](#btn-base) | `294` |
+| [`BTN_BASE2`](#btn-base2) | `295` |
+| [`BTN_BASE3`](#btn-base3) | `296` |
+| [`BTN_BASE4`](#btn-base4) | `297` |
+| [`BTN_BASE5`](#btn-base5) | `298` |
+| [`BTN_BASE6`](#btn-base6) | `299` |
+| [`BTN_C`](#btn-c) | `306` |
+| [`BTN_DEAD`](#btn-dead) | `303` |
+| [`BTN_DIGI`](#btn-digi) | `320` |
+| [`BTN_DPAD_DOWN`](#btn-dpad-down) | `545` |
+| [`BTN_DPAD_LEFT`](#btn-dpad-left) | `546` |
+| [`BTN_DPAD_RIGHT`](#btn-dpad-right) | `547` |
+| [`BTN_DPAD_UP`](#btn-dpad-up) | `544` |
+| [`BTN_EAST`](#btn-east) | `305` |
+| [`BTN_EXTRA`](#btn-extra) | `276` |
+| [`BTN_FORWARD`](#btn-forward) | `277` |
+| [`BTN_GAMEPAD`](#btn-gamepad) | `304` |
+| [`BTN_GEAR_DOWN`](#btn-gear-down) | `336` |
+| [`BTN_GEAR_UP`](#btn-gear-up) | `337` |
+| [`BTN_GRIPL`](#btn-gripl) | `548` |
+| [`BTN_GRIPL2`](#btn-gripl2) | `550` |
+| [`BTN_GRIPR`](#btn-gripr) | `549` |
+| [`BTN_GRIPR2`](#btn-gripr2) | `551` |
+| [`BTN_JOYSTICK`](#btn-joystick) | `288` |
+| [`BTN_LEFT`](#btn-left) | `272` |
+| [`BTN_MIDDLE`](#btn-middle) | `274` |
+| [`BTN_MISC`](#btn-misc) | `256` |
+| [`BTN_MODE`](#btn-mode) | `316` |
+| [`BTN_MOUSE`](#btn-mouse) | `272` |
+| [`BTN_NORTH`](#btn-north) | `307` |
+| [`BTN_PINKIE`](#btn-pinkie) | `293` |
+| [`BTN_RIGHT`](#btn-right) | `273` |
+| [`BTN_SELECT`](#btn-select) | `314` |
+| [`BTN_SIDE`](#btn-side) | `275` |
+| [`BTN_SOUTH`](#btn-south) | `304` |
+| [`BTN_START`](#btn-start) | `315` |
+| [`BTN_STYLUS`](#btn-stylus) | `331` |
+| [`BTN_STYLUS2`](#btn-stylus2) | `332` |
+| [`BTN_STYLUS3`](#btn-stylus3) | `329` |
+| [`BTN_TASK`](#btn-task) | `279` |
+| [`BTN_THUMB`](#btn-thumb) | `289` |
+| [`BTN_THUMB2`](#btn-thumb2) | `290` |
+| [`BTN_THUMBL`](#btn-thumbl) | `317` |
+| [`BTN_THUMBR`](#btn-thumbr) | `318` |
+| [`BTN_TL`](#btn-tl) | `310` |
+| [`BTN_TL2`](#btn-tl2) | `312` |
+| [`BTN_TOOL_AIRBRUSH`](#btn-tool-airbrush) | `324` |
+| [`BTN_TOOL_BRUSH`](#btn-tool-brush) | `322` |
+| [`BTN_TOOL_DOUBLETAP`](#btn-tool-doubletap) | `333` |
+| [`BTN_TOOL_FINGER`](#btn-tool-finger) | `325` |
+| [`BTN_TOOL_LENS`](#btn-tool-lens) | `327` |
+| [`BTN_TOOL_MOUSE`](#btn-tool-mouse) | `326` |
+| [`BTN_TOOL_PEN`](#btn-tool-pen) | `320` |
+| [`BTN_TOOL_PENCIL`](#btn-tool-pencil) | `323` |
+| [`BTN_TOOL_QUADTAP`](#btn-tool-quadtap) | `335` |
+| [`BTN_TOOL_QUINTTAP`](#btn-tool-quinttap) | `328` |
+| [`BTN_TOOL_RUBBER`](#btn-tool-rubber) | `321` |
+| [`BTN_TOOL_TRIPLETAP`](#btn-tool-tripletap) | `334` |
+| [`BTN_TOP`](#btn-top) | `291` |
+| [`BTN_TOP2`](#btn-top2) | `292` |
+| [`BTN_TOUCH`](#btn-touch) | `330` |
+| [`BTN_TR`](#btn-tr) | `311` |
+| [`BTN_TR2`](#btn-tr2) | `313` |
+| [`BTN_TRIGGER`](#btn-trigger) | `288` |
+| [`BTN_TRIGGER_HAPPY`](#btn-trigger-happy) | `704` |
+| [`BTN_TRIGGER_HAPPY1`](#btn-trigger-happy1) | `704` |
+| [`BTN_TRIGGER_HAPPY10`](#btn-trigger-happy10) | `713` |
+| [`BTN_TRIGGER_HAPPY11`](#btn-trigger-happy11) | `714` |
+| [`BTN_TRIGGER_HAPPY12`](#btn-trigger-happy12) | `715` |
+| [`BTN_TRIGGER_HAPPY13`](#btn-trigger-happy13) | `716` |
+| [`BTN_TRIGGER_HAPPY14`](#btn-trigger-happy14) | `717` |
+| [`BTN_TRIGGER_HAPPY15`](#btn-trigger-happy15) | `718` |
+| [`BTN_TRIGGER_HAPPY16`](#btn-trigger-happy16) | `719` |
+| [`BTN_TRIGGER_HAPPY17`](#btn-trigger-happy17) | `720` |
+| [`BTN_TRIGGER_HAPPY18`](#btn-trigger-happy18) | `721` |
+| [`BTN_TRIGGER_HAPPY19`](#btn-trigger-happy19) | `722` |
+| [`BTN_TRIGGER_HAPPY2`](#btn-trigger-happy2) | `705` |
+| [`BTN_TRIGGER_HAPPY20`](#btn-trigger-happy20) | `723` |
+| [`BTN_TRIGGER_HAPPY21`](#btn-trigger-happy21) | `724` |
+| [`BTN_TRIGGER_HAPPY22`](#btn-trigger-happy22) | `725` |
+| [`BTN_TRIGGER_HAPPY23`](#btn-trigger-happy23) | `726` |
+| [`BTN_TRIGGER_HAPPY24`](#btn-trigger-happy24) | `727` |
+| [`BTN_TRIGGER_HAPPY25`](#btn-trigger-happy25) | `728` |
+| [`BTN_TRIGGER_HAPPY26`](#btn-trigger-happy26) | `729` |
+| [`BTN_TRIGGER_HAPPY27`](#btn-trigger-happy27) | `730` |
+| [`BTN_TRIGGER_HAPPY28`](#btn-trigger-happy28) | `731` |
+| [`BTN_TRIGGER_HAPPY29`](#btn-trigger-happy29) | `732` |
+| [`BTN_TRIGGER_HAPPY3`](#btn-trigger-happy3) | `706` |
+| [`BTN_TRIGGER_HAPPY30`](#btn-trigger-happy30) | `733` |
+| [`BTN_TRIGGER_HAPPY31`](#btn-trigger-happy31) | `734` |
+| [`BTN_TRIGGER_HAPPY32`](#btn-trigger-happy32) | `735` |
+| [`BTN_TRIGGER_HAPPY33`](#btn-trigger-happy33) | `736` |
+| [`BTN_TRIGGER_HAPPY34`](#btn-trigger-happy34) | `737` |
+| [`BTN_TRIGGER_HAPPY35`](#btn-trigger-happy35) | `738` |
+| [`BTN_TRIGGER_HAPPY36`](#btn-trigger-happy36) | `739` |
+| [`BTN_TRIGGER_HAPPY37`](#btn-trigger-happy37) | `740` |
+| [`BTN_TRIGGER_HAPPY38`](#btn-trigger-happy38) | `741` |
+| [`BTN_TRIGGER_HAPPY39`](#btn-trigger-happy39) | `742` |
+| [`BTN_TRIGGER_HAPPY4`](#btn-trigger-happy4) | `707` |
+| [`BTN_TRIGGER_HAPPY40`](#btn-trigger-happy40) | `743` |
+| [`BTN_TRIGGER_HAPPY5`](#btn-trigger-happy5) | `708` |
+| [`BTN_TRIGGER_HAPPY6`](#btn-trigger-happy6) | `709` |
+| [`BTN_TRIGGER_HAPPY7`](#btn-trigger-happy7) | `710` |
+| [`BTN_TRIGGER_HAPPY8`](#btn-trigger-happy8) | `711` |
+| [`BTN_TRIGGER_HAPPY9`](#btn-trigger-happy9) | `712` |
+| [`BTN_WEST`](#btn-west) | `308` |
+| [`BTN_WHEEL`](#btn-wheel) | `336` |
+| [`BTN_X`](#btn-x) | `307` |
+| [`BTN_Y`](#btn-y) | `308` |
+| [`BTN_Z`](#btn-z) | `309` |
+| [`EV_ABS`](#ev-abs) | `3` |
+| [`EV_CNT`](#ev-cnt) | `32` |
+| [`EV_FF`](#ev-ff) | `21` |
+| [`EV_FF_STATUS`](#ev-ff-status) | `23` |
+| [`EV_KEY`](#ev-key) | `1` |
+| [`EV_LED`](#ev-led) | `17` |
+| [`EV_MAX`](#ev-max) | `31` |
+| [`EV_MSC`](#ev-msc) | `4` |
+| [`EV_PWR`](#ev-pwr) | `22` |
+| [`EV_REL`](#ev-rel) | `2` |
+| [`EV_REP`](#ev-rep) | `20` |
+| [`EV_SND`](#ev-snd) | `18` |
+| [`EV_SW`](#ev-sw) | `5` |
+| [`EV_SYN`](#ev-syn) | `0` |
+| [`KEY_0`](#key-0) | `11` |
+| [`KEY_1`](#key-1) | `2` |
+| [`KEY_102ND`](#key-102nd) | `86` |
+| [`KEY_10CHANNELSDOWN`](#key-10channelsdown) | `441` |
+| [`KEY_10CHANNELSUP`](#key-10channelsup) | `440` |
+| [`KEY_2`](#key-2) | `3` |
+| [`KEY_3`](#key-3) | `4` |
+| [`KEY_3D_MODE`](#key-3d-mode) | `623` |
+| [`KEY_4`](#key-4) | `5` |
+| [`KEY_5`](#key-5) | `6` |
+| [`KEY_6`](#key-6) | `7` |
+| [`KEY_7`](#key-7) | `8` |
+| [`KEY_8`](#key-8) | `9` |
+| [`KEY_9`](#key-9) | `10` |
+| [`KEY_A`](#key-a) | `30` |
+| [`KEY_AB`](#key-ab) | `406` |
+| [`KEY_ACCESSIBILITY`](#key-accessibility) | `590` |
+| [`KEY_ADDRESSBOOK`](#key-addressbook) | `429` |
+| [`KEY_AGAIN`](#key-again) | `129` |
+| [`KEY_ALL_APPLICATIONS`](#key-all-applications) | `204` |
+| [`KEY_ALS_TOGGLE`](#key-als-toggle) | `560` |
+| [`KEY_ALTERASE`](#key-alterase) | `222` |
+| [`KEY_ANGLE`](#key-angle) | `371` |
+| [`KEY_APOSTROPHE`](#key-apostrophe) | `40` |
+| [`KEY_APPSELECT`](#key-appselect) | `580` |
+| [`KEY_ARCHIVE`](#key-archive) | `361` |
+| [`KEY_ASPECT_RATIO`](#key-aspect-ratio) | `375` |
+| [`KEY_ASSISTANT`](#key-assistant) | `583` |
+| [`KEY_ATTENDANT_OFF`](#key-attendant-off) | `540` |
+| [`KEY_ATTENDANT_ON`](#key-attendant-on) | `539` |
+| [`KEY_ATTENDANT_TOGGLE`](#key-attendant-toggle) | `541` |
+| [`KEY_AUDIO`](#key-audio) | `392` |
+| [`KEY_AUDIO_DESC`](#key-audio-desc) | `622` |
+| [`KEY_AUTOPILOT_ENGAGE_TOGGLE`](#key-autopilot-engage-toggle) | `637` |
+| [`KEY_AUX`](#key-aux) | `390` |
+| [`KEY_B`](#key-b) | `48` |
+| [`KEY_BACK`](#key-back) | `158` |
+| [`KEY_BACKSLASH`](#key-backslash) | `43` |
+| [`KEY_BACKSPACE`](#key-backspace) | `14` |
+| [`KEY_BASSBOOST`](#key-bassboost) | `209` |
+| [`KEY_BATTERY`](#key-battery) | `236` |
+| [`KEY_BLUE`](#key-blue) | `401` |
+| [`KEY_BLUETOOTH`](#key-bluetooth) | `237` |
+| [`KEY_BOOKMARKS`](#key-bookmarks) | `156` |
+| [`KEY_BREAK`](#key-break) | `411` |
+| [`KEY_BRIGHTNESSDOWN`](#key-brightnessdown) | `224` |
+| [`KEY_BRIGHTNESSUP`](#key-brightnessup) | `225` |
+| [`KEY_BRIGHTNESS_CYCLE`](#key-brightness-cycle) | `243` |
+| [`KEY_BRIGHTNESS_MAX`](#key-brightness-max) | `593` |
+| [`KEY_BRIGHTNESS_MENU`](#key-brightness-menu) | `649` |
+| [`KEY_BRIGHTNESS_MIN`](#key-brightness-min) | `592` |
+| [`KEY_BRIGHTNESS_TOGGLE`](#key-brightness-toggle) | `431` |
+| [`KEY_BRL_DOT1`](#key-brl-dot1) | `497` |
+| [`KEY_BRL_DOT10`](#key-brl-dot10) | `506` |
+| [`KEY_BRL_DOT2`](#key-brl-dot2) | `498` |
+| [`KEY_BRL_DOT3`](#key-brl-dot3) | `499` |
+| [`KEY_BRL_DOT4`](#key-brl-dot4) | `500` |
+| [`KEY_BRL_DOT5`](#key-brl-dot5) | `501` |
+| [`KEY_BRL_DOT6`](#key-brl-dot6) | `502` |
+| [`KEY_BRL_DOT7`](#key-brl-dot7) | `503` |
+| [`KEY_BRL_DOT8`](#key-brl-dot8) | `504` |
+| [`KEY_BRL_DOT9`](#key-brl-dot9) | `505` |
+| [`KEY_BUTTONCONFIG`](#key-buttonconfig) | `576` |
+| [`KEY_C`](#key-c) | `46` |
+| [`KEY_CALC`](#key-calc) | `140` |
+| [`KEY_CALENDAR`](#key-calendar) | `397` |
+| [`KEY_CAMERA`](#key-camera) | `212` |
+| [`KEY_CAMERA_ACCESS_DISABLE`](#key-camera-access-disable) | `588` |
+| [`KEY_CAMERA_ACCESS_ENABLE`](#key-camera-access-enable) | `587` |
+| [`KEY_CAMERA_ACCESS_TOGGLE`](#key-camera-access-toggle) | `589` |
+| [`KEY_CAMERA_DOWN`](#key-camera-down) | `536` |
+| [`KEY_CAMERA_FOCUS`](#key-camera-focus) | `528` |
+| [`KEY_CAMERA_LEFT`](#key-camera-left) | `537` |
+| [`KEY_CAMERA_RIGHT`](#key-camera-right) | `538` |
+| [`KEY_CAMERA_UP`](#key-camera-up) | `535` |
+| [`KEY_CAMERA_ZOOMIN`](#key-camera-zoomin) | `533` |
+| [`KEY_CAMERA_ZOOMOUT`](#key-camera-zoomout) | `534` |
+| [`KEY_CANCEL`](#key-cancel) | `223` |
+| [`KEY_CAPSLOCK`](#key-capslock) | `58` |
+| [`KEY_CD`](#key-cd) | `383` |
+| [`KEY_CHANNEL`](#key-channel) | `363` |
+| [`KEY_CHANNELDOWN`](#key-channeldown) | `403` |
+| [`KEY_CHANNELUP`](#key-channelup) | `402` |
+| [`KEY_CHAT`](#key-chat) | `216` |
+| [`KEY_CLEAR`](#key-clear) | `355` |
+| [`KEY_CLEARVU_SONAR`](#key-clearvu-sonar) | `646` |
+| [`KEY_CLOSE`](#key-close) | `206` |
+| [`KEY_CLOSECD`](#key-closecd) | `160` |
+| [`KEY_CNT`](#key-cnt) | `768` |
+| [`KEY_COFFEE`](#key-coffee) | `152` |
+| [`KEY_COMMA`](#key-comma) | `51` |
+| [`KEY_COMPOSE`](#key-compose) | `127` |
+| [`KEY_COMPUTER`](#key-computer) | `157` |
+| [`KEY_CONFIG`](#key-config) | `171` |
+| [`KEY_CONNECT`](#key-connect) | `218` |
+| [`KEY_CONTEXT_MENU`](#key-context-menu) | `438` |
+| [`KEY_CONTROLPANEL`](#key-controlpanel) | `579` |
+| [`KEY_COPY`](#key-copy) | `133` |
+| [`KEY_CUT`](#key-cut) | `137` |
+| [`KEY_CYCLEWINDOWS`](#key-cyclewindows) | `154` |
+| [`KEY_D`](#key-d) | `32` |
+| [`KEY_DASHBOARD`](#key-dashboard) | `204` |
+| [`KEY_DATA`](#key-data) | `631` |
+| [`KEY_DATABASE`](#key-database) | `426` |
+| [`KEY_DELETE`](#key-delete) | `111` |
+| [`KEY_DELETEFILE`](#key-deletefile) | `146` |
+| [`KEY_DEL_EOL`](#key-del-eol) | `448` |
+| [`KEY_DEL_EOS`](#key-del-eos) | `449` |
+| [`KEY_DEL_LINE`](#key-del-line) | `451` |
+| [`KEY_DICTATE`](#key-dictate) | `586` |
+| [`KEY_DIGITS`](#key-digits) | `413` |
+| [`KEY_DIRECTION`](#key-direction) | `153` |
+| [`KEY_DIRECTORY`](#key-directory) | `394` |
+| [`KEY_DISPLAYTOGGLE`](#key-displaytoggle) | `431` |
+| [`KEY_DISPLAY_OFF`](#key-display-off) | `245` |
+| [`KEY_DOCUMENTS`](#key-documents) | `235` |
+| [`KEY_DOLLAR`](#key-dollar) | `434` |
+| [`KEY_DOT`](#key-dot) | `52` |
+| [`KEY_DOWN`](#key-down) | `108` |
+| [`KEY_DO_NOT_DISTURB`](#key-do-not-disturb) | `591` |
+| [`KEY_DUAL_RANGE_RADAR`](#key-dual-range-radar) | `643` |
+| [`KEY_DVD`](#key-dvd) | `389` |
+| [`KEY_E`](#key-e) | `18` |
+| [`KEY_EDIT`](#key-edit) | `176` |
+| [`KEY_EDITOR`](#key-editor) | `422` |
+| [`KEY_EJECTCD`](#key-ejectcd) | `161` |
+| [`KEY_EJECTCLOSECD`](#key-ejectclosecd) | `162` |
+| [`KEY_EMAIL`](#key-email) | `215` |
+| [`KEY_EMOJI_PICKER`](#key-emoji-picker) | `585` |
+| [`KEY_END`](#key-end) | `107` |
+| [`KEY_ENTER`](#key-enter) | `28` |
+| [`KEY_EPG`](#key-epg) | `365` |
+| [`KEY_EPRIVACY_SCREEN_OFF`](#key-eprivacy-screen-off) | `595` |
+| [`KEY_EPRIVACY_SCREEN_ON`](#key-eprivacy-screen-on) | `594` |
+| [`KEY_EQUAL`](#key-equal) | `13` |
+| [`KEY_ESC`](#key-esc) | `1` |
+| [`KEY_EURO`](#key-euro) | `435` |
+| [`KEY_EXIT`](#key-exit) | `174` |
+| [`KEY_F`](#key-f) | `33` |
+| [`KEY_F1`](#key-f1) | `59` |
+| [`KEY_F10`](#key-f10) | `68` |
+| [`KEY_F11`](#key-f11) | `87` |
+| [`KEY_F12`](#key-f12) | `88` |
+| [`KEY_F13`](#key-f13) | `183` |
+| [`KEY_F14`](#key-f14) | `184` |
+| [`KEY_F15`](#key-f15) | `185` |
+| [`KEY_F16`](#key-f16) | `186` |
+| [`KEY_F17`](#key-f17) | `187` |
+| [`KEY_F18`](#key-f18) | `188` |
+| [`KEY_F19`](#key-f19) | `189` |
+| [`KEY_F2`](#key-f2) | `60` |
+| [`KEY_F20`](#key-f20) | `190` |
+| [`KEY_F21`](#key-f21) | `191` |
+| [`KEY_F22`](#key-f22) | `192` |
+| [`KEY_F23`](#key-f23) | `193` |
+| [`KEY_F24`](#key-f24) | `194` |
+| [`KEY_F3`](#key-f3) | `61` |
+| [`KEY_F4`](#key-f4) | `62` |
+| [`KEY_F5`](#key-f5) | `63` |
+| [`KEY_F6`](#key-f6) | `64` |
+| [`KEY_F7`](#key-f7) | `65` |
+| [`KEY_F8`](#key-f8) | `66` |
+| [`KEY_F9`](#key-f9) | `67` |
+| [`KEY_FASTFORWARD`](#key-fastforward) | `208` |
+| [`KEY_FASTREVERSE`](#key-fastreverse) | `629` |
+| [`KEY_FAVORITES`](#key-favorites) | `364` |
+| [`KEY_FILE`](#key-file) | `144` |
+| [`KEY_FINANCE`](#key-finance) | `219` |
+| [`KEY_FIND`](#key-find) | `136` |
+| [`KEY_FIRST`](#key-first) | `404` |
+| [`KEY_FISHING_CHART`](#key-fishing-chart) | `641` |
+| [`KEY_FN`](#key-fn) | `464` |
+| [`KEY_FN_1`](#key-fn-1) | `478` |
+| [`KEY_FN_2`](#key-fn-2) | `479` |
+| [`KEY_FN_B`](#key-fn-b) | `484` |
+| [`KEY_FN_D`](#key-fn-d) | `480` |
+| [`KEY_FN_E`](#key-fn-e) | `481` |
+| [`KEY_FN_ESC`](#key-fn-esc) | `465` |
+| [`KEY_FN_F`](#key-fn-f) | `482` |
+| [`KEY_FN_F1`](#key-fn-f1) | `466` |
+| [`KEY_FN_F10`](#key-fn-f10) | `475` |
+| [`KEY_FN_F11`](#key-fn-f11) | `476` |
+| [`KEY_FN_F12`](#key-fn-f12) | `477` |
+| [`KEY_FN_F2`](#key-fn-f2) | `467` |
+| [`KEY_FN_F3`](#key-fn-f3) | `468` |
+| [`KEY_FN_F4`](#key-fn-f4) | `469` |
+| [`KEY_FN_F5`](#key-fn-f5) | `470` |
+| [`KEY_FN_F6`](#key-fn-f6) | `471` |
+| [`KEY_FN_F7`](#key-fn-f7) | `472` |
+| [`KEY_FN_F8`](#key-fn-f8) | `473` |
+| [`KEY_FN_F9`](#key-fn-f9) | `474` |
+| [`KEY_FN_RIGHT_SHIFT`](#key-fn-right-shift) | `485` |
+| [`KEY_FN_S`](#key-fn-s) | `483` |
+| [`KEY_FORWARD`](#key-forward) | `159` |
+| [`KEY_FORWARDMAIL`](#key-forwardmail) | `233` |
+| [`KEY_FRAMEBACK`](#key-frameback) | `436` |
+| [`KEY_FRAMEFORWARD`](#key-frameforward) | `437` |
+| [`KEY_FRONT`](#key-front) | `132` |
+| [`KEY_FULL_SCREEN`](#key-full-screen) | `372` |
+| [`KEY_G`](#key-g) | `34` |
+| [`KEY_GAMES`](#key-games) | `417` |
+| [`KEY_GOTO`](#key-goto) | `354` |
+| [`KEY_GRAPHICSEDITOR`](#key-graphicseditor) | `424` |
+| [`KEY_GRAVE`](#key-grave) | `41` |
+| [`KEY_GREEN`](#key-green) | `399` |
+| [`KEY_H`](#key-h) | `35` |
+| [`KEY_HANGEUL`](#key-hangeul) | `122` |
+| [`KEY_HANGUEL`](#key-hanguel) | `122` |
+| [`KEY_HANGUP_PHONE`](#key-hangup-phone) | `446` |
+| [`KEY_HANJA`](#key-hanja) | `123` |
+| [`KEY_HELP`](#key-help) | `138` |
+| [`KEY_HENKAN`](#key-henkan) | `92` |
+| [`KEY_HIRAGANA`](#key-hiragana) | `91` |
+| [`KEY_HOME`](#key-home) | `102` |
+| [`KEY_HOMEPAGE`](#key-homepage) | `172` |
+| [`KEY_HP`](#key-hp) | `211` |
+| [`KEY_I`](#key-i) | `23` |
+| [`KEY_IMAGES`](#key-images) | `442` |
+| [`KEY_INFO`](#key-info) | `358` |
+| [`KEY_INSERT`](#key-insert) | `110` |
+| [`KEY_INS_LINE`](#key-ins-line) | `450` |
+| [`KEY_ISO`](#key-iso) | `170` |
+| [`KEY_J`](#key-j) | `36` |
+| [`KEY_JOURNAL`](#key-journal) | `578` |
+| [`KEY_K`](#key-k) | `37` |
+| [`KEY_KATAKANA`](#key-katakana) | `90` |
+| [`KEY_KATAKANAHIRAGANA`](#key-katakanahiragana) | `93` |
+| [`KEY_KBDILLUMDOWN`](#key-kbdillumdown) | `229` |
+| [`KEY_KBDILLUMTOGGLE`](#key-kbdillumtoggle) | `228` |
+| [`KEY_KBDILLUMUP`](#key-kbdillumup) | `230` |
+| [`KEY_KBDINPUTASSIST_ACCEPT`](#key-kbdinputassist-accept) | `612` |
+| [`KEY_KBDINPUTASSIST_CANCEL`](#key-kbdinputassist-cancel) | `613` |
+| [`KEY_KBDINPUTASSIST_NEXT`](#key-kbdinputassist-next) | `609` |
+| [`KEY_KBDINPUTASSIST_NEXTGROUP`](#key-kbdinputassist-nextgroup) | `611` |
+| [`KEY_KBDINPUTASSIST_PREV`](#key-kbdinputassist-prev) | `608` |
+| [`KEY_KBDINPUTASSIST_PREVGROUP`](#key-kbdinputassist-prevgroup) | `610` |
+| [`KEY_KBD_LAYOUT_NEXT`](#key-kbd-layout-next) | `584` |
+| [`KEY_KBD_LCD_MENU1`](#key-kbd-lcd-menu1) | `696` |
+| [`KEY_KBD_LCD_MENU2`](#key-kbd-lcd-menu2) | `697` |
+| [`KEY_KBD_LCD_MENU3`](#key-kbd-lcd-menu3) | `698` |
+| [`KEY_KBD_LCD_MENU4`](#key-kbd-lcd-menu4) | `699` |
+| [`KEY_KBD_LCD_MENU5`](#key-kbd-lcd-menu5) | `700` |
+| [`KEY_KEYBOARD`](#key-keyboard) | `374` |
+| [`KEY_KP0`](#key-kp0) | `82` |
+| [`KEY_KP1`](#key-kp1) | `79` |
+| [`KEY_KP2`](#key-kp2) | `80` |
+| [`KEY_KP3`](#key-kp3) | `81` |
+| [`KEY_KP4`](#key-kp4) | `75` |
+| [`KEY_KP5`](#key-kp5) | `76` |
+| [`KEY_KP6`](#key-kp6) | `77` |
+| [`KEY_KP7`](#key-kp7) | `71` |
+| [`KEY_KP8`](#key-kp8) | `72` |
+| [`KEY_KP9`](#key-kp9) | `73` |
+| [`KEY_KPASTERISK`](#key-kpasterisk) | `55` |
+| [`KEY_KPCOMMA`](#key-kpcomma) | `121` |
+| [`KEY_KPDOT`](#key-kpdot) | `83` |
+| [`KEY_KPENTER`](#key-kpenter) | `96` |
+| [`KEY_KPEQUAL`](#key-kpequal) | `117` |
+| [`KEY_KPJPCOMMA`](#key-kpjpcomma) | `95` |
+| [`KEY_KPLEFTPAREN`](#key-kpleftparen) | `179` |
+| [`KEY_KPMINUS`](#key-kpminus) | `74` |
+| [`KEY_KPPLUS`](#key-kpplus) | `78` |
+| [`KEY_KPPLUSMINUS`](#key-kpplusminus) | `118` |
+| [`KEY_KPRIGHTPAREN`](#key-kprightparen) | `180` |
+| [`KEY_KPSLASH`](#key-kpslash) | `98` |
+| [`KEY_L`](#key-l) | `38` |
+| [`KEY_LANGUAGE`](#key-language) | `368` |
+| [`KEY_LAST`](#key-last) | `405` |
+| [`KEY_LEFT`](#key-left) | `105` |
+| [`KEY_LEFTALT`](#key-leftalt) | `56` |
+| [`KEY_LEFTBRACE`](#key-leftbrace) | `26` |
+| [`KEY_LEFTCTRL`](#key-leftctrl) | `29` |
+| [`KEY_LEFTMETA`](#key-leftmeta) | `125` |
+| [`KEY_LEFTSHIFT`](#key-leftshift) | `42` |
+| [`KEY_LEFT_DOWN`](#key-left-down) | `617` |
+| [`KEY_LEFT_UP`](#key-left-up) | `616` |
+| [`KEY_LIGHTS_TOGGLE`](#key-lights-toggle) | `542` |
+| [`KEY_LINEFEED`](#key-linefeed) | `101` |
+| [`KEY_LINK_PHONE`](#key-link-phone) | `447` |
+| [`KEY_LIST`](#key-list) | `395` |
+| [`KEY_LOGOFF`](#key-logoff) | `433` |
+| [`KEY_M`](#key-m) | `50` |
+| [`KEY_MACRO`](#key-macro) | `112` |
+| [`KEY_MACRO1`](#key-macro1) | `656` |
+| [`KEY_MACRO10`](#key-macro10) | `665` |
+| [`KEY_MACRO11`](#key-macro11) | `666` |
+| [`KEY_MACRO12`](#key-macro12) | `667` |
+| [`KEY_MACRO13`](#key-macro13) | `668` |
+| [`KEY_MACRO14`](#key-macro14) | `669` |
+| [`KEY_MACRO15`](#key-macro15) | `670` |
+| [`KEY_MACRO16`](#key-macro16) | `671` |
+| [`KEY_MACRO17`](#key-macro17) | `672` |
+| [`KEY_MACRO18`](#key-macro18) | `673` |
+| [`KEY_MACRO19`](#key-macro19) | `674` |
+| [`KEY_MACRO2`](#key-macro2) | `657` |
+| [`KEY_MACRO20`](#key-macro20) | `675` |
+| [`KEY_MACRO21`](#key-macro21) | `676` |
+| [`KEY_MACRO22`](#key-macro22) | `677` |
+| [`KEY_MACRO23`](#key-macro23) | `678` |
+| [`KEY_MACRO24`](#key-macro24) | `679` |
+| [`KEY_MACRO25`](#key-macro25) | `680` |
+| [`KEY_MACRO26`](#key-macro26) | `681` |
+| [`KEY_MACRO27`](#key-macro27) | `682` |
+| [`KEY_MACRO28`](#key-macro28) | `683` |
+| [`KEY_MACRO29`](#key-macro29) | `684` |
+| [`KEY_MACRO3`](#key-macro3) | `658` |
+| [`KEY_MACRO30`](#key-macro30) | `685` |
+| [`KEY_MACRO4`](#key-macro4) | `659` |
+| [`KEY_MACRO5`](#key-macro5) | `660` |
+| [`KEY_MACRO6`](#key-macro6) | `661` |
+| [`KEY_MACRO7`](#key-macro7) | `662` |
+| [`KEY_MACRO8`](#key-macro8) | `663` |
+| [`KEY_MACRO9`](#key-macro9) | `664` |
+| [`KEY_MACRO_PRESET1`](#key-macro-preset1) | `691` |
+| [`KEY_MACRO_PRESET2`](#key-macro-preset2) | `692` |
+| [`KEY_MACRO_PRESET3`](#key-macro-preset3) | `693` |
+| [`KEY_MACRO_PRESET_CYCLE`](#key-macro-preset-cycle) | `690` |
+| [`KEY_MACRO_RECORD_START`](#key-macro-record-start) | `688` |
+| [`KEY_MACRO_RECORD_STOP`](#key-macro-record-stop) | `689` |
+| [`KEY_MAIL`](#key-mail) | `155` |
+| [`KEY_MARK_WAYPOINT`](#key-mark-waypoint) | `638` |
+| [`KEY_MAX`](#key-max) | `767` |
+| [`KEY_MEDIA`](#key-media) | `226` |
+| [`KEY_MEDIA_REPEAT`](#key-media-repeat) | `439` |
+| [`KEY_MEDIA_TOP_MENU`](#key-media-top-menu) | `619` |
+| [`KEY_MEMO`](#key-memo) | `396` |
+| [`KEY_MENU`](#key-menu) | `139` |
+| [`KEY_MESSENGER`](#key-messenger) | `430` |
+| [`KEY_MHP`](#key-mhp) | `367` |
+| [`KEY_MICMUTE`](#key-micmute) | `248` |
+| [`KEY_MINUS`](#key-minus) | `12` |
+| [`KEY_MIN_INTERESTING`](#key-min-interesting) | `113` |
+| [`KEY_MODE`](#key-mode) | `373` |
+| [`KEY_MOVE`](#key-move) | `175` |
+| [`KEY_MP3`](#key-mp3) | `391` |
+| [`KEY_MSDOS`](#key-msdos) | `151` |
+| [`KEY_MUHENKAN`](#key-muhenkan) | `94` |
+| [`KEY_MUTE`](#key-mute) | `113` |
+| [`KEY_N`](#key-n) | `49` |
+| [`KEY_NAV_CHART`](#key-nav-chart) | `640` |
+| [`KEY_NAV_INFO`](#key-nav-info) | `648` |
+| [`KEY_NEW`](#key-new) | `181` |
+| [`KEY_NEWS`](#key-news) | `427` |
+| [`KEY_NEXT`](#key-next) | `407` |
+| [`KEY_NEXTSONG`](#key-nextsong) | `163` |
+| [`KEY_NEXT_ELEMENT`](#key-next-element) | `635` |
+| [`KEY_NEXT_FAVORITE`](#key-next-favorite) | `624` |
+| [`KEY_NOTIFICATION_CENTER`](#key-notification-center) | `444` |
+| [`KEY_NUMERIC_0`](#key-numeric-0) | `512` |
+| [`KEY_NUMERIC_1`](#key-numeric-1) | `513` |
+| [`KEY_NUMERIC_11`](#key-numeric-11) | `620` |
+| [`KEY_NUMERIC_12`](#key-numeric-12) | `621` |
+| [`KEY_NUMERIC_2`](#key-numeric-2) | `514` |
+| [`KEY_NUMERIC_3`](#key-numeric-3) | `515` |
+| [`KEY_NUMERIC_4`](#key-numeric-4) | `516` |
+| [`KEY_NUMERIC_5`](#key-numeric-5) | `517` |
+| [`KEY_NUMERIC_6`](#key-numeric-6) | `518` |
+| [`KEY_NUMERIC_7`](#key-numeric-7) | `519` |
+| [`KEY_NUMERIC_8`](#key-numeric-8) | `520` |
+| [`KEY_NUMERIC_9`](#key-numeric-9) | `521` |
+| [`KEY_NUMERIC_A`](#key-numeric-a) | `524` |
+| [`KEY_NUMERIC_B`](#key-numeric-b) | `525` |
+| [`KEY_NUMERIC_C`](#key-numeric-c) | `526` |
+| [`KEY_NUMERIC_D`](#key-numeric-d) | `527` |
+| [`KEY_NUMERIC_POUND`](#key-numeric-pound) | `523` |
+| [`KEY_NUMERIC_STAR`](#key-numeric-star) | `522` |
+| [`KEY_NUMLOCK`](#key-numlock) | `69` |
+| [`KEY_O`](#key-o) | `24` |
+| [`KEY_OK`](#key-ok) | `352` |
+| [`KEY_ONSCREEN_KEYBOARD`](#key-onscreen-keyboard) | `632` |
+| [`KEY_OPEN`](#key-open) | `134` |
+| [`KEY_OPTION`](#key-option) | `357` |
+| [`KEY_P`](#key-p) | `25` |
+| [`KEY_PAGEDOWN`](#key-pagedown) | `109` |
+| [`KEY_PAGEUP`](#key-pageup) | `104` |
+| [`KEY_PASTE`](#key-paste) | `135` |
+| [`KEY_PAUSE`](#key-pause) | `119` |
+| [`KEY_PAUSECD`](#key-pausecd) | `201` |
+| [`KEY_PAUSE_RECORD`](#key-pause-record) | `626` |
+| [`KEY_PC`](#key-pc) | `376` |
+| [`KEY_PERFORMANCE`](#key-performance) | `701` |
+| [`KEY_PHONE`](#key-phone) | `169` |
+| [`KEY_PICKUP_PHONE`](#key-pickup-phone) | `445` |
+| [`KEY_PLAY`](#key-play) | `207` |
+| [`KEY_PLAYCD`](#key-playcd) | `200` |
+| [`KEY_PLAYER`](#key-player) | `387` |
+| [`KEY_PLAYPAUSE`](#key-playpause) | `164` |
+| [`KEY_POWER`](#key-power) | `116` |
+| [`KEY_POWER2`](#key-power2) | `356` |
+| [`KEY_PRESENTATION`](#key-presentation) | `425` |
+| [`KEY_PREVIOUS`](#key-previous) | `412` |
+| [`KEY_PREVIOUSSONG`](#key-previoussong) | `165` |
+| [`KEY_PREVIOUS_ELEMENT`](#key-previous-element) | `636` |
+| [`KEY_PRINT`](#key-print) | `210` |
+| [`KEY_PRIVACY_SCREEN_TOGGLE`](#key-privacy-screen-toggle) | `633` |
+| [`KEY_PROG1`](#key-prog1) | `148` |
+| [`KEY_PROG2`](#key-prog2) | `149` |
+| [`KEY_PROG3`](#key-prog3) | `202` |
+| [`KEY_PROG4`](#key-prog4) | `203` |
+| [`KEY_PROGRAM`](#key-program) | `362` |
+| [`KEY_PROPS`](#key-props) | `130` |
+| [`KEY_PVR`](#key-pvr) | `366` |
+| [`KEY_Q`](#key-q) | `16` |
+| [`KEY_QUESTION`](#key-question) | `214` |
+| [`KEY_R`](#key-r) | `19` |
+| [`KEY_RADAR_OVERLAY`](#key-radar-overlay) | `644` |
+| [`KEY_RADIO`](#key-radio) | `385` |
+| [`KEY_RECORD`](#key-record) | `167` |
+| [`KEY_RED`](#key-red) | `398` |
+| [`KEY_REDO`](#key-redo) | `182` |
+| [`KEY_REFRESH`](#key-refresh) | `173` |
+| [`KEY_REFRESH_RATE_TOGGLE`](#key-refresh-rate-toggle) | `562` |
+| [`KEY_REPLY`](#key-reply) | `232` |
+| [`KEY_RESERVED`](#key-reserved) | `0` |
+| [`KEY_RESTART`](#key-restart) | `408` |
+| [`KEY_REWIND`](#key-rewind) | `168` |
+| [`KEY_RFKILL`](#key-rfkill) | `247` |
+| [`KEY_RIGHT`](#key-right) | `106` |
+| [`KEY_RIGHTALT`](#key-rightalt) | `100` |
+| [`KEY_RIGHTBRACE`](#key-rightbrace) | `27` |
+| [`KEY_RIGHTCTRL`](#key-rightctrl) | `97` |
+| [`KEY_RIGHTMETA`](#key-rightmeta) | `126` |
+| [`KEY_RIGHTSHIFT`](#key-rightshift) | `54` |
+| [`KEY_RIGHT_DOWN`](#key-right-down) | `615` |
+| [`KEY_RIGHT_UP`](#key-right-up) | `614` |
+| [`KEY_RO`](#key-ro) | `89` |
+| [`KEY_ROOT_MENU`](#key-root-menu) | `618` |
+| [`KEY_ROTATE_DISPLAY`](#key-rotate-display) | `153` |
+| [`KEY_ROTATE_LOCK_TOGGLE`](#key-rotate-lock-toggle) | `561` |
+| [`KEY_S`](#key-s) | `31` |
+| [`KEY_SAT`](#key-sat) | `381` |
+| [`KEY_SAT2`](#key-sat2) | `382` |
+| [`KEY_SAVE`](#key-save) | `234` |
+| [`KEY_SCALE`](#key-scale) | `120` |
+| [`KEY_SCREEN`](#key-screen) | `375` |
+| [`KEY_SCREENLOCK`](#key-screenlock) | `152` |
+| [`KEY_SCREENSAVER`](#key-screensaver) | `581` |
+| [`KEY_SCROLLDOWN`](#key-scrolldown) | `178` |
+| [`KEY_SCROLLLOCK`](#key-scrolllock) | `70` |
+| [`KEY_SCROLLUP`](#key-scrollup) | `177` |
+| [`KEY_SEARCH`](#key-search) | `217` |
+| [`KEY_SELECT`](#key-select) | `353` |
+| [`KEY_SELECTIVE_SCREENSHOT`](#key-selective-screenshot) | `634` |
+| [`KEY_SEMICOLON`](#key-semicolon) | `39` |
+| [`KEY_SEND`](#key-send) | `231` |
+| [`KEY_SENDFILE`](#key-sendfile) | `145` |
+| [`KEY_SETUP`](#key-setup) | `141` |
+| [`KEY_SHOP`](#key-shop) | `221` |
+| [`KEY_SHUFFLE`](#key-shuffle) | `410` |
+| [`KEY_SIDEVU_SONAR`](#key-sidevu-sonar) | `647` |
+| [`KEY_SINGLE_RANGE_RADAR`](#key-single-range-radar) | `642` |
+| [`KEY_SLASH`](#key-slash) | `53` |
+| [`KEY_SLEEP`](#key-sleep) | `142` |
+| [`KEY_SLOW`](#key-slow) | `409` |
+| [`KEY_SLOWREVERSE`](#key-slowreverse) | `630` |
+| [`KEY_SOS`](#key-sos) | `639` |
+| [`KEY_SOUND`](#key-sound) | `213` |
+| [`KEY_SPACE`](#key-space) | `57` |
+| [`KEY_SPELLCHECK`](#key-spellcheck) | `432` |
+| [`KEY_SPORT`](#key-sport) | `220` |
+| [`KEY_SPREADSHEET`](#key-spreadsheet) | `423` |
+| [`KEY_STOP`](#key-stop) | `128` |
+| [`KEY_STOPCD`](#key-stopcd) | `166` |
+| [`KEY_STOP_RECORD`](#key-stop-record) | `625` |
+| [`KEY_SUBTITLE`](#key-subtitle) | `370` |
+| [`KEY_SUSPEND`](#key-suspend) | `205` |
+| [`KEY_SYSRQ`](#key-sysrq) | `99` |
+| [`KEY_T`](#key-t) | `20` |
+| [`KEY_TAB`](#key-tab) | `15` |
+| [`KEY_TAPE`](#key-tape) | `384` |
+| [`KEY_TASKMANAGER`](#key-taskmanager) | `577` |
+| [`KEY_TEEN`](#key-teen) | `414` |
+| [`KEY_TEXT`](#key-text) | `388` |
+| [`KEY_TIME`](#key-time) | `359` |
+| [`KEY_TITLE`](#key-title) | `369` |
+| [`KEY_TOUCHPAD_OFF`](#key-touchpad-off) | `532` |
+| [`KEY_TOUCHPAD_ON`](#key-touchpad-on) | `531` |
+| [`KEY_TOUCHPAD_TOGGLE`](#key-touchpad-toggle) | `530` |
+| [`KEY_TRADITIONAL_SONAR`](#key-traditional-sonar) | `645` |
+| [`KEY_TUNER`](#key-tuner) | `386` |
+| [`KEY_TV`](#key-tv) | `377` |
+| [`KEY_TV2`](#key-tv2) | `378` |
+| [`KEY_TWEN`](#key-twen) | `415` |
+| [`KEY_U`](#key-u) | `22` |
+| [`KEY_UNDO`](#key-undo) | `131` |
+| [`KEY_UNKNOWN`](#key-unknown) | `240` |
+| [`KEY_UNMUTE`](#key-unmute) | `628` |
+| [`KEY_UP`](#key-up) | `103` |
+| [`KEY_UWB`](#key-uwb) | `239` |
+| [`KEY_V`](#key-v) | `47` |
+| [`KEY_VCR`](#key-vcr) | `379` |
+| [`KEY_VCR2`](#key-vcr2) | `380` |
+| [`KEY_VENDOR`](#key-vendor) | `360` |
+| [`KEY_VIDEO`](#key-video) | `393` |
+| [`KEY_VIDEOPHONE`](#key-videophone) | `416` |
+| [`KEY_VIDEO_NEXT`](#key-video-next) | `241` |
+| [`KEY_VIDEO_PREV`](#key-video-prev) | `242` |
+| [`KEY_VOD`](#key-vod) | `627` |
+| [`KEY_VOICECOMMAND`](#key-voicecommand) | `582` |
+| [`KEY_VOICEMAIL`](#key-voicemail) | `428` |
+| [`KEY_VOLUMEDOWN`](#key-volumedown) | `114` |
+| [`KEY_VOLUMEUP`](#key-volumeup) | `115` |
+| [`KEY_W`](#key-w) | `17` |
+| [`KEY_WAKEUP`](#key-wakeup) | `143` |
+| [`KEY_WIMAX`](#key-wimax) | `246` |
+| [`KEY_WLAN`](#key-wlan) | `238` |
+| [`KEY_WORDPROCESSOR`](#key-wordprocessor) | `421` |
+| [`KEY_WPS_BUTTON`](#key-wps-button) | `529` |
+| [`KEY_WWAN`](#key-wwan) | `246` |
+| [`KEY_WWW`](#key-www) | `150` |
+| [`KEY_X`](#key-x) | `45` |
+| [`KEY_XFER`](#key-xfer) | `147` |
+| [`KEY_Y`](#key-y) | `21` |
+| [`KEY_YELLOW`](#key-yellow) | `400` |
+| [`KEY_YEN`](#key-yen) | `124` |
+| [`KEY_Z`](#key-z) | `44` |
+| [`KEY_ZENKAKUHANKAKU`](#key-zenkakuhankaku) | `85` |
+| [`KEY_ZOOM`](#key-zoom) | `372` |
+| [`KEY_ZOOMIN`](#key-zoomin) | `418` |
+| [`KEY_ZOOMOUT`](#key-zoomout) | `419` |
+| [`KEY_ZOOMRESET`](#key-zoomreset) | `420` |
+| [`REL_CNT`](#rel-cnt) | `16` |
+| [`REL_DIAL`](#rel-dial) | `7` |
+| [`REL_HWHEEL`](#rel-hwheel) | `6` |
+| [`REL_HWHEEL_HI_RES`](#rel-hwheel-hi-res) | `12` |
+| [`REL_MAX`](#rel-max) | `15` |
+| [`REL_MISC`](#rel-misc) | `9` |
+| [`REL_RESERVED`](#rel-reserved) | `10` |
+| [`REL_RX`](#rel-rx) | `3` |
+| [`REL_RY`](#rel-ry) | `4` |
+| [`REL_RZ`](#rel-rz) | `5` |
+| [`REL_WHEEL`](#rel-wheel) | `8` |
+| [`REL_WHEEL_HI_RES`](#rel-wheel-hi-res) | `11` |
+| [`REL_X`](#rel-x) | `0` |
+| [`REL_Y`](#rel-y) | `1` |
+| [`REL_Z`](#rel-z) | `2` |
+| [`SYN_CNT`](#syn-cnt) | `16` |
+| [`SYN_CONFIG`](#syn-config) | `1` |
+| [`SYN_DROPPED`](#syn-dropped) | `3` |
+| [`SYN_MAX`](#syn-max) | `15` |
+| [`SYN_MT_REPORT`](#syn-mt-report) | `2` |
+| [`SYN_REPORT`](#syn-report) | `0` |
+
+
+
+### `BTN_0` (`number`)
+
+Value: `256`
+
+
+
+### `BTN_1` (`number`)
+
+Value: `257`
+
+
+
+### `BTN_2` (`number`)
+
+Value: `258`
+
+
+
+### `BTN_3` (`number`)
+
+Value: `259`
+
+
+
+### `BTN_4` (`number`)
+
+Value: `260`
+
+
+
+### `BTN_5` (`number`)
+
+Value: `261`
+
+
+
+### `BTN_6` (`number`)
+
+Value: `262`
+
+
+
+### `BTN_7` (`number`)
+
+Value: `263`
+
+
+
+### `BTN_8` (`number`)
+
+Value: `264`
+
+
+
+### `BTN_9` (`number`)
+
+Value: `265`
+
+
+
+### `BTN_A` (`number`)
+
+Value: `304`
+
+
+
+### `BTN_B` (`number`)
+
+Value: `305`
+
+
+
+### `BTN_BACK` (`number`)
+
+Value: `278`
+
+
+
+### `BTN_BASE` (`number`)
+
+Value: `294`
+
+
+
+### `BTN_BASE2` (`number`)
+
+Value: `295`
+
+
+
+### `BTN_BASE3` (`number`)
+
+Value: `296`
+
+
+
+### `BTN_BASE4` (`number`)
+
+Value: `297`
+
+
+
+### `BTN_BASE5` (`number`)
+
+Value: `298`
+
+
+
+### `BTN_BASE6` (`number`)
+
+Value: `299`
+
+
+
+### `BTN_C` (`number`)
+
+Value: `306`
+
+
+
+### `BTN_DEAD` (`number`)
+
+Value: `303`
+
+
+
+### `BTN_DIGI` (`number`)
+
+Value: `320`
+
+
+
+### `BTN_DPAD_DOWN` (`number`)
+
+Value: `545`
+
+
+
+### `BTN_DPAD_LEFT` (`number`)
+
+Value: `546`
+
+
+
+### `BTN_DPAD_RIGHT` (`number`)
+
+Value: `547`
+
+
+
+### `BTN_DPAD_UP` (`number`)
+
+Value: `544`
+
+
+
+### `BTN_EAST` (`number`)
+
+Value: `305`
+
+
+
+### `BTN_EXTRA` (`number`)
+
+Value: `276`
+
+
+
+### `BTN_FORWARD` (`number`)
+
+Value: `277`
+
+
+
+### `BTN_GAMEPAD` (`number`)
+
+Value: `304`
+
+
+
+### `BTN_GEAR_DOWN` (`number`)
+
+Value: `336`
+
+
+
+### `BTN_GEAR_UP` (`number`)
+
+Value: `337`
+
+
+
+### `BTN_GRIPL` (`number`)
+
+Value: `548`
+
+
+
+### `BTN_GRIPL2` (`number`)
+
+Value: `550`
+
+
+
+### `BTN_GRIPR` (`number`)
+
+Value: `549`
+
+
+
+### `BTN_GRIPR2` (`number`)
+
+Value: `551`
+
+
+
+### `BTN_JOYSTICK` (`number`)
+
+Value: `288`
+
+
+
+### `BTN_LEFT` (`number`)
+
+Value: `272`
+
+
+
+### `BTN_MIDDLE` (`number`)
+
+Value: `274`
+
+
+
+### `BTN_MISC` (`number`)
+
+Value: `256`
+
+
+
+### `BTN_MODE` (`number`)
+
+Value: `316`
+
+
+
+### `BTN_MOUSE` (`number`)
+
+Value: `272`
+
+
+
+### `BTN_NORTH` (`number`)
+
+Value: `307`
+
+
+
+### `BTN_PINKIE` (`number`)
+
+Value: `293`
+
+
+
+### `BTN_RIGHT` (`number`)
+
+Value: `273`
+
+
+
+### `BTN_SELECT` (`number`)
+
+Value: `314`
+
+
+
+### `BTN_SIDE` (`number`)
+
+Value: `275`
+
+
+
+### `BTN_SOUTH` (`number`)
+
+Value: `304`
+
+
+
+### `BTN_START` (`number`)
+
+Value: `315`
+
+
+
+### `BTN_STYLUS` (`number`)
+
+Value: `331`
+
+
+
+### `BTN_STYLUS2` (`number`)
+
+Value: `332`
+
+
+
+### `BTN_STYLUS3` (`number`)
+
+Value: `329`
+
+
+
+### `BTN_TASK` (`number`)
+
+Value: `279`
+
+
+
+### `BTN_THUMB` (`number`)
+
+Value: `289`
+
+
+
+### `BTN_THUMB2` (`number`)
+
+Value: `290`
+
+
+
+### `BTN_THUMBL` (`number`)
+
+Value: `317`
+
+
+
+### `BTN_THUMBR` (`number`)
+
+Value: `318`
+
+
+
+### `BTN_TL` (`number`)
+
+Value: `310`
+
+
+
+### `BTN_TL2` (`number`)
+
+Value: `312`
+
+
+
+### `BTN_TOOL_AIRBRUSH` (`number`)
+
+Value: `324`
+
+
+
+### `BTN_TOOL_BRUSH` (`number`)
+
+Value: `322`
+
+
+
+### `BTN_TOOL_DOUBLETAP` (`number`)
+
+Value: `333`
+
+
+
+### `BTN_TOOL_FINGER` (`number`)
+
+Value: `325`
+
+
+
+### `BTN_TOOL_LENS` (`number`)
+
+Value: `327`
+
+
+
+### `BTN_TOOL_MOUSE` (`number`)
+
+Value: `326`
+
+
+
+### `BTN_TOOL_PEN` (`number`)
+
+Value: `320`
+
+
+
+### `BTN_TOOL_PENCIL` (`number`)
+
+Value: `323`
+
+
+
+### `BTN_TOOL_QUADTAP` (`number`)
+
+Value: `335`
+
+
+
+### `BTN_TOOL_QUINTTAP` (`number`)
+
+Value: `328`
+
+
+
+### `BTN_TOOL_RUBBER` (`number`)
+
+Value: `321`
+
+
+
+### `BTN_TOOL_TRIPLETAP` (`number`)
+
+Value: `334`
+
+
+
+### `BTN_TOP` (`number`)
+
+Value: `291`
+
+
+
+### `BTN_TOP2` (`number`)
+
+Value: `292`
+
+
+
+### `BTN_TOUCH` (`number`)
+
+Value: `330`
+
+
+
+### `BTN_TR` (`number`)
+
+Value: `311`
+
+
+
+### `BTN_TR2` (`number`)
+
+Value: `313`
+
+
+
+### `BTN_TRIGGER` (`number`)
+
+Value: `288`
+
+
+
+### `BTN_TRIGGER_HAPPY` (`number`)
+
+Value: `704`
+
+
+
+### `BTN_TRIGGER_HAPPY1` (`number`)
+
+Value: `704`
+
+
+
+### `BTN_TRIGGER_HAPPY10` (`number`)
+
+Value: `713`
+
+
+
+### `BTN_TRIGGER_HAPPY11` (`number`)
+
+Value: `714`
+
+
+
+### `BTN_TRIGGER_HAPPY12` (`number`)
+
+Value: `715`
+
+
+
+### `BTN_TRIGGER_HAPPY13` (`number`)
+
+Value: `716`
+
+
+
+### `BTN_TRIGGER_HAPPY14` (`number`)
+
+Value: `717`
+
+
+
+### `BTN_TRIGGER_HAPPY15` (`number`)
+
+Value: `718`
+
+
+
+### `BTN_TRIGGER_HAPPY16` (`number`)
+
+Value: `719`
+
+
+
+### `BTN_TRIGGER_HAPPY17` (`number`)
+
+Value: `720`
+
+
+
+### `BTN_TRIGGER_HAPPY18` (`number`)
+
+Value: `721`
+
+
+
+### `BTN_TRIGGER_HAPPY19` (`number`)
+
+Value: `722`
+
+
+
+### `BTN_TRIGGER_HAPPY2` (`number`)
+
+Value: `705`
+
+
+
+### `BTN_TRIGGER_HAPPY20` (`number`)
+
+Value: `723`
+
+
+
+### `BTN_TRIGGER_HAPPY21` (`number`)
+
+Value: `724`
+
+
+
+### `BTN_TRIGGER_HAPPY22` (`number`)
+
+Value: `725`
+
+
+
+### `BTN_TRIGGER_HAPPY23` (`number`)
+
+Value: `726`
+
+
+
+### `BTN_TRIGGER_HAPPY24` (`number`)
+
+Value: `727`
+
+
+
+### `BTN_TRIGGER_HAPPY25` (`number`)
+
+Value: `728`
+
+
+
+### `BTN_TRIGGER_HAPPY26` (`number`)
+
+Value: `729`
+
+
+
+### `BTN_TRIGGER_HAPPY27` (`number`)
+
+Value: `730`
+
+
+
+### `BTN_TRIGGER_HAPPY28` (`number`)
+
+Value: `731`
+
+
+
+### `BTN_TRIGGER_HAPPY29` (`number`)
+
+Value: `732`
+
+
+
+### `BTN_TRIGGER_HAPPY3` (`number`)
+
+Value: `706`
+
+
+
+### `BTN_TRIGGER_HAPPY30` (`number`)
+
+Value: `733`
+
+
+
+### `BTN_TRIGGER_HAPPY31` (`number`)
+
+Value: `734`
+
+
+
+### `BTN_TRIGGER_HAPPY32` (`number`)
+
+Value: `735`
+
+
+
+### `BTN_TRIGGER_HAPPY33` (`number`)
+
+Value: `736`
+
+
+
+### `BTN_TRIGGER_HAPPY34` (`number`)
+
+Value: `737`
+
+
+
+### `BTN_TRIGGER_HAPPY35` (`number`)
+
+Value: `738`
+
+
+
+### `BTN_TRIGGER_HAPPY36` (`number`)
+
+Value: `739`
+
+
+
+### `BTN_TRIGGER_HAPPY37` (`number`)
+
+Value: `740`
+
+
+
+### `BTN_TRIGGER_HAPPY38` (`number`)
+
+Value: `741`
+
+
+
+### `BTN_TRIGGER_HAPPY39` (`number`)
+
+Value: `742`
+
+
+
+### `BTN_TRIGGER_HAPPY4` (`number`)
+
+Value: `707`
+
+
+
+### `BTN_TRIGGER_HAPPY40` (`number`)
+
+Value: `743`
+
+
+
+### `BTN_TRIGGER_HAPPY5` (`number`)
+
+Value: `708`
+
+
+
+### `BTN_TRIGGER_HAPPY6` (`number`)
+
+Value: `709`
+
+
+
+### `BTN_TRIGGER_HAPPY7` (`number`)
+
+Value: `710`
+
+
+
+### `BTN_TRIGGER_HAPPY8` (`number`)
+
+Value: `711`
+
+
+
+### `BTN_TRIGGER_HAPPY9` (`number`)
+
+Value: `712`
+
+
+
+### `BTN_WEST` (`number`)
+
+Value: `308`
+
+
+
+### `BTN_WHEEL` (`number`)
+
+Value: `336`
+
+
+
+### `BTN_X` (`number`)
+
+Value: `307`
+
+
+
+### `BTN_Y` (`number`)
+
+Value: `308`
+
+
+
+### `BTN_Z` (`number`)
+
+Value: `309`
+
+
+
+### `EV_ABS` (`number`)
+
+Value: `3`
+
+
+
+### `EV_CNT` (`number`)
+
+Value: `32`
+
+
+
+### `EV_FF` (`number`)
+
+Value: `21`
+
+
+
+### `EV_FF_STATUS` (`number`)
+
+Value: `23`
+
+
+
+### `EV_KEY` (`number`)
+
+Value: `1`
+
+
+
+### `EV_LED` (`number`)
+
+Value: `17`
+
+
+
+### `EV_MAX` (`number`)
+
+Value: `31`
+
+
+
+### `EV_MSC` (`number`)
+
+Value: `4`
+
+
+
+### `EV_PWR` (`number`)
+
+Value: `22`
+
+
+
+### `EV_REL` (`number`)
+
+Value: `2`
+
+
+
+### `EV_REP` (`number`)
+
+Value: `20`
+
+
+
+### `EV_SND` (`number`)
+
+Value: `18`
+
+
+
+### `EV_SW` (`number`)
+
+Value: `5`
+
+
+
+### `EV_SYN` (`number`)
+
+Value: `0`
+
+
+
+### `KEY_0` (`number`)
+
+Value: `11`
+
+
+
+### `KEY_1` (`number`)
+
+Value: `2`
+
+
+
+### `KEY_102ND` (`number`)
+
+Value: `86`
+
+
+
+### `KEY_10CHANNELSDOWN` (`number`)
+
+Value: `441`
+
+
+
+### `KEY_10CHANNELSUP` (`number`)
+
+Value: `440`
+
+
+
+### `KEY_2` (`number`)
+
+Value: `3`
+
+
+
+### `KEY_3` (`number`)
+
+Value: `4`
+
+
+
+### `KEY_3D_MODE` (`number`)
+
+Value: `623`
+
+
+
+### `KEY_4` (`number`)
+
+Value: `5`
+
+
+
+### `KEY_5` (`number`)
+
+Value: `6`
+
+
+
+### `KEY_6` (`number`)
+
+Value: `7`
+
+
+
+### `KEY_7` (`number`)
+
+Value: `8`
+
+
+
+### `KEY_8` (`number`)
+
+Value: `9`
+
+
+
+### `KEY_9` (`number`)
+
+Value: `10`
+
+
+
+### `KEY_A` (`number`)
+
+Value: `30`
+
+
+
+### `KEY_AB` (`number`)
+
+Value: `406`
+
+
+
+### `KEY_ACCESSIBILITY` (`number`)
+
+Value: `590`
+
+
+
+### `KEY_ADDRESSBOOK` (`number`)
+
+Value: `429`
+
+
+
+### `KEY_AGAIN` (`number`)
+
+Value: `129`
+
+
+
+### `KEY_ALL_APPLICATIONS` (`number`)
+
+Value: `204`
+
+
+
+### `KEY_ALS_TOGGLE` (`number`)
+
+Value: `560`
+
+
+
+### `KEY_ALTERASE` (`number`)
+
+Value: `222`
+
+
+
+### `KEY_ANGLE` (`number`)
+
+Value: `371`
+
+
+
+### `KEY_APOSTROPHE` (`number`)
+
+Value: `40`
+
+
+
+### `KEY_APPSELECT` (`number`)
+
+Value: `580`
+
+
+
+### `KEY_ARCHIVE` (`number`)
+
+Value: `361`
+
+
+
+### `KEY_ASPECT_RATIO` (`number`)
+
+Value: `375`
+
+
+
+### `KEY_ASSISTANT` (`number`)
+
+Value: `583`
+
+
+
+### `KEY_ATTENDANT_OFF` (`number`)
+
+Value: `540`
+
+
+
+### `KEY_ATTENDANT_ON` (`number`)
+
+Value: `539`
+
+
+
+### `KEY_ATTENDANT_TOGGLE` (`number`)
+
+Value: `541`
+
+
+
+### `KEY_AUDIO` (`number`)
+
+Value: `392`
+
+
+
+### `KEY_AUDIO_DESC` (`number`)
+
+Value: `622`
+
+
+
+### `KEY_AUTOPILOT_ENGAGE_TOGGLE` (`number`)
+
+Value: `637`
+
+
+
+### `KEY_AUX` (`number`)
+
+Value: `390`
+
+
+
+### `KEY_B` (`number`)
+
+Value: `48`
+
+
+
+### `KEY_BACK` (`number`)
+
+Value: `158`
+
+
+
+### `KEY_BACKSLASH` (`number`)
+
+Value: `43`
+
+
+
+### `KEY_BACKSPACE` (`number`)
+
+Value: `14`
+
+
+
+### `KEY_BASSBOOST` (`number`)
+
+Value: `209`
+
+
+
+### `KEY_BATTERY` (`number`)
+
+Value: `236`
+
+
+
+### `KEY_BLUE` (`number`)
+
+Value: `401`
+
+
+
+### `KEY_BLUETOOTH` (`number`)
+
+Value: `237`
+
+
+
+### `KEY_BOOKMARKS` (`number`)
+
+Value: `156`
+
+
+
+### `KEY_BREAK` (`number`)
+
+Value: `411`
+
+
+
+### `KEY_BRIGHTNESSDOWN` (`number`)
+
+Value: `224`
+
+
+
+### `KEY_BRIGHTNESSUP` (`number`)
+
+Value: `225`
+
+
+
+### `KEY_BRIGHTNESS_CYCLE` (`number`)
+
+Value: `243`
+
+
+
+### `KEY_BRIGHTNESS_MAX` (`number`)
+
+Value: `593`
+
+
+
+### `KEY_BRIGHTNESS_MENU` (`number`)
+
+Value: `649`
+
+
+
+### `KEY_BRIGHTNESS_MIN` (`number`)
+
+Value: `592`
+
+
+
+### `KEY_BRIGHTNESS_TOGGLE` (`number`)
+
+Value: `431`
+
+
+
+### `KEY_BRL_DOT1` (`number`)
+
+Value: `497`
+
+
+
+### `KEY_BRL_DOT10` (`number`)
+
+Value: `506`
+
+
+
+### `KEY_BRL_DOT2` (`number`)
+
+Value: `498`
+
+
+
+### `KEY_BRL_DOT3` (`number`)
+
+Value: `499`
+
+
+
+### `KEY_BRL_DOT4` (`number`)
+
+Value: `500`
+
+
+
+### `KEY_BRL_DOT5` (`number`)
+
+Value: `501`
+
+
+
+### `KEY_BRL_DOT6` (`number`)
+
+Value: `502`
+
+
+
+### `KEY_BRL_DOT7` (`number`)
+
+Value: `503`
+
+
+
+### `KEY_BRL_DOT8` (`number`)
+
+Value: `504`
+
+
+
+### `KEY_BRL_DOT9` (`number`)
+
+Value: `505`
+
+
+
+### `KEY_BUTTONCONFIG` (`number`)
+
+Value: `576`
+
+
+
+### `KEY_C` (`number`)
+
+Value: `46`
+
+
+
+### `KEY_CALC` (`number`)
+
+Value: `140`
+
+
+
+### `KEY_CALENDAR` (`number`)
+
+Value: `397`
+
+
+
+### `KEY_CAMERA` (`number`)
+
+Value: `212`
+
+
+
+### `KEY_CAMERA_ACCESS_DISABLE` (`number`)
+
+Value: `588`
+
+
+
+### `KEY_CAMERA_ACCESS_ENABLE` (`number`)
+
+Value: `587`
+
+
+
+### `KEY_CAMERA_ACCESS_TOGGLE` (`number`)
+
+Value: `589`
+
+
+
+### `KEY_CAMERA_DOWN` (`number`)
+
+Value: `536`
+
+
+
+### `KEY_CAMERA_FOCUS` (`number`)
+
+Value: `528`
+
+
+
+### `KEY_CAMERA_LEFT` (`number`)
+
+Value: `537`
+
+
+
+### `KEY_CAMERA_RIGHT` (`number`)
+
+Value: `538`
+
+
+
+### `KEY_CAMERA_UP` (`number`)
+
+Value: `535`
+
+
+
+### `KEY_CAMERA_ZOOMIN` (`number`)
+
+Value: `533`
+
+
+
+### `KEY_CAMERA_ZOOMOUT` (`number`)
+
+Value: `534`
+
+
+
+### `KEY_CANCEL` (`number`)
+
+Value: `223`
+
+
+
+### `KEY_CAPSLOCK` (`number`)
+
+Value: `58`
+
+
+
+### `KEY_CD` (`number`)
+
+Value: `383`
+
+
+
+### `KEY_CHANNEL` (`number`)
+
+Value: `363`
+
+
+
+### `KEY_CHANNELDOWN` (`number`)
+
+Value: `403`
+
+
+
+### `KEY_CHANNELUP` (`number`)
+
+Value: `402`
+
+
+
+### `KEY_CHAT` (`number`)
+
+Value: `216`
+
+
+
+### `KEY_CLEAR` (`number`)
+
+Value: `355`
+
+
+
+### `KEY_CLEARVU_SONAR` (`number`)
+
+Value: `646`
+
+
+
+### `KEY_CLOSE` (`number`)
+
+Value: `206`
+
+
+
+### `KEY_CLOSECD` (`number`)
+
+Value: `160`
+
+
+
+### `KEY_CNT` (`number`)
+
+Value: `768`
+
+
+
+### `KEY_COFFEE` (`number`)
+
+Value: `152`
+
+
+
+### `KEY_COMMA` (`number`)
+
+Value: `51`
+
+
+
+### `KEY_COMPOSE` (`number`)
+
+Value: `127`
+
+
+
+### `KEY_COMPUTER` (`number`)
+
+Value: `157`
+
+
+
+### `KEY_CONFIG` (`number`)
+
+Value: `171`
+
+
+
+### `KEY_CONNECT` (`number`)
+
+Value: `218`
+
+
+
+### `KEY_CONTEXT_MENU` (`number`)
+
+Value: `438`
+
+
+
+### `KEY_CONTROLPANEL` (`number`)
+
+Value: `579`
+
+
+
+### `KEY_COPY` (`number`)
+
+Value: `133`
+
+
+
+### `KEY_CUT` (`number`)
+
+Value: `137`
+
+
+
+### `KEY_CYCLEWINDOWS` (`number`)
+
+Value: `154`
+
+
+
+### `KEY_D` (`number`)
+
+Value: `32`
+
+
+
+### `KEY_DASHBOARD` (`number`)
+
+Value: `204`
+
+
+
+### `KEY_DATA` (`number`)
+
+Value: `631`
+
+
+
+### `KEY_DATABASE` (`number`)
+
+Value: `426`
+
+
+
+### `KEY_DELETE` (`number`)
+
+Value: `111`
+
+
+
+### `KEY_DELETEFILE` (`number`)
+
+Value: `146`
+
+
+
+### `KEY_DEL_EOL` (`number`)
+
+Value: `448`
+
+
+
+### `KEY_DEL_EOS` (`number`)
+
+Value: `449`
+
+
+
+### `KEY_DEL_LINE` (`number`)
+
+Value: `451`
+
+
+
+### `KEY_DICTATE` (`number`)
+
+Value: `586`
+
+
+
+### `KEY_DIGITS` (`number`)
+
+Value: `413`
+
+
+
+### `KEY_DIRECTION` (`number`)
+
+Value: `153`
+
+
+
+### `KEY_DIRECTORY` (`number`)
+
+Value: `394`
+
+
+
+### `KEY_DISPLAYTOGGLE` (`number`)
+
+Value: `431`
+
+
+
+### `KEY_DISPLAY_OFF` (`number`)
+
+Value: `245`
+
+
+
+### `KEY_DOCUMENTS` (`number`)
+
+Value: `235`
+
+
+
+### `KEY_DOLLAR` (`number`)
+
+Value: `434`
+
+
+
+### `KEY_DOT` (`number`)
+
+Value: `52`
+
+
+
+### `KEY_DOWN` (`number`)
+
+Value: `108`
+
+
+
+### `KEY_DO_NOT_DISTURB` (`number`)
+
+Value: `591`
+
+
+
+### `KEY_DUAL_RANGE_RADAR` (`number`)
+
+Value: `643`
+
+
+
+### `KEY_DVD` (`number`)
+
+Value: `389`
+
+
+
+### `KEY_E` (`number`)
+
+Value: `18`
+
+
+
+### `KEY_EDIT` (`number`)
+
+Value: `176`
+
+
+
+### `KEY_EDITOR` (`number`)
+
+Value: `422`
+
+
+
+### `KEY_EJECTCD` (`number`)
+
+Value: `161`
+
+
+
+### `KEY_EJECTCLOSECD` (`number`)
+
+Value: `162`
+
+
+
+### `KEY_EMAIL` (`number`)
+
+Value: `215`
+
+
+
+### `KEY_EMOJI_PICKER` (`number`)
+
+Value: `585`
+
+
+
+### `KEY_END` (`number`)
+
+Value: `107`
+
+
+
+### `KEY_ENTER` (`number`)
+
+Value: `28`
+
+
+
+### `KEY_EPG` (`number`)
+
+Value: `365`
+
+
+
+### `KEY_EPRIVACY_SCREEN_OFF` (`number`)
+
+Value: `595`
+
+
+
+### `KEY_EPRIVACY_SCREEN_ON` (`number`)
+
+Value: `594`
+
+
+
+### `KEY_EQUAL` (`number`)
+
+Value: `13`
+
+
+
+### `KEY_ESC` (`number`)
+
+Value: `1`
+
+
+
+### `KEY_EURO` (`number`)
+
+Value: `435`
+
+
+
+### `KEY_EXIT` (`number`)
+
+Value: `174`
+
+
+
+### `KEY_F` (`number`)
+
+Value: `33`
+
+
+
+### `KEY_F1` (`number`)
+
+Value: `59`
+
+
+
+### `KEY_F10` (`number`)
+
+Value: `68`
+
+
+
+### `KEY_F11` (`number`)
+
+Value: `87`
+
+
+
+### `KEY_F12` (`number`)
+
+Value: `88`
+
+
+
+### `KEY_F13` (`number`)
+
+Value: `183`
+
+
+
+### `KEY_F14` (`number`)
+
+Value: `184`
+
+
+
+### `KEY_F15` (`number`)
+
+Value: `185`
+
+
+
+### `KEY_F16` (`number`)
+
+Value: `186`
+
+
+
+### `KEY_F17` (`number`)
+
+Value: `187`
+
+
+
+### `KEY_F18` (`number`)
+
+Value: `188`
+
+
+
+### `KEY_F19` (`number`)
+
+Value: `189`
+
+
+
+### `KEY_F2` (`number`)
+
+Value: `60`
+
+
+
+### `KEY_F20` (`number`)
+
+Value: `190`
+
+
+
+### `KEY_F21` (`number`)
+
+Value: `191`
+
+
+
+### `KEY_F22` (`number`)
+
+Value: `192`
+
+
+
+### `KEY_F23` (`number`)
+
+Value: `193`
+
+
+
+### `KEY_F24` (`number`)
+
+Value: `194`
+
+
+
+### `KEY_F3` (`number`)
+
+Value: `61`
+
+
+
+### `KEY_F4` (`number`)
+
+Value: `62`
+
+
+
+### `KEY_F5` (`number`)
+
+Value: `63`
+
+
+
+### `KEY_F6` (`number`)
+
+Value: `64`
+
+
+
+### `KEY_F7` (`number`)
+
+Value: `65`
+
+
+
+### `KEY_F8` (`number`)
+
+Value: `66`
+
+
+
+### `KEY_F9` (`number`)
+
+Value: `67`
+
+
+
+### `KEY_FASTFORWARD` (`number`)
+
+Value: `208`
+
+
+
+### `KEY_FASTREVERSE` (`number`)
+
+Value: `629`
+
+
+
+### `KEY_FAVORITES` (`number`)
+
+Value: `364`
+
+
+
+### `KEY_FILE` (`number`)
+
+Value: `144`
+
+
+
+### `KEY_FINANCE` (`number`)
+
+Value: `219`
+
+
+
+### `KEY_FIND` (`number`)
+
+Value: `136`
+
+
+
+### `KEY_FIRST` (`number`)
+
+Value: `404`
+
+
+
+### `KEY_FISHING_CHART` (`number`)
+
+Value: `641`
+
+
+
+### `KEY_FN` (`number`)
+
+Value: `464`
+
+
+
+### `KEY_FN_1` (`number`)
+
+Value: `478`
+
+
+
+### `KEY_FN_2` (`number`)
+
+Value: `479`
+
+
+
+### `KEY_FN_B` (`number`)
+
+Value: `484`
+
+
+
+### `KEY_FN_D` (`number`)
+
+Value: `480`
+
+
+
+### `KEY_FN_E` (`number`)
+
+Value: `481`
+
+
+
+### `KEY_FN_ESC` (`number`)
+
+Value: `465`
+
+
+
+### `KEY_FN_F` (`number`)
+
+Value: `482`
+
+
+
+### `KEY_FN_F1` (`number`)
+
+Value: `466`
+
+
+
+### `KEY_FN_F10` (`number`)
+
+Value: `475`
+
+
+
+### `KEY_FN_F11` (`number`)
+
+Value: `476`
+
+
+
+### `KEY_FN_F12` (`number`)
+
+Value: `477`
+
+
+
+### `KEY_FN_F2` (`number`)
+
+Value: `467`
+
+
+
+### `KEY_FN_F3` (`number`)
+
+Value: `468`
+
+
+
+### `KEY_FN_F4` (`number`)
+
+Value: `469`
+
+
+
+### `KEY_FN_F5` (`number`)
+
+Value: `470`
+
+
+
+### `KEY_FN_F6` (`number`)
+
+Value: `471`
+
+
+
+### `KEY_FN_F7` (`number`)
+
+Value: `472`
+
+
+
+### `KEY_FN_F8` (`number`)
+
+Value: `473`
+
+
+
+### `KEY_FN_F9` (`number`)
+
+Value: `474`
+
+
+
+### `KEY_FN_RIGHT_SHIFT` (`number`)
+
+Value: `485`
+
+
+
+### `KEY_FN_S` (`number`)
+
+Value: `483`
+
+
+
+### `KEY_FORWARD` (`number`)
+
+Value: `159`
+
+
+
+### `KEY_FORWARDMAIL` (`number`)
+
+Value: `233`
+
+
+
+### `KEY_FRAMEBACK` (`number`)
+
+Value: `436`
+
+
+
+### `KEY_FRAMEFORWARD` (`number`)
+
+Value: `437`
+
+
+
+### `KEY_FRONT` (`number`)
+
+Value: `132`
+
+
+
+### `KEY_FULL_SCREEN` (`number`)
+
+Value: `372`
+
+
+
+### `KEY_G` (`number`)
+
+Value: `34`
+
+
+
+### `KEY_GAMES` (`number`)
+
+Value: `417`
+
+
+
+### `KEY_GOTO` (`number`)
+
+Value: `354`
+
+
+
+### `KEY_GRAPHICSEDITOR` (`number`)
+
+Value: `424`
+
+
+
+### `KEY_GRAVE` (`number`)
+
+Value: `41`
+
+
+
+### `KEY_GREEN` (`number`)
+
+Value: `399`
+
+
+
+### `KEY_H` (`number`)
+
+Value: `35`
+
+
+
+### `KEY_HANGEUL` (`number`)
+
+Value: `122`
+
+
+
+### `KEY_HANGUEL` (`number`)
+
+Value: `122`
+
+
+
+### `KEY_HANGUP_PHONE` (`number`)
+
+Value: `446`
+
+
+
+### `KEY_HANJA` (`number`)
+
+Value: `123`
+
+
+
+### `KEY_HELP` (`number`)
+
+Value: `138`
+
+
+
+### `KEY_HENKAN` (`number`)
+
+Value: `92`
+
+
+
+### `KEY_HIRAGANA` (`number`)
+
+Value: `91`
+
+
+
+### `KEY_HOME` (`number`)
+
+Value: `102`
+
+
+
+### `KEY_HOMEPAGE` (`number`)
+
+Value: `172`
+
+
+
+### `KEY_HP` (`number`)
+
+Value: `211`
+
+
+
+### `KEY_I` (`number`)
+
+Value: `23`
+
+
+
+### `KEY_IMAGES` (`number`)
+
+Value: `442`
+
+
+
+### `KEY_INFO` (`number`)
+
+Value: `358`
+
+
+
+### `KEY_INSERT` (`number`)
+
+Value: `110`
+
+
+
+### `KEY_INS_LINE` (`number`)
+
+Value: `450`
+
+
+
+### `KEY_ISO` (`number`)
+
+Value: `170`
+
+
+
+### `KEY_J` (`number`)
+
+Value: `36`
+
+
+
+### `KEY_JOURNAL` (`number`)
+
+Value: `578`
+
+
+
+### `KEY_K` (`number`)
+
+Value: `37`
+
+
+
+### `KEY_KATAKANA` (`number`)
+
+Value: `90`
+
+
+
+### `KEY_KATAKANAHIRAGANA` (`number`)
+
+Value: `93`
+
+
+
+### `KEY_KBDILLUMDOWN` (`number`)
+
+Value: `229`
+
+
+
+### `KEY_KBDILLUMTOGGLE` (`number`)
+
+Value: `228`
+
+
+
+### `KEY_KBDILLUMUP` (`number`)
+
+Value: `230`
+
+
+
+### `KEY_KBDINPUTASSIST_ACCEPT` (`number`)
+
+Value: `612`
+
+
+
+### `KEY_KBDINPUTASSIST_CANCEL` (`number`)
+
+Value: `613`
+
+
+
+### `KEY_KBDINPUTASSIST_NEXT` (`number`)
+
+Value: `609`
+
+
+
+### `KEY_KBDINPUTASSIST_NEXTGROUP` (`number`)
+
+Value: `611`
+
+
+
+### `KEY_KBDINPUTASSIST_PREV` (`number`)
+
+Value: `608`
+
+
+
+### `KEY_KBDINPUTASSIST_PREVGROUP` (`number`)
+
+Value: `610`
+
+
+
+### `KEY_KBD_LAYOUT_NEXT` (`number`)
+
+Value: `584`
+
+
+
+### `KEY_KBD_LCD_MENU1` (`number`)
+
+Value: `696`
+
+
+
+### `KEY_KBD_LCD_MENU2` (`number`)
+
+Value: `697`
+
+
+
+### `KEY_KBD_LCD_MENU3` (`number`)
+
+Value: `698`
+
+
+
+### `KEY_KBD_LCD_MENU4` (`number`)
+
+Value: `699`
+
+
+
+### `KEY_KBD_LCD_MENU5` (`number`)
+
+Value: `700`
+
+
+
+### `KEY_KEYBOARD` (`number`)
+
+Value: `374`
+
+
+
+### `KEY_KP0` (`number`)
+
+Value: `82`
+
+
+
+### `KEY_KP1` (`number`)
+
+Value: `79`
+
+
+
+### `KEY_KP2` (`number`)
+
+Value: `80`
+
+
+
+### `KEY_KP3` (`number`)
+
+Value: `81`
+
+
+
+### `KEY_KP4` (`number`)
+
+Value: `75`
+
+
+
+### `KEY_KP5` (`number`)
+
+Value: `76`
+
+
+
+### `KEY_KP6` (`number`)
+
+Value: `77`
+
+
+
+### `KEY_KP7` (`number`)
+
+Value: `71`
+
+
+
+### `KEY_KP8` (`number`)
+
+Value: `72`
+
+
+
+### `KEY_KP9` (`number`)
+
+Value: `73`
+
+
+
+### `KEY_KPASTERISK` (`number`)
+
+Value: `55`
+
+
+
+### `KEY_KPCOMMA` (`number`)
+
+Value: `121`
+
+
+
+### `KEY_KPDOT` (`number`)
+
+Value: `83`
+
+
+
+### `KEY_KPENTER` (`number`)
+
+Value: `96`
+
+
+
+### `KEY_KPEQUAL` (`number`)
+
+Value: `117`
+
+
+
+### `KEY_KPJPCOMMA` (`number`)
+
+Value: `95`
+
+
+
+### `KEY_KPLEFTPAREN` (`number`)
+
+Value: `179`
+
+
+
+### `KEY_KPMINUS` (`number`)
+
+Value: `74`
+
+
+
+### `KEY_KPPLUS` (`number`)
+
+Value: `78`
+
+
+
+### `KEY_KPPLUSMINUS` (`number`)
+
+Value: `118`
+
+
+
+### `KEY_KPRIGHTPAREN` (`number`)
+
+Value: `180`
+
+
+
+### `KEY_KPSLASH` (`number`)
+
+Value: `98`
+
+
+
+### `KEY_L` (`number`)
+
+Value: `38`
+
+
+
+### `KEY_LANGUAGE` (`number`)
+
+Value: `368`
+
+
+
+### `KEY_LAST` (`number`)
+
+Value: `405`
+
+
+
+### `KEY_LEFT` (`number`)
+
+Value: `105`
+
+
+
+### `KEY_LEFTALT` (`number`)
+
+Value: `56`
+
+
+
+### `KEY_LEFTBRACE` (`number`)
+
+Value: `26`
+
+
+
+### `KEY_LEFTCTRL` (`number`)
+
+Value: `29`
+
+
+
+### `KEY_LEFTMETA` (`number`)
+
+Value: `125`
+
+
+
+### `KEY_LEFTSHIFT` (`number`)
+
+Value: `42`
+
+
+
+### `KEY_LEFT_DOWN` (`number`)
+
+Value: `617`
+
+
+
+### `KEY_LEFT_UP` (`number`)
+
+Value: `616`
+
+
+
+### `KEY_LIGHTS_TOGGLE` (`number`)
+
+Value: `542`
+
+
+
+### `KEY_LINEFEED` (`number`)
+
+Value: `101`
+
+
+
+### `KEY_LINK_PHONE` (`number`)
+
+Value: `447`
+
+
+
+### `KEY_LIST` (`number`)
+
+Value: `395`
+
+
+
+### `KEY_LOGOFF` (`number`)
+
+Value: `433`
+
+
+
+### `KEY_M` (`number`)
+
+Value: `50`
+
+
+
+### `KEY_MACRO` (`number`)
+
+Value: `112`
+
+
+
+### `KEY_MACRO1` (`number`)
+
+Value: `656`
+
+
+
+### `KEY_MACRO10` (`number`)
+
+Value: `665`
+
+
+
+### `KEY_MACRO11` (`number`)
+
+Value: `666`
+
+
+
+### `KEY_MACRO12` (`number`)
+
+Value: `667`
+
+
+
+### `KEY_MACRO13` (`number`)
+
+Value: `668`
+
+
+
+### `KEY_MACRO14` (`number`)
+
+Value: `669`
+
+
+
+### `KEY_MACRO15` (`number`)
+
+Value: `670`
+
+
+
+### `KEY_MACRO16` (`number`)
+
+Value: `671`
+
+
+
+### `KEY_MACRO17` (`number`)
+
+Value: `672`
+
+
+
+### `KEY_MACRO18` (`number`)
+
+Value: `673`
+
+
+
+### `KEY_MACRO19` (`number`)
+
+Value: `674`
+
+
+
+### `KEY_MACRO2` (`number`)
+
+Value: `657`
+
+
+
+### `KEY_MACRO20` (`number`)
+
+Value: `675`
+
+
+
+### `KEY_MACRO21` (`number`)
+
+Value: `676`
+
+
+
+### `KEY_MACRO22` (`number`)
+
+Value: `677`
+
+
+
+### `KEY_MACRO23` (`number`)
+
+Value: `678`
+
+
+
+### `KEY_MACRO24` (`number`)
+
+Value: `679`
+
+
+
+### `KEY_MACRO25` (`number`)
+
+Value: `680`
+
+
+
+### `KEY_MACRO26` (`number`)
+
+Value: `681`
+
+
+
+### `KEY_MACRO27` (`number`)
+
+Value: `682`
+
+
+
+### `KEY_MACRO28` (`number`)
+
+Value: `683`
+
+
+
+### `KEY_MACRO29` (`number`)
+
+Value: `684`
+
+
+
+### `KEY_MACRO3` (`number`)
+
+Value: `658`
+
+
+
+### `KEY_MACRO30` (`number`)
+
+Value: `685`
+
+
+
+### `KEY_MACRO4` (`number`)
+
+Value: `659`
+
+
+
+### `KEY_MACRO5` (`number`)
+
+Value: `660`
+
+
+
+### `KEY_MACRO6` (`number`)
+
+Value: `661`
+
+
+
+### `KEY_MACRO7` (`number`)
+
+Value: `662`
+
+
+
+### `KEY_MACRO8` (`number`)
+
+Value: `663`
+
+
+
+### `KEY_MACRO9` (`number`)
+
+Value: `664`
+
+
+
+### `KEY_MACRO_PRESET1` (`number`)
+
+Value: `691`
+
+
+
+### `KEY_MACRO_PRESET2` (`number`)
+
+Value: `692`
+
+
+
+### `KEY_MACRO_PRESET3` (`number`)
+
+Value: `693`
+
+
+
+### `KEY_MACRO_PRESET_CYCLE` (`number`)
+
+Value: `690`
+
+
+
+### `KEY_MACRO_RECORD_START` (`number`)
+
+Value: `688`
+
+
+
+### `KEY_MACRO_RECORD_STOP` (`number`)
+
+Value: `689`
+
+
+
+### `KEY_MAIL` (`number`)
+
+Value: `155`
+
+
+
+### `KEY_MARK_WAYPOINT` (`number`)
+
+Value: `638`
+
+
+
+### `KEY_MAX` (`number`)
+
+Value: `767`
+
+
+
+### `KEY_MEDIA` (`number`)
+
+Value: `226`
+
+
+
+### `KEY_MEDIA_REPEAT` (`number`)
+
+Value: `439`
+
+
+
+### `KEY_MEDIA_TOP_MENU` (`number`)
+
+Value: `619`
+
+
+
+### `KEY_MEMO` (`number`)
+
+Value: `396`
+
+
+
+### `KEY_MENU` (`number`)
+
+Value: `139`
+
+
+
+### `KEY_MESSENGER` (`number`)
+
+Value: `430`
+
+
+
+### `KEY_MHP` (`number`)
+
+Value: `367`
+
+
+
+### `KEY_MICMUTE` (`number`)
+
+Value: `248`
+
+
+
+### `KEY_MINUS` (`number`)
+
+Value: `12`
+
+
+
+### `KEY_MIN_INTERESTING` (`number`)
+
+Value: `113`
+
+
+
+### `KEY_MODE` (`number`)
+
+Value: `373`
+
+
+
+### `KEY_MOVE` (`number`)
+
+Value: `175`
+
+
+
+### `KEY_MP3` (`number`)
+
+Value: `391`
+
+
+
+### `KEY_MSDOS` (`number`)
+
+Value: `151`
+
+
+
+### `KEY_MUHENKAN` (`number`)
+
+Value: `94`
+
+
+
+### `KEY_MUTE` (`number`)
+
+Value: `113`
+
+
+
+### `KEY_N` (`number`)
+
+Value: `49`
+
+
+
+### `KEY_NAV_CHART` (`number`)
+
+Value: `640`
+
+
+
+### `KEY_NAV_INFO` (`number`)
+
+Value: `648`
+
+
+
+### `KEY_NEW` (`number`)
+
+Value: `181`
+
+
+
+### `KEY_NEWS` (`number`)
+
+Value: `427`
+
+
+
+### `KEY_NEXT` (`number`)
+
+Value: `407`
+
+
+
+### `KEY_NEXTSONG` (`number`)
+
+Value: `163`
+
+
+
+### `KEY_NEXT_ELEMENT` (`number`)
+
+Value: `635`
+
+
+
+### `KEY_NEXT_FAVORITE` (`number`)
+
+Value: `624`
+
+
+
+### `KEY_NOTIFICATION_CENTER` (`number`)
+
+Value: `444`
+
+
+
+### `KEY_NUMERIC_0` (`number`)
+
+Value: `512`
+
+
+
+### `KEY_NUMERIC_1` (`number`)
+
+Value: `513`
+
+
+
+### `KEY_NUMERIC_11` (`number`)
+
+Value: `620`
+
+
+
+### `KEY_NUMERIC_12` (`number`)
+
+Value: `621`
+
+
+
+### `KEY_NUMERIC_2` (`number`)
+
+Value: `514`
+
+
+
+### `KEY_NUMERIC_3` (`number`)
+
+Value: `515`
+
+
+
+### `KEY_NUMERIC_4` (`number`)
+
+Value: `516`
+
+
+
+### `KEY_NUMERIC_5` (`number`)
+
+Value: `517`
+
+
+
+### `KEY_NUMERIC_6` (`number`)
+
+Value: `518`
+
+
+
+### `KEY_NUMERIC_7` (`number`)
+
+Value: `519`
+
+
+
+### `KEY_NUMERIC_8` (`number`)
+
+Value: `520`
+
+
+
+### `KEY_NUMERIC_9` (`number`)
+
+Value: `521`
+
+
+
+### `KEY_NUMERIC_A` (`number`)
+
+Value: `524`
+
+
+
+### `KEY_NUMERIC_B` (`number`)
+
+Value: `525`
+
+
+
+### `KEY_NUMERIC_C` (`number`)
+
+Value: `526`
+
+
+
+### `KEY_NUMERIC_D` (`number`)
+
+Value: `527`
+
+
+
+### `KEY_NUMERIC_POUND` (`number`)
+
+Value: `523`
+
+
+
+### `KEY_NUMERIC_STAR` (`number`)
+
+Value: `522`
+
+
+
+### `KEY_NUMLOCK` (`number`)
+
+Value: `69`
+
+
+
+### `KEY_O` (`number`)
+
+Value: `24`
+
+
+
+### `KEY_OK` (`number`)
+
+Value: `352`
+
+
+
+### `KEY_ONSCREEN_KEYBOARD` (`number`)
+
+Value: `632`
+
+
+
+### `KEY_OPEN` (`number`)
+
+Value: `134`
+
+
+
+### `KEY_OPTION` (`number`)
+
+Value: `357`
+
+
+
+### `KEY_P` (`number`)
+
+Value: `25`
+
+
+
+### `KEY_PAGEDOWN` (`number`)
+
+Value: `109`
+
+
+
+### `KEY_PAGEUP` (`number`)
+
+Value: `104`
+
+
+
+### `KEY_PASTE` (`number`)
+
+Value: `135`
+
+
+
+### `KEY_PAUSE` (`number`)
+
+Value: `119`
+
+
+
+### `KEY_PAUSECD` (`number`)
+
+Value: `201`
+
+
+
+### `KEY_PAUSE_RECORD` (`number`)
+
+Value: `626`
+
+
+
+### `KEY_PC` (`number`)
+
+Value: `376`
+
+
+
+### `KEY_PERFORMANCE` (`number`)
+
+Value: `701`
+
+
+
+### `KEY_PHONE` (`number`)
+
+Value: `169`
+
+
+
+### `KEY_PICKUP_PHONE` (`number`)
+
+Value: `445`
+
+
+
+### `KEY_PLAY` (`number`)
+
+Value: `207`
+
+
+
+### `KEY_PLAYCD` (`number`)
+
+Value: `200`
+
+
+
+### `KEY_PLAYER` (`number`)
+
+Value: `387`
+
+
+
+### `KEY_PLAYPAUSE` (`number`)
+
+Value: `164`
+
+
+
+### `KEY_POWER` (`number`)
+
+Value: `116`
+
+
+
+### `KEY_POWER2` (`number`)
+
+Value: `356`
+
+
+
+### `KEY_PRESENTATION` (`number`)
+
+Value: `425`
+
+
+
+### `KEY_PREVIOUS` (`number`)
+
+Value: `412`
+
+
+
+### `KEY_PREVIOUSSONG` (`number`)
+
+Value: `165`
+
+
+
+### `KEY_PREVIOUS_ELEMENT` (`number`)
+
+Value: `636`
+
+
+
+### `KEY_PRINT` (`number`)
+
+Value: `210`
+
+
+
+### `KEY_PRIVACY_SCREEN_TOGGLE` (`number`)
+
+Value: `633`
+
+
+
+### `KEY_PROG1` (`number`)
+
+Value: `148`
+
+
+
+### `KEY_PROG2` (`number`)
+
+Value: `149`
+
+
+
+### `KEY_PROG3` (`number`)
+
+Value: `202`
+
+
+
+### `KEY_PROG4` (`number`)
+
+Value: `203`
+
+
+
+### `KEY_PROGRAM` (`number`)
+
+Value: `362`
+
+
+
+### `KEY_PROPS` (`number`)
+
+Value: `130`
+
+
+
+### `KEY_PVR` (`number`)
+
+Value: `366`
+
+
+
+### `KEY_Q` (`number`)
+
+Value: `16`
+
+
+
+### `KEY_QUESTION` (`number`)
+
+Value: `214`
+
+
+
+### `KEY_R` (`number`)
+
+Value: `19`
+
+
+
+### `KEY_RADAR_OVERLAY` (`number`)
+
+Value: `644`
+
+
+
+### `KEY_RADIO` (`number`)
+
+Value: `385`
+
+
+
+### `KEY_RECORD` (`number`)
+
+Value: `167`
+
+
+
+### `KEY_RED` (`number`)
+
+Value: `398`
+
+
+
+### `KEY_REDO` (`number`)
+
+Value: `182`
+
+
+
+### `KEY_REFRESH` (`number`)
+
+Value: `173`
+
+
+
+### `KEY_REFRESH_RATE_TOGGLE` (`number`)
+
+Value: `562`
+
+
+
+### `KEY_REPLY` (`number`)
+
+Value: `232`
+
+
+
+### `KEY_RESERVED` (`number`)
+
+Value: `0`
+
+
+
+### `KEY_RESTART` (`number`)
+
+Value: `408`
+
+
+
+### `KEY_REWIND` (`number`)
+
+Value: `168`
+
+
+
+### `KEY_RFKILL` (`number`)
+
+Value: `247`
+
+
+
+### `KEY_RIGHT` (`number`)
+
+Value: `106`
+
+
+
+### `KEY_RIGHTALT` (`number`)
+
+Value: `100`
+
+
+
+### `KEY_RIGHTBRACE` (`number`)
+
+Value: `27`
+
+
+
+### `KEY_RIGHTCTRL` (`number`)
+
+Value: `97`
+
+
+
+### `KEY_RIGHTMETA` (`number`)
+
+Value: `126`
+
+
+
+### `KEY_RIGHTSHIFT` (`number`)
+
+Value: `54`
+
+
+
+### `KEY_RIGHT_DOWN` (`number`)
+
+Value: `615`
+
+
+
+### `KEY_RIGHT_UP` (`number`)
+
+Value: `614`
+
+
+
+### `KEY_RO` (`number`)
+
+Value: `89`
+
+
+
+### `KEY_ROOT_MENU` (`number`)
+
+Value: `618`
+
+
+
+### `KEY_ROTATE_DISPLAY` (`number`)
+
+Value: `153`
+
+
+
+### `KEY_ROTATE_LOCK_TOGGLE` (`number`)
+
+Value: `561`
+
+
+
+### `KEY_S` (`number`)
+
+Value: `31`
+
+
+
+### `KEY_SAT` (`number`)
+
+Value: `381`
+
+
+
+### `KEY_SAT2` (`number`)
+
+Value: `382`
+
+
+
+### `KEY_SAVE` (`number`)
+
+Value: `234`
+
+
+
+### `KEY_SCALE` (`number`)
+
+Value: `120`
+
+
+
+### `KEY_SCREEN` (`number`)
+
+Value: `375`
+
+
+
+### `KEY_SCREENLOCK` (`number`)
+
+Value: `152`
+
+
+
+### `KEY_SCREENSAVER` (`number`)
+
+Value: `581`
+
+
+
+### `KEY_SCROLLDOWN` (`number`)
+
+Value: `178`
+
+
+
+### `KEY_SCROLLLOCK` (`number`)
+
+Value: `70`
+
+
+
+### `KEY_SCROLLUP` (`number`)
+
+Value: `177`
+
+
+
+### `KEY_SEARCH` (`number`)
+
+Value: `217`
+
+
+
+### `KEY_SELECT` (`number`)
+
+Value: `353`
+
+
+
+### `KEY_SELECTIVE_SCREENSHOT` (`number`)
+
+Value: `634`
+
+
+
+### `KEY_SEMICOLON` (`number`)
+
+Value: `39`
+
+
+
+### `KEY_SEND` (`number`)
+
+Value: `231`
+
+
+
+### `KEY_SENDFILE` (`number`)
+
+Value: `145`
+
+
+
+### `KEY_SETUP` (`number`)
+
+Value: `141`
+
+
+
+### `KEY_SHOP` (`number`)
+
+Value: `221`
+
+
+
+### `KEY_SHUFFLE` (`number`)
+
+Value: `410`
+
+
+
+### `KEY_SIDEVU_SONAR` (`number`)
+
+Value: `647`
+
+
+
+### `KEY_SINGLE_RANGE_RADAR` (`number`)
+
+Value: `642`
+
+
+
+### `KEY_SLASH` (`number`)
+
+Value: `53`
+
+
+
+### `KEY_SLEEP` (`number`)
+
+Value: `142`
+
+
+
+### `KEY_SLOW` (`number`)
+
+Value: `409`
+
+
+
+### `KEY_SLOWREVERSE` (`number`)
+
+Value: `630`
+
+
+
+### `KEY_SOS` (`number`)
+
+Value: `639`
+
+
+
+### `KEY_SOUND` (`number`)
+
+Value: `213`
+
+
+
+### `KEY_SPACE` (`number`)
+
+Value: `57`
+
+
+
+### `KEY_SPELLCHECK` (`number`)
+
+Value: `432`
+
+
+
+### `KEY_SPORT` (`number`)
+
+Value: `220`
+
+
+
+### `KEY_SPREADSHEET` (`number`)
+
+Value: `423`
+
+
+
+### `KEY_STOP` (`number`)
+
+Value: `128`
+
+
+
+### `KEY_STOPCD` (`number`)
+
+Value: `166`
+
+
+
+### `KEY_STOP_RECORD` (`number`)
+
+Value: `625`
+
+
+
+### `KEY_SUBTITLE` (`number`)
+
+Value: `370`
+
+
+
+### `KEY_SUSPEND` (`number`)
+
+Value: `205`
+
+
+
+### `KEY_SYSRQ` (`number`)
+
+Value: `99`
+
+
+
+### `KEY_T` (`number`)
+
+Value: `20`
+
+
+
+### `KEY_TAB` (`number`)
+
+Value: `15`
+
+
+
+### `KEY_TAPE` (`number`)
+
+Value: `384`
+
+
+
+### `KEY_TASKMANAGER` (`number`)
+
+Value: `577`
+
+
+
+### `KEY_TEEN` (`number`)
+
+Value: `414`
+
+
+
+### `KEY_TEXT` (`number`)
+
+Value: `388`
+
+
+
+### `KEY_TIME` (`number`)
+
+Value: `359`
+
+
+
+### `KEY_TITLE` (`number`)
+
+Value: `369`
+
+
+
+### `KEY_TOUCHPAD_OFF` (`number`)
+
+Value: `532`
+
+
+
+### `KEY_TOUCHPAD_ON` (`number`)
+
+Value: `531`
+
+
+
+### `KEY_TOUCHPAD_TOGGLE` (`number`)
+
+Value: `530`
+
+
+
+### `KEY_TRADITIONAL_SONAR` (`number`)
+
+Value: `645`
+
+
+
+### `KEY_TUNER` (`number`)
+
+Value: `386`
+
+
+
+### `KEY_TV` (`number`)
+
+Value: `377`
+
+
+
+### `KEY_TV2` (`number`)
+
+Value: `378`
+
+
+
+### `KEY_TWEN` (`number`)
+
+Value: `415`
+
+
+
+### `KEY_U` (`number`)
+
+Value: `22`
+
+
+
+### `KEY_UNDO` (`number`)
+
+Value: `131`
+
+
+
+### `KEY_UNKNOWN` (`number`)
+
+Value: `240`
+
+
+
+### `KEY_UNMUTE` (`number`)
+
+Value: `628`
+
+
+
+### `KEY_UP` (`number`)
+
+Value: `103`
+
+
+
+### `KEY_UWB` (`number`)
+
+Value: `239`
+
+
+
+### `KEY_V` (`number`)
+
+Value: `47`
+
+
+
+### `KEY_VCR` (`number`)
+
+Value: `379`
+
+
+
+### `KEY_VCR2` (`number`)
+
+Value: `380`
+
+
+
+### `KEY_VENDOR` (`number`)
+
+Value: `360`
+
+
+
+### `KEY_VIDEO` (`number`)
+
+Value: `393`
+
+
+
+### `KEY_VIDEOPHONE` (`number`)
+
+Value: `416`
+
+
+
+### `KEY_VIDEO_NEXT` (`number`)
+
+Value: `241`
+
+
+
+### `KEY_VIDEO_PREV` (`number`)
+
+Value: `242`
+
+
+
+### `KEY_VOD` (`number`)
+
+Value: `627`
+
+
+
+### `KEY_VOICECOMMAND` (`number`)
+
+Value: `582`
+
+
+
+### `KEY_VOICEMAIL` (`number`)
+
+Value: `428`
+
+
+
+### `KEY_VOLUMEDOWN` (`number`)
+
+Value: `114`
+
+
+
+### `KEY_VOLUMEUP` (`number`)
+
+Value: `115`
+
+
+
+### `KEY_W` (`number`)
+
+Value: `17`
+
+
+
+### `KEY_WAKEUP` (`number`)
+
+Value: `143`
+
+
+
+### `KEY_WIMAX` (`number`)
+
+Value: `246`
+
+
+
+### `KEY_WLAN` (`number`)
+
+Value: `238`
+
+
+
+### `KEY_WORDPROCESSOR` (`number`)
+
+Value: `421`
+
+
+
+### `KEY_WPS_BUTTON` (`number`)
+
+Value: `529`
+
+
+
+### `KEY_WWAN` (`number`)
+
+Value: `246`
+
+
+
+### `KEY_WWW` (`number`)
+
+Value: `150`
+
+
+
+### `KEY_X` (`number`)
+
+Value: `45`
+
+
+
+### `KEY_XFER` (`number`)
+
+Value: `147`
+
+
+
+### `KEY_Y` (`number`)
+
+Value: `21`
+
+
+
+### `KEY_YELLOW` (`number`)
+
+Value: `400`
+
+
+
+### `KEY_YEN` (`number`)
+
+Value: `124`
+
+
+
+### `KEY_Z` (`number`)
+
+Value: `44`
+
+
+
+### `KEY_ZENKAKUHANKAKU` (`number`)
+
+Value: `85`
+
+
+
+### `KEY_ZOOM` (`number`)
+
+Value: `372`
+
+
+
+### `KEY_ZOOMIN` (`number`)
+
+Value: `418`
+
+
+
+### `KEY_ZOOMOUT` (`number`)
+
+Value: `419`
+
+
+
+### `KEY_ZOOMRESET` (`number`)
+
+Value: `420`
+
+
+
+### `REL_CNT` (`number`)
+
+Value: `16`
+
+
+
+### `REL_DIAL` (`number`)
+
+Value: `7`
+
+
+
+### `REL_HWHEEL` (`number`)
+
+Value: `6`
+
+
+
+### `REL_HWHEEL_HI_RES` (`number`)
+
+Value: `12`
+
+
+
+### `REL_MAX` (`number`)
+
+Value: `15`
+
+
+
+### `REL_MISC` (`number`)
+
+Value: `9`
+
+
+
+### `REL_RESERVED` (`number`)
+
+Value: `10`
+
+
+
+### `REL_RX` (`number`)
+
+Value: `3`
+
+
+
+### `REL_RY` (`number`)
+
+Value: `4`
+
+
+
+### `REL_RZ` (`number`)
+
+Value: `5`
+
+
+
+### `REL_WHEEL` (`number`)
+
+Value: `8`
+
+
+
+### `REL_WHEEL_HI_RES` (`number`)
+
+Value: `11`
+
+
+
+### `REL_X` (`number`)
+
+Value: `0`
+
+
+
+### `REL_Y` (`number`)
+
+Value: `1`
+
+
+
+### `REL_Z` (`number`)
+
+Value: `2`
+
+
+
+### `SYN_CNT` (`number`)
+
+Value: `16`
+
+
+
+### `SYN_CONFIG` (`number`)
+
+Value: `1`
+
+
+
+### `SYN_DROPPED` (`number`)
+
+Value: `3`
+
+
+
+### `SYN_MAX` (`number`)
+
+Value: `15`
+
+
+
+### `SYN_MT_REPORT` (`number`)
+
+Value: `2`
+
+
+
+### `SYN_REPORT` (`number`)
+
+Value: `0`
diff --git a/docs/evdev.md b/docs/evdev.md
new file mode 100644
index 0000000..7463721
--- /dev/null
+++ b/docs/evdev.md
@@ -0,0 +1,8 @@
+---
+description:
+ "Lua bindings for Linux evdev devices and /dev/uinput virtual devices."
+---
+
+# `evdev`
+
+Lua bindings for Linux evdev devices and /dev/uinput virtual devices.
diff --git a/docs/events.md b/docs/events.md
new file mode 100644
index 0000000..14dadec
--- /dev/null
+++ b/docs/events.md
@@ -0,0 +1,177 @@
+---
+description: "Event value constants and event predicates."
+---
+
+# `events`
+
+Event value constants and event predicates.
+
+```lua
+local e = {
+ type = evdev.ecodes.EV_KEY,
+ value = evdev.events.RELEASE
+}
+
+print(evdev.events.is_release(e)) --> true
+print(evdev.events.is_press(e)) --> false
+print(evdev.events.is_repeat(e)) --> false
+```
+
+## Functions
+
+| Function | Description |
+| ------------------------------------- | ------------------------------------------------ |
+| [`is_abs(event)`](#fn-is-abs) | Return whether an event has type `EV_ABS`. |
+| [`is_key(event)`](#fn-is-key) | Return whether an event has type `EV_KEY`. |
+| [`is_press(event)`](#fn-is-press) | Return whether an event is a key/button press. |
+| [`is_rel(event)`](#fn-is-rel) | Return whether an event has type `EV_REL`. |
+| [`is_release(event)`](#fn-is-release) | Return whether an event is a key/button release. |
+| [`is_repeat(event)`](#fn-is-repeat) | Return whether an event is a key repeat. |
+| [`is_syn(event)`](#fn-is-syn) | Return whether an event has type `EV_SYN`. |
+
+
+
+### `is_abs(event)`
+
+Return whether an event has type `EV_ABS`.
+
+**Parameters**:
+
+- `event` (`evdev.event`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local e = { type = evdev.ecodes.EV_ABS }
+print(evdev.events.is_abs(e)) --> true
+```
+
+
+
+### `is_key(event)`
+
+Return whether an event has type `EV_KEY`.
+
+**Parameters**:
+
+- `event` (`evdev.event`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local e = { type = evdev.ecodes.EV_KEY }
+print(evdev.events.is_key(e)) --> true
+```
+
+
+
+### `is_press(event)`
+
+Return whether an event is a key/button press.
+
+**Parameters**:
+
+- `event` (`evdev.event`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local e = { type = evdev.ecodes.EV_KEY, value = evdev.events.PRESS }
+print(evdev.events.is_press(e)) --> true
+```
+
+
+
+### `is_rel(event)`
+
+Return whether an event has type `EV_REL`.
+
+**Parameters**:
+
+- `event` (`evdev.event`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local e = { type = evdev.ecodes.EV_REL }
+print(evdev.events.is_rel(e)) --> true
+```
+
+
+
+### `is_release(event)`
+
+Return whether an event is a key/button release.
+
+**Parameters**:
+
+- `event` (`evdev.event`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local e = { type = evdev.ecodes.EV_KEY, value = evdev.events.RELEASE }
+print(evdev.events.is_release(e)) --> true
+```
+
+
+
+### `is_repeat(event)`
+
+Return whether an event is a key repeat.
+
+**Parameters**:
+
+- `event` (`evdev.event`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local e = { type = evdev.ecodes.EV_KEY, value = evdev.events.REPEAT }
+print(evdev.events.is_repeat(e)) --> true
+```
+
+
+
+### `is_syn(event)`
+
+Return whether an event has type `EV_SYN`.
+
+**Parameters**:
+
+- `event` (`evdev.event`)
+
+**Return**:
+
+- **value** (`boolean`)
+
+**Example**:
+
+```lua
+local e = { type = evdev.ecodes.EV_SYN }
+print(evdev.events.is_syn(e)) --> true
+```
diff --git a/docs/selector.md b/docs/selector.md
new file mode 100644
index 0000000..44d6698
--- /dev/null
+++ b/docs/selector.md
@@ -0,0 +1,172 @@
+---
+description: "Selector for polling and reading from multiple devices."
+---
+
+# `selector`
+
+Selector for polling and reading from multiple devices.
+
+## Functions
+
+| Function | Description |
+| ------------------------------ | -------------------------------------------------------------- |
+| [`add(device)`](#fn-add) | Add a device to this selector. |
+| [`clear()`](#fn-clear) | Remove all devices from this selector. |
+| [`events()`](#fn-events) | Return an iterator that yields events from registered devices. |
+| [`new(devices?)`](#fn-new) | Create a selector from an optional list of devices. |
+| [`poll()`](#fn-poll) | Wait until at least one registered device has input available. |
+| [`remove(device)`](#fn-remove) | Remove a device from this selector. |
+
+
+
+### `add(device)`
+
+Add a device to this selector.
+
+**Parameters**:
+
+- `device` (`evdev.Device`)
+
+**Return**:
+
+- **value** (`self`)
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local Selector = evdev.selector.new
+
+local kb1 = assert(Device("/dev/input/event5"))
+local kb2 = assert(Device("/dev/input/event10"))
+local sel = Selector({ kb1 })
+
+sel:add(kb2)
+```
+
+
+
+### `clear()`
+
+Remove all devices from this selector.
+
+**Return**:
+
+- **value** (`self`)
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local Selector = evdev.selector.new
+
+local kb1 = assert(Device("/dev/input/event5"))
+local kb2 = assert(Device("/dev/input/event10"))
+local sel = Selector({ kb1, kb2 })
+
+sel:clear()
+```
+
+
+
+### `events()`
+
+Return an iterator that yields events from registered devices.
+
+**Return**:
+
+- `evdev.Device?,` (`fun():`): evdev.event?
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local Selector = evdev.selector.new
+
+local kb1 = assert(Device("/dev/input/event5"))
+local kb2 = assert(Device("/dev/input/event10"))
+local sel = Selector({ kb1, kb2 })
+
+for dev, e in sel:events() do
+ print(dev.name, e.code, e.value)
+end
+```
+
+
+
+### `new(devices?)`
+
+Create a selector from an optional list of devices.
+
+**Parameters**:
+
+- `devices?` (`evdev.Device[]`)
+
+**Return**:
+
+- **value** (`evdev.Selector`)
+
+**Example**:
+
+```lua
+local evdev = require "evdev"
+local Device = evdev.device.open
+local Selector = evdev.selector.new
+
+local kb1 = assert(Device("/dev/input/event5"))
+local kb2 = assert(Device("/dev/input/event10"))
+local sel = Selector({ kb1, kb2 })
+```
+
+
+
+### `poll()`
+
+Wait until at least one registered device has input available.
+
+**Return**:
+
+- `devs` (`evdev.Device[]?`)
+- `err` (`string?`)
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local Selector = evdev.selector.new
+
+local kb1 = assert(Device("/dev/input/event5"))
+local kb2 = assert(Device("/dev/input/event10"))
+local sel = Selector({ kb1, kb2 })
+
+for _, dev in ipairs(assert(sel:poll())) do
+ print(dev)
+end
+```
+
+
+
+### `remove(device)`
+
+Remove a device from this selector.
+
+**Parameters**:
+
+- `device` (`evdev.Device`)
+
+**Return**:
+
+- **value** (`self`)
+
+**Example**:
+
+```lua
+local Device = evdev.device.open
+local Selector = evdev.selector.new
+
+local kb1 = assert(Device("/dev/input/event5"))
+local kb2 = assert(Device("/dev/input/event10"))
+local sel = Selector({ kb1, kb2 })
+
+sel:remove(kb2)
+```
diff --git a/docs/uinput.md b/docs/uinput.md
new file mode 100644
index 0000000..5198ccb
--- /dev/null
+++ b/docs/uinput.md
@@ -0,0 +1,151 @@
+---
+description: "Configuration used to create a `/dev/uinput` virtual device."
+---
+
+# `uinput`
+
+Configuration used to create a `/dev/uinput` virtual device.
+
+## Functions
+
+| Function | Description |
+| ------------------------------------- | ------------------------------------------------ |
+| [`close()`](#fn-close) | Destroy and close the virtual device. |
+| [`create(spec?)`](#fn-create) | Create a virtual input device. |
+| [`emit(type, code, value)`](#fn-emit) | Emit one raw input event. |
+| [`is_open()`](#fn-is-open) | Return whether the virtual device is still open. |
+| [`sync()`](#fn-sync) | Emit a `SYN_REPORT` event. |
+
+
+
+### `close()`
+
+Destroy and close the virtual device.
+
+**Return**:
+
+- `ok` (`boolean`): `true` when the virtual device closes successfully.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local UInput = evdev.uinput.create
+local ui = assert(UInput())
+ui:close()
+```
+
+
+
+### `create(spec?)`
+
+Create a virtual input device.
+
+**Parameters**:
+
+- `spec?` (`evdev.uinputSpec`): Virtual device configuration.
+
+**Return**:
+
+- `dev` (`evdev.UInput?`): Open virtual device.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local UInput = evdev.uinput.create
+local ui = assert(UInput())
+
+-- Give the system a moment to notice the new virtual device.
+-- Replace this with your preferred sleep helper.
+os.execute("sleep 0.5")
+
+ui:emit(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_A, 1)
+ui:emit(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_A, 0)
+ui:sync()
+
+print(ui.path)
+```
+
+
+
+### `emit(type, code, value)`
+
+Emit one raw input event.
+
+**Parameters**:
+
+- `type` (`evdev.ecodes.ev`): Event type to emit.
+- `code` (`evdev.ecodes.key|evdev.ecodes.btn|evdev.ecodes.rel`): Event code
+ within the selected type.
+- `value` (`evdev.eventValue`): Event value to send.
+
+**Return**:
+
+- `ok` (`true?`): `true` when the event is emitted successfully.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local UInput = evdev.uinput.create
+local ui = assert(UInput())
+
+-- Give the system a moment to notice the new virtual device.
+-- Replace this with your preferred sleep helper.
+os.execute("sleep 0.5")
+
+local EV_KEY = evdev.ecodes.EV_KEY
+ui:emit(EV_KEY, evdev.ecodes.KEY_A, 1)
+ui:emit(EV_KEY, evdev.ecodes.KEY_A, 0)
+ui:sync()
+
+local EV_REL = evdev.ecodes.EV_REL
+ui:emit(EV_REL, evdev.ecodes.REL_X, 20)
+ui:emit(EV_REL, evdev.ecodes.REL_Y, 10)
+ui:sync()
+```
+
+
+
+### `is_open()`
+
+Return whether the virtual device is still open.
+
+**Return**:
+
+- `is_open` (`boolean`): `true` when the virtual device is still open.
+
+**Example**:
+
+```lua
+local UInput = evdev.uinput.create
+local ui = assert(UInput())
+
+if ui:is_open() then
+ ui:close()
+end
+```
+
+
+
+### `sync()`
+
+Emit a `SYN_REPORT` event.
+
+Flush queued input events as one frame.
+
+**Return**:
+
+- `ok` (`true?`): `true` when `SYN_REPORT` is emitted successfully.
+- `err` (`string?`): Error message on failure.
+
+**Example**:
+
+```lua
+local UInput = evdev.uinput.create
+local ui = assert(UInput())
+
+ui:emit(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_LEFTSHIFT, 0)
+ui:sync()
+```