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() +```