Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 4 Sep 2025 21:08:06 GMT
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: aef807876c30 - main - moused(8): Add support for evdev protocol
Message-ID:  <202509042108.584L86Ro060944@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=aef807876c305587c60f73e2cd914115d22a53fd

commit aef807876c305587c60f73e2cd914115d22a53fd
Author:     Vladimir Kondratyev <wulf@FreeBSD.org>
AuthorDate: 2025-09-04 21:07:25 +0000
Commit:     Vladimir Kondratyev <wulf@FreeBSD.org>
CommitDate: 2025-09-04 21:07:25 +0000

    moused(8): Add support for evdev protocol
    
    The new daemon have following properties as compared with previous
    incarnation:
    - evdev protocol support for mices and touchpads. Additionally to
      relative PS/2 and USB devices it enables console support for I2C/USB
      touchpads and bluetooth mices.
    - Other aged protocols like COM, raw PS/2 and X10 are dropped with only
      exception of sysmouse. For those who still use them there is an
      utility called msconvd(8).
    - single daemon per system where hotplug is processed via devd socket.
      Per device mode still supported too.
    - Configuration and quirks files in libinput-compatible format.
      Actually, the new moused config parser is taken from libinput.
    
    The moused(8) can work in 2 modes:
    1. Evdev support mode. It enables all previously mentioned devices.
       It is enabled by deault.
    2. Sysmouse support mode. All should work as before.
       No new devices supported. To enable it add following lines to
       /etc/rc.conf:
          moused_port="/dev/psm0"
          moused_nondefault_enable="YES"
       One may add hw.usb.usbhid.enable=0 to /boot/loader.conf to enable
       ums(4) driver which supports sysmouse protocol.
    
    Differential Revision:  https://reviews.freebsd.org/D52164
---
 libexec/rc/rc.conf                                 |    8 +-
 libexec/rc/rc.d/Makefile                           |    1 +
 libexec/rc/rc.d/msconvd                            |   61 +
 tools/build/mk/OptionalObsoleteFiles.inc           |    7 +
 usr.sbin/moused/Makefile                           |   12 +-
 usr.sbin/moused/Makefile.depend                    |   17 -
 usr.sbin/moused/moused/Makefile                    |   28 +
 usr.sbin/moused/moused/event-names.h               | 1656 ++++++++++
 usr.sbin/moused/moused/moused.8                    |  538 ++++
 usr.sbin/moused/moused/moused.c                    | 3205 ++++++++++++++++++++
 usr.sbin/moused/moused/moused.conf                 |   43 +
 usr.sbin/moused/moused/moused.conf.5               |  422 +++
 usr.sbin/moused/moused/quirks.c                    | 2033 +++++++++++++
 usr.sbin/moused/moused/quirks.h                    |  369 +++
 .../moused/moused/quirks/5-generic-touchpad.quirks |    9 +
 usr.sbin/moused/moused/util-evdev.c                |  173 ++
 usr.sbin/moused/moused/util-evdev.h                |   35 +
 usr.sbin/moused/moused/util-list.c                 |   86 +
 usr.sbin/moused/moused/util-list.h                 |  194 ++
 usr.sbin/moused/moused/util.c                      |  423 +++
 usr.sbin/moused/moused/util.h                      |  413 +++
 usr.sbin/moused/msconvd/Makefile                   |    8 +
 usr.sbin/moused/{moused.8 => msconvd/msconvd.8}    |  395 +--
 usr.sbin/moused/{moused.c => msconvd/msconvd.c}    | 1212 ++------
 24 files changed, 10008 insertions(+), 1340 deletions(-)

diff --git a/libexec/rc/rc.conf b/libexec/rc/rc.conf
index bfa46bd343a6..0ef3012892dd 100644
--- a/libexec/rc/rc.conf
+++ b/libexec/rc/rc.conf
@@ -586,15 +586,19 @@ font8x14="NO"		# font 8x14 from /usr/share/{syscons,vt}/fonts/* (or NO).
 font8x8="NO"		# font 8x8 from /usr/share/{syscons,vt}/fonts/* (or NO).
 blanktime="300"		# blank time (in seconds) or "NO" to turn it off.
 saver="NO"		# screen saver: Uses /boot/kernel/${saver}_saver.ko
-moused_nondefault_enable="YES" # Treat non-default mice as enabled unless
+moused_nondefault_enable="NO" # Treat non-default mice as enabled unless
 			       # specifically overridden in rc.conf(5).
 moused_enable="NO"	# Run the mouse daemon.
 moused_type="auto"	# See man page for rc.conf(5) for available settings.
-moused_port="/dev/psm0"	# Set to your mouse port.
+moused_port="auto"	# Set to your mouse port.
 moused_flags=""		# Any additional flags to moused.
 mousechar_start="NO"	# if 0xd0-0xd3 default range is occupied in your
 			# language code table, specify alternative range
 			# start like mousechar_start=3, see vidcontrol(1)
+msconvd_enable="NO"	# Run the mouse protocol conversion daemon.
+msconvd_type="auto"	# See rc.conf(5) man page for available moused_type-s.
+msconvd_ports=""	# List of msconvd ports.
+msconvd_flags=""	# Any additional flags to msconvd.
 allscreens_flags=""	# Set this vidcontrol mode for all virtual screens
 allscreens_kbdflags=""	# Set this kbdcontrol mode for all virtual screens
 
diff --git a/libexec/rc/rc.d/Makefile b/libexec/rc/rc.d/Makefile
index 7c1f50b027a9..e5ee34e62185 100644
--- a/libexec/rc/rc.d/Makefile
+++ b/libexec/rc/rc.d/Makefile
@@ -273,6 +273,7 @@ JAILPACKAGE=	jail
 .if ${MK_LEGACY_CONSOLE} != "no"
 CONFGROUPS+=	CONSOLE
 CONSOLE+=	moused
+CONSOLE+=	msconvd
 CONSOLE+=	syscons
 CONSOLEPACKAGE=	console-tools
 .endif
diff --git a/libexec/rc/rc.d/msconvd b/libexec/rc/rc.d/msconvd
new file mode 100755
index 000000000000..c2a96bf2eb68
--- /dev/null
+++ b/libexec/rc/rc.d/msconvd
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+#
+
+# PROVIDE: msconvd
+# REQUIRE: DAEMON FILESYSTEMS
+# KEYWORD: nojail shutdown
+
+. /etc/rc.subr
+
+name="msconvd"
+desc="Mouse protocol conversion daemon"
+command="/usr/sbin/${name}"
+start_cmd="msconvd_start"
+pidprefix="/var/run/msconvd"
+load_rc_config $name
+
+: ${msconvd_enable="NO"}
+: ${msconvd_type="auto"}
+
+# doesn't make sense to run in a svcj: nojail keyword
+# XXX: How does msconvd communiacte with the kernel?
+# XXX: Does the kernel prevent this communcation in jails?
+msconvd_svcj="NO"
+
+# Set the pid file and variable name. The second argument, if it exists, is
+# expected to be the mouse device.
+#
+if [ -n "$2" ]; then
+	eval msconvd_$2_enable=\${msconvd_$2_enable-${msconvd_enable}}
+	rcvar="msconvd_$2_enable"
+	pidfile="${pidprefix}.$2.pid"
+else
+	for ms in ${msconvd_ports}; do
+		/etc/rc.d/msconvd $1 ${ms}
+	done
+	exit 0
+fi
+
+msconvd_start()
+{
+	local ms myflags myport mytype
+
+	# Set the mouse device and get any related variables. If
+	# a msconvd device has been specified on the commandline, then
+	# rc.conf(5) variables defined for that device take precedence
+	# over the generic msconvd_* variables. The only exception is
+	# the msconvd_port variable, which if not defined sets it to
+	# the passed in device name.
+	#
+	ms=$1
+	eval myflags=\${msconvd_${ms}_flags-$msconvd_flags}
+	eval myport=\${msconvd_${ms}_port-/dev/${ms}}
+	eval mytype=\${msconvd_${ms}_type-$msconvd_type}
+
+	startmsg -n "Starting ${ms} ${name}"
+	${command} ${myflags} -p ${myport} -t ${mytype} -I ${pidfile}
+	startmsg '.'
+}
+
+run_rc_command $*
diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc
index 5eea402c4526..a2fb28f1a186 100644
--- a/tools/build/mk/OptionalObsoleteFiles.inc
+++ b/tools/build/mk/OptionalObsoleteFiles.inc
@@ -3793,11 +3793,14 @@ OLD_FILES+=usr/share/man/man1/host.1.gz
 .endif
 
 .if ${MK_LEGACY_CONSOLE} == no
+OLD_FILES+=etc/moused.conf
 OLD_FILES+=etc/rc.d/moused
+OLD_FILES+=etc/rc.d/msconvd
 OLD_FILES+=etc/rc.d/syscons
 OLD_FILES+=usr/sbin/kbdcontrol
 OLD_FILES+=usr/sbin/kbdmap
 OLD_FILES+=usr/sbin/moused
+OLD_FILES+=usr/sbin/msconvd
 OLD_FILES+=usr/sbin/vidcontrol
 OLD_FILES+=usr/sbin/vidfont
 OLD_FILES+=usr/share/man/man1/kbdcontrol.1.gz
@@ -3806,7 +3809,11 @@ OLD_FILES+=usr/share/man/man1/vidcontrol.1.gz
 OLD_FILES+=usr/share/man/man1/vidfont.1.gz
 OLD_FILES+=usr/share/man/man5/kbdmap.5.gz
 OLD_FILES+=usr/share/man/man5/keymap.5.gz
+OLD_FILES+=usr/share/man/man5/moused.conf.5.gz
 OLD_FILES+=usr/share/man/man8/moused.8.gz
+OLD_FILES+=usr/share/man/man8/msconvd.8.gz
+OLD_FILES+=usr/share/moused/5-generic-touchpad.quirks
+OLD_DIRS+=usr/share/moused
 .endif
 
 .for LIBCOMPAT libcompat in ${_ALL_LIBCOMPATS_libcompats}
diff --git a/usr.sbin/moused/Makefile b/usr.sbin/moused/Makefile
index 2a7aa0484542..b6319b6fef20 100644
--- a/usr.sbin/moused/Makefile
+++ b/usr.sbin/moused/Makefile
@@ -1,10 +1,4 @@
-PACKAGE=	console-tools
-PROG=	moused
-MAN=	moused.8
+SUBDIR+=moused
+SUBDIR+=msconvd
 
-LIBADD=	m util
-
-#BINMODE=4555
-#PRECIOUSPROG=
-
-.include <bsd.prog.mk>
+.include <bsd.subdir.mk>
diff --git a/usr.sbin/moused/Makefile.depend b/usr.sbin/moused/Makefile.depend
deleted file mode 100644
index af3b7054df7a..000000000000
--- a/usr.sbin/moused/Makefile.depend
+++ /dev/null
@@ -1,17 +0,0 @@
-# Autogenerated - do NOT edit!
-
-DIRDEPS = \
-	include \
-	include/xlocale \
-	lib/${CSU_DIR} \
-	lib/libc \
-	lib/libcompiler_rt \
-	lib/libutil \
-	lib/msun \
-
-
-.include <dirdeps.mk>
-
-.if ${DEP_RELDIR} == ${_DEP_RELDIR}
-# local dependencies - needed for -jN in clean tree
-.endif
diff --git a/usr.sbin/moused/moused/Makefile b/usr.sbin/moused/moused/Makefile
new file mode 100644
index 000000000000..8479764b710b
--- /dev/null
+++ b/usr.sbin/moused/moused/Makefile
@@ -0,0 +1,28 @@
+PACKAGE=	console-tools
+PROG=		moused
+
+SRCS=		moused.c \
+		event-names.h \
+		quirks.c \
+		quirks.h \
+		util.c \
+		util.h \
+		util-evdev.c \
+		util-evdev.h \
+		util-list.c \
+		util-list.h
+MAN=		moused.8 \
+		moused.conf.5
+CONFS=		moused.conf
+QUIRKS=		5-generic-touchpad.quirks
+
+CWARNFLAGS.quirks.c+=	-Wno-cast-align -Wno-shadow -Wno-cast-qual \
+			-Wno-unused-variable -Wno-unused-parameter
+CWARNFLAGS.util.c+=	-Wno-shadow
+LIBADD=		m util
+BINDIR=		/usr/sbin
+
+FILES=		${QUIRKS:S|^|quirks/|}
+FILESDIR=	/usr/share/${PROG}
+
+.include <bsd.prog.mk>
diff --git a/usr.sbin/moused/moused/event-names.h b/usr.sbin/moused/moused/event-names.h
new file mode 100644
index 000000000000..05093a1d0db3
--- /dev/null
+++ b/usr.sbin/moused/moused/event-names.h
@@ -0,0 +1,1656 @@
+/* THIS FILE IS GENERATED, DO NOT EDIT */
+
+#ifndef EVENT_NAMES_H
+#define EVENT_NAMES_H
+
+static const char * const ev_map[EV_MAX + 1] = {
+    [EV_SYN] = "EV_SYN",
+    [EV_KEY] = "EV_KEY",
+    [EV_REL] = "EV_REL",
+    [EV_ABS] = "EV_ABS",
+    [EV_MSC] = "EV_MSC",
+    [EV_SW] = "EV_SW",
+    [EV_LED] = "EV_LED",
+    [EV_SND] = "EV_SND",
+    [EV_REP] = "EV_REP",
+    [EV_FF] = "EV_FF",
+    [EV_PWR] = "EV_PWR",
+    [EV_FF_STATUS] = "EV_FF_STATUS",
+    [EV_MAX] = "EV_MAX",
+};
+
+static const char * const rel_map[REL_MAX + 1] = {
+    [REL_X] = "REL_X",
+    [REL_Y] = "REL_Y",
+    [REL_Z] = "REL_Z",
+    [REL_RX] = "REL_RX",
+    [REL_RY] = "REL_RY",
+    [REL_RZ] = "REL_RZ",
+    [REL_HWHEEL] = "REL_HWHEEL",
+    [REL_DIAL] = "REL_DIAL",
+    [REL_WHEEL] = "REL_WHEEL",
+    [REL_MISC] = "REL_MISC",
+    [REL_RESERVED] = "REL_RESERVED",
+    [REL_WHEEL_HI_RES] = "REL_WHEEL_HI_RES",
+    [REL_HWHEEL_HI_RES] = "REL_HWHEEL_HI_RES",
+    [REL_MAX] = "REL_MAX",
+};
+
+static const char * const abs_map[ABS_MAX + 1] = {
+    [ABS_X] = "ABS_X",
+    [ABS_Y] = "ABS_Y",
+    [ABS_Z] = "ABS_Z",
+    [ABS_RX] = "ABS_RX",
+    [ABS_RY] = "ABS_RY",
+    [ABS_RZ] = "ABS_RZ",
+    [ABS_THROTTLE] = "ABS_THROTTLE",
+    [ABS_RUDDER] = "ABS_RUDDER",
+    [ABS_WHEEL] = "ABS_WHEEL",
+    [ABS_GAS] = "ABS_GAS",
+    [ABS_BRAKE] = "ABS_BRAKE",
+    [ABS_HAT0X] = "ABS_HAT0X",
+    [ABS_HAT0Y] = "ABS_HAT0Y",
+    [ABS_HAT1X] = "ABS_HAT1X",
+    [ABS_HAT1Y] = "ABS_HAT1Y",
+    [ABS_HAT2X] = "ABS_HAT2X",
+    [ABS_HAT2Y] = "ABS_HAT2Y",
+    [ABS_HAT3X] = "ABS_HAT3X",
+    [ABS_HAT3Y] = "ABS_HAT3Y",
+    [ABS_PRESSURE] = "ABS_PRESSURE",
+    [ABS_DISTANCE] = "ABS_DISTANCE",
+    [ABS_TILT_X] = "ABS_TILT_X",
+    [ABS_TILT_Y] = "ABS_TILT_Y",
+    [ABS_TOOL_WIDTH] = "ABS_TOOL_WIDTH",
+    [ABS_VOLUME] = "ABS_VOLUME",
+    // [ABS_PROFILE] = "ABS_PROFILE",
+    [ABS_MISC] = "ABS_MISC",
+    [ABS_RESERVED] = "ABS_RESERVED",
+    [ABS_MT_SLOT] = "ABS_MT_SLOT",
+    [ABS_MT_TOUCH_MAJOR] = "ABS_MT_TOUCH_MAJOR",
+    [ABS_MT_TOUCH_MINOR] = "ABS_MT_TOUCH_MINOR",
+    [ABS_MT_WIDTH_MAJOR] = "ABS_MT_WIDTH_MAJOR",
+    [ABS_MT_WIDTH_MINOR] = "ABS_MT_WIDTH_MINOR",
+    [ABS_MT_ORIENTATION] = "ABS_MT_ORIENTATION",
+    [ABS_MT_POSITION_X] = "ABS_MT_POSITION_X",
+    [ABS_MT_POSITION_Y] = "ABS_MT_POSITION_Y",
+    [ABS_MT_TOOL_TYPE] = "ABS_MT_TOOL_TYPE",
+    [ABS_MT_BLOB_ID] = "ABS_MT_BLOB_ID",
+    [ABS_MT_TRACKING_ID] = "ABS_MT_TRACKING_ID",
+    [ABS_MT_PRESSURE] = "ABS_MT_PRESSURE",
+    [ABS_MT_DISTANCE] = "ABS_MT_DISTANCE",
+    [ABS_MT_TOOL_X] = "ABS_MT_TOOL_X",
+    [ABS_MT_TOOL_Y] = "ABS_MT_TOOL_Y",
+    [ABS_MAX] = "ABS_MAX",
+};
+
+static const char * const key_map[KEY_MAX + 1] = {
+    [KEY_RESERVED] = "KEY_RESERVED",
+    [KEY_ESC] = "KEY_ESC",
+    [KEY_1] = "KEY_1",
+    [KEY_2] = "KEY_2",
+    [KEY_3] = "KEY_3",
+    [KEY_4] = "KEY_4",
+    [KEY_5] = "KEY_5",
+    [KEY_6] = "KEY_6",
+    [KEY_7] = "KEY_7",
+    [KEY_8] = "KEY_8",
+    [KEY_9] = "KEY_9",
+    [KEY_0] = "KEY_0",
+    [KEY_MINUS] = "KEY_MINUS",
+    [KEY_EQUAL] = "KEY_EQUAL",
+    [KEY_BACKSPACE] = "KEY_BACKSPACE",
+    [KEY_TAB] = "KEY_TAB",
+    [KEY_Q] = "KEY_Q",
+    [KEY_W] = "KEY_W",
+    [KEY_E] = "KEY_E",
+    [KEY_R] = "KEY_R",
+    [KEY_T] = "KEY_T",
+    [KEY_Y] = "KEY_Y",
+    [KEY_U] = "KEY_U",
+    [KEY_I] = "KEY_I",
+    [KEY_O] = "KEY_O",
+    [KEY_P] = "KEY_P",
+    [KEY_LEFTBRACE] = "KEY_LEFTBRACE",
+    [KEY_RIGHTBRACE] = "KEY_RIGHTBRACE",
+    [KEY_ENTER] = "KEY_ENTER",
+    [KEY_LEFTCTRL] = "KEY_LEFTCTRL",
+    [KEY_A] = "KEY_A",
+    [KEY_S] = "KEY_S",
+    [KEY_D] = "KEY_D",
+    [KEY_F] = "KEY_F",
+    [KEY_G] = "KEY_G",
+    [KEY_H] = "KEY_H",
+    [KEY_J] = "KEY_J",
+    [KEY_K] = "KEY_K",
+    [KEY_L] = "KEY_L",
+    [KEY_SEMICOLON] = "KEY_SEMICOLON",
+    [KEY_APOSTROPHE] = "KEY_APOSTROPHE",
+    [KEY_GRAVE] = "KEY_GRAVE",
+    [KEY_LEFTSHIFT] = "KEY_LEFTSHIFT",
+    [KEY_BACKSLASH] = "KEY_BACKSLASH",
+    [KEY_Z] = "KEY_Z",
+    [KEY_X] = "KEY_X",
+    [KEY_C] = "KEY_C",
+    [KEY_V] = "KEY_V",
+    [KEY_B] = "KEY_B",
+    [KEY_N] = "KEY_N",
+    [KEY_M] = "KEY_M",
+    [KEY_COMMA] = "KEY_COMMA",
+    [KEY_DOT] = "KEY_DOT",
+    [KEY_SLASH] = "KEY_SLASH",
+    [KEY_RIGHTSHIFT] = "KEY_RIGHTSHIFT",
+    [KEY_KPASTERISK] = "KEY_KPASTERISK",
+    [KEY_LEFTALT] = "KEY_LEFTALT",
+    [KEY_SPACE] = "KEY_SPACE",
+    [KEY_CAPSLOCK] = "KEY_CAPSLOCK",
+    [KEY_F1] = "KEY_F1",
+    [KEY_F2] = "KEY_F2",
+    [KEY_F3] = "KEY_F3",
+    [KEY_F4] = "KEY_F4",
+    [KEY_F5] = "KEY_F5",
+    [KEY_F6] = "KEY_F6",
+    [KEY_F7] = "KEY_F7",
+    [KEY_F8] = "KEY_F8",
+    [KEY_F9] = "KEY_F9",
+    [KEY_F10] = "KEY_F10",
+    [KEY_NUMLOCK] = "KEY_NUMLOCK",
+    [KEY_SCROLLLOCK] = "KEY_SCROLLLOCK",
+    [KEY_KP7] = "KEY_KP7",
+    [KEY_KP8] = "KEY_KP8",
+    [KEY_KP9] = "KEY_KP9",
+    [KEY_KPMINUS] = "KEY_KPMINUS",
+    [KEY_KP4] = "KEY_KP4",
+    [KEY_KP5] = "KEY_KP5",
+    [KEY_KP6] = "KEY_KP6",
+    [KEY_KPPLUS] = "KEY_KPPLUS",
+    [KEY_KP1] = "KEY_KP1",
+    [KEY_KP2] = "KEY_KP2",
+    [KEY_KP3] = "KEY_KP3",
+    [KEY_KP0] = "KEY_KP0",
+    [KEY_KPDOT] = "KEY_KPDOT",
+    [KEY_ZENKAKUHANKAKU] = "KEY_ZENKAKUHANKAKU",
+    [KEY_102ND] = "KEY_102ND",
+    [KEY_F11] = "KEY_F11",
+    [KEY_F12] = "KEY_F12",
+    [KEY_RO] = "KEY_RO",
+    [KEY_KATAKANA] = "KEY_KATAKANA",
+    [KEY_HIRAGANA] = "KEY_HIRAGANA",
+    [KEY_HENKAN] = "KEY_HENKAN",
+    [KEY_KATAKANAHIRAGANA] = "KEY_KATAKANAHIRAGANA",
+    [KEY_MUHENKAN] = "KEY_MUHENKAN",
+    [KEY_KPJPCOMMA] = "KEY_KPJPCOMMA",
+    [KEY_KPENTER] = "KEY_KPENTER",
+    [KEY_RIGHTCTRL] = "KEY_RIGHTCTRL",
+    [KEY_KPSLASH] = "KEY_KPSLASH",
+    [KEY_SYSRQ] = "KEY_SYSRQ",
+    [KEY_RIGHTALT] = "KEY_RIGHTALT",
+    [KEY_LINEFEED] = "KEY_LINEFEED",
+    [KEY_HOME] = "KEY_HOME",
+    [KEY_UP] = "KEY_UP",
+    [KEY_PAGEUP] = "KEY_PAGEUP",
+    [KEY_LEFT] = "KEY_LEFT",
+    [KEY_RIGHT] = "KEY_RIGHT",
+    [KEY_END] = "KEY_END",
+    [KEY_DOWN] = "KEY_DOWN",
+    [KEY_PAGEDOWN] = "KEY_PAGEDOWN",
+    [KEY_INSERT] = "KEY_INSERT",
+    [KEY_DELETE] = "KEY_DELETE",
+    [KEY_MACRO] = "KEY_MACRO",
+    [KEY_MUTE] = "KEY_MUTE",
+    [KEY_VOLUMEDOWN] = "KEY_VOLUMEDOWN",
+    [KEY_VOLUMEUP] = "KEY_VOLUMEUP",
+    [KEY_POWER] = "KEY_POWER",
+    [KEY_KPEQUAL] = "KEY_KPEQUAL",
+    [KEY_KPPLUSMINUS] = "KEY_KPPLUSMINUS",
+    [KEY_PAUSE] = "KEY_PAUSE",
+    [KEY_SCALE] = "KEY_SCALE",
+    [KEY_KPCOMMA] = "KEY_KPCOMMA",
+    [KEY_HANGEUL] = "KEY_HANGEUL",
+    [KEY_HANJA] = "KEY_HANJA",
+    [KEY_YEN] = "KEY_YEN",
+    [KEY_LEFTMETA] = "KEY_LEFTMETA",
+    [KEY_RIGHTMETA] = "KEY_RIGHTMETA",
+    [KEY_COMPOSE] = "KEY_COMPOSE",
+    [KEY_STOP] = "KEY_STOP",
+    [KEY_AGAIN] = "KEY_AGAIN",
+    [KEY_PROPS] = "KEY_PROPS",
+    [KEY_UNDO] = "KEY_UNDO",
+    [KEY_FRONT] = "KEY_FRONT",
+    [KEY_COPY] = "KEY_COPY",
+    [KEY_OPEN] = "KEY_OPEN",
+    [KEY_PASTE] = "KEY_PASTE",
+    [KEY_FIND] = "KEY_FIND",
+    [KEY_CUT] = "KEY_CUT",
+    [KEY_HELP] = "KEY_HELP",
+    [KEY_MENU] = "KEY_MENU",
+    [KEY_CALC] = "KEY_CALC",
+    [KEY_SETUP] = "KEY_SETUP",
+    [KEY_SLEEP] = "KEY_SLEEP",
+    [KEY_WAKEUP] = "KEY_WAKEUP",
+    [KEY_FILE] = "KEY_FILE",
+    [KEY_SENDFILE] = "KEY_SENDFILE",
+    [KEY_DELETEFILE] = "KEY_DELETEFILE",
+    [KEY_XFER] = "KEY_XFER",
+    [KEY_PROG1] = "KEY_PROG1",
+    [KEY_PROG2] = "KEY_PROG2",
+    [KEY_WWW] = "KEY_WWW",
+    [KEY_MSDOS] = "KEY_MSDOS",
+    [KEY_COFFEE] = "KEY_COFFEE",
+    [KEY_ROTATE_DISPLAY] = "KEY_ROTATE_DISPLAY",
+    [KEY_CYCLEWINDOWS] = "KEY_CYCLEWINDOWS",
+    [KEY_MAIL] = "KEY_MAIL",
+    [KEY_BOOKMARKS] = "KEY_BOOKMARKS",
+    [KEY_COMPUTER] = "KEY_COMPUTER",
+    [KEY_BACK] = "KEY_BACK",
+    [KEY_FORWARD] = "KEY_FORWARD",
+    [KEY_CLOSECD] = "KEY_CLOSECD",
+    [KEY_EJECTCD] = "KEY_EJECTCD",
+    [KEY_EJECTCLOSECD] = "KEY_EJECTCLOSECD",
+    [KEY_NEXTSONG] = "KEY_NEXTSONG",
+    [KEY_PLAYPAUSE] = "KEY_PLAYPAUSE",
+    [KEY_PREVIOUSSONG] = "KEY_PREVIOUSSONG",
+    [KEY_STOPCD] = "KEY_STOPCD",
+    [KEY_RECORD] = "KEY_RECORD",
+    [KEY_REWIND] = "KEY_REWIND",
+    [KEY_PHONE] = "KEY_PHONE",
+    [KEY_ISO] = "KEY_ISO",
+    [KEY_CONFIG] = "KEY_CONFIG",
+    [KEY_HOMEPAGE] = "KEY_HOMEPAGE",
+    [KEY_REFRESH] = "KEY_REFRESH",
+    [KEY_EXIT] = "KEY_EXIT",
+    [KEY_MOVE] = "KEY_MOVE",
+    [KEY_EDIT] = "KEY_EDIT",
+    [KEY_SCROLLUP] = "KEY_SCROLLUP",
+    [KEY_SCROLLDOWN] = "KEY_SCROLLDOWN",
+    [KEY_KPLEFTPAREN] = "KEY_KPLEFTPAREN",
+    [KEY_KPRIGHTPAREN] = "KEY_KPRIGHTPAREN",
+    [KEY_NEW] = "KEY_NEW",
+    [KEY_REDO] = "KEY_REDO",
+    [KEY_F13] = "KEY_F13",
+    [KEY_F14] = "KEY_F14",
+    [KEY_F15] = "KEY_F15",
+    [KEY_F16] = "KEY_F16",
+    [KEY_F17] = "KEY_F17",
+    [KEY_F18] = "KEY_F18",
+    [KEY_F19] = "KEY_F19",
+    [KEY_F20] = "KEY_F20",
+    [KEY_F21] = "KEY_F21",
+    [KEY_F22] = "KEY_F22",
+    [KEY_F23] = "KEY_F23",
+    [KEY_F24] = "KEY_F24",
+    [KEY_PLAYCD] = "KEY_PLAYCD",
+    [KEY_PAUSECD] = "KEY_PAUSECD",
+    [KEY_PROG3] = "KEY_PROG3",
+    [KEY_PROG4] = "KEY_PROG4",
+    // [KEY_ALL_APPLICATIONS] = "KEY_ALL_APPLICATIONS",
+    [KEY_SUSPEND] = "KEY_SUSPEND",
+    [KEY_CLOSE] = "KEY_CLOSE",
+    [KEY_PLAY] = "KEY_PLAY",
+    [KEY_FASTFORWARD] = "KEY_FASTFORWARD",
+    [KEY_BASSBOOST] = "KEY_BASSBOOST",
+    [KEY_PRINT] = "KEY_PRINT",
+    [KEY_HP] = "KEY_HP",
+    [KEY_CAMERA] = "KEY_CAMERA",
+    [KEY_SOUND] = "KEY_SOUND",
+    [KEY_QUESTION] = "KEY_QUESTION",
+    [KEY_EMAIL] = "KEY_EMAIL",
+    [KEY_CHAT] = "KEY_CHAT",
+    [KEY_SEARCH] = "KEY_SEARCH",
+    [KEY_CONNECT] = "KEY_CONNECT",
+    [KEY_FINANCE] = "KEY_FINANCE",
+    [KEY_SPORT] = "KEY_SPORT",
+    [KEY_SHOP] = "KEY_SHOP",
+    [KEY_ALTERASE] = "KEY_ALTERASE",
+    [KEY_CANCEL] = "KEY_CANCEL",
+    [KEY_BRIGHTNESSDOWN] = "KEY_BRIGHTNESSDOWN",
+    [KEY_BRIGHTNESSUP] = "KEY_BRIGHTNESSUP",
+    [KEY_MEDIA] = "KEY_MEDIA",
+    [KEY_SWITCHVIDEOMODE] = "KEY_SWITCHVIDEOMODE",
+    [KEY_KBDILLUMTOGGLE] = "KEY_KBDILLUMTOGGLE",
+    [KEY_KBDILLUMDOWN] = "KEY_KBDILLUMDOWN",
+    [KEY_KBDILLUMUP] = "KEY_KBDILLUMUP",
+    [KEY_SEND] = "KEY_SEND",
+    [KEY_REPLY] = "KEY_REPLY",
+    [KEY_FORWARDMAIL] = "KEY_FORWARDMAIL",
+    [KEY_SAVE] = "KEY_SAVE",
+    [KEY_DOCUMENTS] = "KEY_DOCUMENTS",
+    [KEY_BATTERY] = "KEY_BATTERY",
+    [KEY_BLUETOOTH] = "KEY_BLUETOOTH",
+    [KEY_WLAN] = "KEY_WLAN",
+    [KEY_UWB] = "KEY_UWB",
+    [KEY_UNKNOWN] = "KEY_UNKNOWN",
+    [KEY_VIDEO_NEXT] = "KEY_VIDEO_NEXT",
+    [KEY_VIDEO_PREV] = "KEY_VIDEO_PREV",
+    [KEY_BRIGHTNESS_CYCLE] = "KEY_BRIGHTNESS_CYCLE",
+    [KEY_BRIGHTNESS_AUTO] = "KEY_BRIGHTNESS_AUTO",
+    [KEY_DISPLAY_OFF] = "KEY_DISPLAY_OFF",
+    [KEY_WWAN] = "KEY_WWAN",
+    [KEY_RFKILL] = "KEY_RFKILL",
+    [KEY_MICMUTE] = "KEY_MICMUTE",
+    [KEY_OK] = "KEY_OK",
+    [KEY_SELECT] = "KEY_SELECT",
+    [KEY_GOTO] = "KEY_GOTO",
+    [KEY_CLEAR] = "KEY_CLEAR",
+    [KEY_POWER2] = "KEY_POWER2",
+    [KEY_OPTION] = "KEY_OPTION",
+    [KEY_INFO] = "KEY_INFO",
+    [KEY_TIME] = "KEY_TIME",
+    [KEY_VENDOR] = "KEY_VENDOR",
+    [KEY_ARCHIVE] = "KEY_ARCHIVE",
+    [KEY_PROGRAM] = "KEY_PROGRAM",
+    [KEY_CHANNEL] = "KEY_CHANNEL",
+    [KEY_FAVORITES] = "KEY_FAVORITES",
+    [KEY_EPG] = "KEY_EPG",
+    [KEY_PVR] = "KEY_PVR",
+    [KEY_MHP] = "KEY_MHP",
+    [KEY_LANGUAGE] = "KEY_LANGUAGE",
+    [KEY_TITLE] = "KEY_TITLE",
+    [KEY_SUBTITLE] = "KEY_SUBTITLE",
+    [KEY_ANGLE] = "KEY_ANGLE",
+    [KEY_FULL_SCREEN] = "KEY_FULL_SCREEN",
+    [KEY_MODE] = "KEY_MODE",
+    [KEY_KEYBOARD] = "KEY_KEYBOARD",
+    [KEY_ASPECT_RATIO] = "KEY_ASPECT_RATIO",
+    [KEY_PC] = "KEY_PC",
+    [KEY_TV] = "KEY_TV",
+    [KEY_TV2] = "KEY_TV2",
+    [KEY_VCR] = "KEY_VCR",
+    [KEY_VCR2] = "KEY_VCR2",
+    [KEY_SAT] = "KEY_SAT",
+    [KEY_SAT2] = "KEY_SAT2",
+    [KEY_CD] = "KEY_CD",
+    [KEY_TAPE] = "KEY_TAPE",
+    [KEY_RADIO] = "KEY_RADIO",
+    [KEY_TUNER] = "KEY_TUNER",
+    [KEY_PLAYER] = "KEY_PLAYER",
+    [KEY_TEXT] = "KEY_TEXT",
+    [KEY_DVD] = "KEY_DVD",
+    [KEY_AUX] = "KEY_AUX",
+    [KEY_MP3] = "KEY_MP3",
+    [KEY_AUDIO] = "KEY_AUDIO",
+    [KEY_VIDEO] = "KEY_VIDEO",
+    [KEY_DIRECTORY] = "KEY_DIRECTORY",
+    [KEY_LIST] = "KEY_LIST",
+    [KEY_MEMO] = "KEY_MEMO",
+    [KEY_CALENDAR] = "KEY_CALENDAR",
+    [KEY_RED] = "KEY_RED",
+    [KEY_GREEN] = "KEY_GREEN",
+    [KEY_YELLOW] = "KEY_YELLOW",
+    [KEY_BLUE] = "KEY_BLUE",
+    [KEY_CHANNELUP] = "KEY_CHANNELUP",
+    [KEY_CHANNELDOWN] = "KEY_CHANNELDOWN",
+    [KEY_FIRST] = "KEY_FIRST",
+    [KEY_LAST] = "KEY_LAST",
+    [KEY_AB] = "KEY_AB",
+    [KEY_NEXT] = "KEY_NEXT",
+    [KEY_RESTART] = "KEY_RESTART",
+    [KEY_SLOW] = "KEY_SLOW",
+    [KEY_SHUFFLE] = "KEY_SHUFFLE",
+    [KEY_BREAK] = "KEY_BREAK",
+    [KEY_PREVIOUS] = "KEY_PREVIOUS",
+    [KEY_DIGITS] = "KEY_DIGITS",
+    [KEY_TEEN] = "KEY_TEEN",
+    [KEY_TWEN] = "KEY_TWEN",
+    [KEY_VIDEOPHONE] = "KEY_VIDEOPHONE",
+    [KEY_GAMES] = "KEY_GAMES",
+    [KEY_ZOOMIN] = "KEY_ZOOMIN",
+    [KEY_ZOOMOUT] = "KEY_ZOOMOUT",
+    [KEY_ZOOMRESET] = "KEY_ZOOMRESET",
+    [KEY_WORDPROCESSOR] = "KEY_WORDPROCESSOR",
+    [KEY_EDITOR] = "KEY_EDITOR",
+    [KEY_SPREADSHEET] = "KEY_SPREADSHEET",
+    [KEY_GRAPHICSEDITOR] = "KEY_GRAPHICSEDITOR",
+    [KEY_PRESENTATION] = "KEY_PRESENTATION",
+    [KEY_DATABASE] = "KEY_DATABASE",
+    [KEY_NEWS] = "KEY_NEWS",
+    [KEY_VOICEMAIL] = "KEY_VOICEMAIL",
+    [KEY_ADDRESSBOOK] = "KEY_ADDRESSBOOK",
+    [KEY_MESSENGER] = "KEY_MESSENGER",
+    [KEY_DISPLAYTOGGLE] = "KEY_DISPLAYTOGGLE",
+    [KEY_SPELLCHECK] = "KEY_SPELLCHECK",
+    [KEY_LOGOFF] = "KEY_LOGOFF",
+    [KEY_DOLLAR] = "KEY_DOLLAR",
+    [KEY_EURO] = "KEY_EURO",
+    [KEY_FRAMEBACK] = "KEY_FRAMEBACK",
+    [KEY_FRAMEFORWARD] = "KEY_FRAMEFORWARD",
+    [KEY_CONTEXT_MENU] = "KEY_CONTEXT_MENU",
+    [KEY_MEDIA_REPEAT] = "KEY_MEDIA_REPEAT",
+    [KEY_10CHANNELSUP] = "KEY_10CHANNELSUP",
+    [KEY_10CHANNELSDOWN] = "KEY_10CHANNELSDOWN",
+    [KEY_IMAGES] = "KEY_IMAGES",
+    // [KEY_NOTIFICATION_CENTER] = "KEY_NOTIFICATION_CENTER",
+    // [KEY_PICKUP_PHONE] = "KEY_PICKUP_PHONE",
+    // [KEY_HANGUP_PHONE] = "KEY_HANGUP_PHONE",
+    [KEY_DEL_EOL] = "KEY_DEL_EOL",
+    [KEY_DEL_EOS] = "KEY_DEL_EOS",
+    [KEY_INS_LINE] = "KEY_INS_LINE",
+    [KEY_DEL_LINE] = "KEY_DEL_LINE",
+    [KEY_FN] = "KEY_FN",
+    [KEY_FN_ESC] = "KEY_FN_ESC",
+    [KEY_FN_F1] = "KEY_FN_F1",
+    [KEY_FN_F2] = "KEY_FN_F2",
+    [KEY_FN_F3] = "KEY_FN_F3",
+    [KEY_FN_F4] = "KEY_FN_F4",
+    [KEY_FN_F5] = "KEY_FN_F5",
+    [KEY_FN_F6] = "KEY_FN_F6",
+    [KEY_FN_F7] = "KEY_FN_F7",
+    [KEY_FN_F8] = "KEY_FN_F8",
+    [KEY_FN_F9] = "KEY_FN_F9",
+    [KEY_FN_F10] = "KEY_FN_F10",
+    [KEY_FN_F11] = "KEY_FN_F11",
+    [KEY_FN_F12] = "KEY_FN_F12",
+    [KEY_FN_1] = "KEY_FN_1",
+    [KEY_FN_2] = "KEY_FN_2",
+    [KEY_FN_D] = "KEY_FN_D",
+    [KEY_FN_E] = "KEY_FN_E",
+    [KEY_FN_F] = "KEY_FN_F",
+    [KEY_FN_S] = "KEY_FN_S",
+    [KEY_FN_B] = "KEY_FN_B",
+    // [KEY_FN_RIGHT_SHIFT] = "KEY_FN_RIGHT_SHIFT",
+    [KEY_BRL_DOT1] = "KEY_BRL_DOT1",
+    [KEY_BRL_DOT2] = "KEY_BRL_DOT2",
+    [KEY_BRL_DOT3] = "KEY_BRL_DOT3",
+    [KEY_BRL_DOT4] = "KEY_BRL_DOT4",
+    [KEY_BRL_DOT5] = "KEY_BRL_DOT5",
+    [KEY_BRL_DOT6] = "KEY_BRL_DOT6",
+    [KEY_BRL_DOT7] = "KEY_BRL_DOT7",
+    [KEY_BRL_DOT8] = "KEY_BRL_DOT8",
+    [KEY_BRL_DOT9] = "KEY_BRL_DOT9",
+    [KEY_BRL_DOT10] = "KEY_BRL_DOT10",
+    [KEY_NUMERIC_0] = "KEY_NUMERIC_0",
+    [KEY_NUMERIC_1] = "KEY_NUMERIC_1",
+    [KEY_NUMERIC_2] = "KEY_NUMERIC_2",
+    [KEY_NUMERIC_3] = "KEY_NUMERIC_3",
+    [KEY_NUMERIC_4] = "KEY_NUMERIC_4",
+    [KEY_NUMERIC_5] = "KEY_NUMERIC_5",
+    [KEY_NUMERIC_6] = "KEY_NUMERIC_6",
+    [KEY_NUMERIC_7] = "KEY_NUMERIC_7",
+    [KEY_NUMERIC_8] = "KEY_NUMERIC_8",
+    [KEY_NUMERIC_9] = "KEY_NUMERIC_9",
+    [KEY_NUMERIC_STAR] = "KEY_NUMERIC_STAR",
+    [KEY_NUMERIC_POUND] = "KEY_NUMERIC_POUND",
+    [KEY_NUMERIC_A] = "KEY_NUMERIC_A",
+    [KEY_NUMERIC_B] = "KEY_NUMERIC_B",
+    [KEY_NUMERIC_C] = "KEY_NUMERIC_C",
+    [KEY_NUMERIC_D] = "KEY_NUMERIC_D",
+    [KEY_CAMERA_FOCUS] = "KEY_CAMERA_FOCUS",
+    [KEY_WPS_BUTTON] = "KEY_WPS_BUTTON",
+    [KEY_TOUCHPAD_TOGGLE] = "KEY_TOUCHPAD_TOGGLE",
+    [KEY_TOUCHPAD_ON] = "KEY_TOUCHPAD_ON",
+    [KEY_TOUCHPAD_OFF] = "KEY_TOUCHPAD_OFF",
+    [KEY_CAMERA_ZOOMIN] = "KEY_CAMERA_ZOOMIN",
+    [KEY_CAMERA_ZOOMOUT] = "KEY_CAMERA_ZOOMOUT",
+    [KEY_CAMERA_UP] = "KEY_CAMERA_UP",
+    [KEY_CAMERA_DOWN] = "KEY_CAMERA_DOWN",
+    [KEY_CAMERA_LEFT] = "KEY_CAMERA_LEFT",
+    [KEY_CAMERA_RIGHT] = "KEY_CAMERA_RIGHT",
+    [KEY_ATTENDANT_ON] = "KEY_ATTENDANT_ON",
+    [KEY_ATTENDANT_OFF] = "KEY_ATTENDANT_OFF",
+    [KEY_ATTENDANT_TOGGLE] = "KEY_ATTENDANT_TOGGLE",
+    [KEY_LIGHTS_TOGGLE] = "KEY_LIGHTS_TOGGLE",
+    [KEY_ALS_TOGGLE] = "KEY_ALS_TOGGLE",
+    [KEY_ROTATE_LOCK_TOGGLE] = "KEY_ROTATE_LOCK_TOGGLE",
+    [KEY_BUTTONCONFIG] = "KEY_BUTTONCONFIG",
+    [KEY_TASKMANAGER] = "KEY_TASKMANAGER",
+    [KEY_JOURNAL] = "KEY_JOURNAL",
+    [KEY_CONTROLPANEL] = "KEY_CONTROLPANEL",
+    [KEY_APPSELECT] = "KEY_APPSELECT",
+    [KEY_SCREENSAVER] = "KEY_SCREENSAVER",
+    [KEY_VOICECOMMAND] = "KEY_VOICECOMMAND",
+    [KEY_ASSISTANT] = "KEY_ASSISTANT",
+    [KEY_KBD_LAYOUT_NEXT] = "KEY_KBD_LAYOUT_NEXT",
+    // [KEY_EMOJI_PICKER] = "KEY_EMOJI_PICKER",
+    //[KEY_DICTATE] = "KEY_DICTATE",
+    //[KEY_CAMERA_ACCESS_ENABLE] = "KEY_CAMERA_ACCESS_ENABLE",
+    //[KEY_CAMERA_ACCESS_DISABLE] = "KEY_CAMERA_ACCESS_DISABLE",
+    //[KEY_CAMERA_ACCESS_TOGGLE] = "KEY_CAMERA_ACCESS_TOGGLE",
+    [KEY_BRIGHTNESS_MIN] = "KEY_BRIGHTNESS_MIN",
+    [KEY_BRIGHTNESS_MAX] = "KEY_BRIGHTNESS_MAX",
+    [KEY_KBDINPUTASSIST_PREV] = "KEY_KBDINPUTASSIST_PREV",
+    [KEY_KBDINPUTASSIST_NEXT] = "KEY_KBDINPUTASSIST_NEXT",
+    [KEY_KBDINPUTASSIST_PREVGROUP] = "KEY_KBDINPUTASSIST_PREVGROUP",
+    [KEY_KBDINPUTASSIST_NEXTGROUP] = "KEY_KBDINPUTASSIST_NEXTGROUP",
+    [KEY_KBDINPUTASSIST_ACCEPT] = "KEY_KBDINPUTASSIST_ACCEPT",
+    [KEY_KBDINPUTASSIST_CANCEL] = "KEY_KBDINPUTASSIST_CANCEL",
+    [KEY_RIGHT_UP] = "KEY_RIGHT_UP",
+    [KEY_RIGHT_DOWN] = "KEY_RIGHT_DOWN",
+    [KEY_LEFT_UP] = "KEY_LEFT_UP",
+    [KEY_LEFT_DOWN] = "KEY_LEFT_DOWN",
+    [KEY_ROOT_MENU] = "KEY_ROOT_MENU",
+    [KEY_MEDIA_TOP_MENU] = "KEY_MEDIA_TOP_MENU",
+    [KEY_NUMERIC_11] = "KEY_NUMERIC_11",
+    [KEY_NUMERIC_12] = "KEY_NUMERIC_12",
+    [KEY_AUDIO_DESC] = "KEY_AUDIO_DESC",
+    [KEY_3D_MODE] = "KEY_3D_MODE",
+    [KEY_NEXT_FAVORITE] = "KEY_NEXT_FAVORITE",
+    [KEY_STOP_RECORD] = "KEY_STOP_RECORD",
+    [KEY_PAUSE_RECORD] = "KEY_PAUSE_RECORD",
+    [KEY_VOD] = "KEY_VOD",
+    [KEY_UNMUTE] = "KEY_UNMUTE",
+    [KEY_FASTREVERSE] = "KEY_FASTREVERSE",
+    [KEY_SLOWREVERSE] = "KEY_SLOWREVERSE",
+    [KEY_DATA] = "KEY_DATA",
+    [KEY_ONSCREEN_KEYBOARD] = "KEY_ONSCREEN_KEYBOARD",
+    [KEY_PRIVACY_SCREEN_TOGGLE] = "KEY_PRIVACY_SCREEN_TOGGLE",
+    [KEY_SELECTIVE_SCREENSHOT] = "KEY_SELECTIVE_SCREENSHOT",
+    // [KEY_NEXT_ELEMENT] = "KEY_NEXT_ELEMENT",
+    // [KEY_PREVIOUS_ELEMENT] = "KEY_PREVIOUS_ELEMENT",
+    // [KEY_AUTOPILOT_ENGAGE_TOGGLE] = "KEY_AUTOPILOT_ENGAGE_TOGGLE",
+    // [KEY_MARK_WAYPOINT] = "KEY_MARK_WAYPOINT",
+    // [KEY_SOS] = "KEY_SOS",
+    // [KEY_NAV_CHART] = "KEY_NAV_CHART",
+    // [KEY_FISHING_CHART] = "KEY_FISHING_CHART",
+    // [KEY_SINGLE_RANGE_RADAR] = "KEY_SINGLE_RANGE_RADAR",
+    // [KEY_DUAL_RANGE_RADAR] = "KEY_DUAL_RANGE_RADAR",
+    // [KEY_RADAR_OVERLAY] = "KEY_RADAR_OVERLAY",
+    // [KEY_TRADITIONAL_SONAR] = "KEY_TRADITIONAL_SONAR",
+    //  [KEY_CLEARVU_SONAR] = "KEY_CLEARVU_SONAR",
+    // [KEY_SIDEVU_SONAR] = "KEY_SIDEVU_SONAR",
+    // [KEY_NAV_INFO] = "KEY_NAV_INFO",
+    // [KEY_BRIGHTNESS_MENU] = "KEY_BRIGHTNESS_MENU",
+    [KEY_MACRO1] = "KEY_MACRO1",
+    [KEY_MACRO2] = "KEY_MACRO2",
+    [KEY_MACRO3] = "KEY_MACRO3",
+    [KEY_MACRO4] = "KEY_MACRO4",
+    [KEY_MACRO5] = "KEY_MACRO5",
+    [KEY_MACRO6] = "KEY_MACRO6",
+    [KEY_MACRO7] = "KEY_MACRO7",
+    [KEY_MACRO8] = "KEY_MACRO8",
+    [KEY_MACRO9] = "KEY_MACRO9",
+    [KEY_MACRO10] = "KEY_MACRO10",
+    [KEY_MACRO11] = "KEY_MACRO11",
+    [KEY_MACRO12] = "KEY_MACRO12",
+    [KEY_MACRO13] = "KEY_MACRO13",
+    [KEY_MACRO14] = "KEY_MACRO14",
+    [KEY_MACRO15] = "KEY_MACRO15",
+    [KEY_MACRO16] = "KEY_MACRO16",
+    [KEY_MACRO17] = "KEY_MACRO17",
+    [KEY_MACRO18] = "KEY_MACRO18",
+    [KEY_MACRO19] = "KEY_MACRO19",
+    [KEY_MACRO20] = "KEY_MACRO20",
+    [KEY_MACRO21] = "KEY_MACRO21",
+    [KEY_MACRO22] = "KEY_MACRO22",
+    [KEY_MACRO23] = "KEY_MACRO23",
+    [KEY_MACRO24] = "KEY_MACRO24",
+    [KEY_MACRO25] = "KEY_MACRO25",
+    [KEY_MACRO26] = "KEY_MACRO26",
+    [KEY_MACRO27] = "KEY_MACRO27",
+    [KEY_MACRO28] = "KEY_MACRO28",
+    [KEY_MACRO29] = "KEY_MACRO29",
+    [KEY_MACRO30] = "KEY_MACRO30",
+    [KEY_MACRO_RECORD_START] = "KEY_MACRO_RECORD_START",
+    [KEY_MACRO_RECORD_STOP] = "KEY_MACRO_RECORD_STOP",
+    [KEY_MACRO_PRESET_CYCLE] = "KEY_MACRO_PRESET_CYCLE",
+    [KEY_MACRO_PRESET1] = "KEY_MACRO_PRESET1",
+    [KEY_MACRO_PRESET2] = "KEY_MACRO_PRESET2",
+    [KEY_MACRO_PRESET3] = "KEY_MACRO_PRESET3",
+    [KEY_KBD_LCD_MENU1] = "KEY_KBD_LCD_MENU1",
+    [KEY_KBD_LCD_MENU2] = "KEY_KBD_LCD_MENU2",
+    [KEY_KBD_LCD_MENU3] = "KEY_KBD_LCD_MENU3",
+    [KEY_KBD_LCD_MENU4] = "KEY_KBD_LCD_MENU4",
+    [KEY_KBD_LCD_MENU5] = "KEY_KBD_LCD_MENU5",
+    [KEY_MAX] = "KEY_MAX",
+    [BTN_0] = "BTN_0",
+    [BTN_1] = "BTN_1",
+    [BTN_2] = "BTN_2",
+    [BTN_3] = "BTN_3",
+    [BTN_4] = "BTN_4",
+    [BTN_5] = "BTN_5",
+    [BTN_6] = "BTN_6",
+    [BTN_7] = "BTN_7",
+    [BTN_8] = "BTN_8",
+    [BTN_9] = "BTN_9",
+    [BTN_LEFT] = "BTN_LEFT",
+    [BTN_RIGHT] = "BTN_RIGHT",
+    [BTN_MIDDLE] = "BTN_MIDDLE",
+    [BTN_SIDE] = "BTN_SIDE",
+    [BTN_EXTRA] = "BTN_EXTRA",
+    [BTN_FORWARD] = "BTN_FORWARD",
+    [BTN_BACK] = "BTN_BACK",
+    [BTN_TASK] = "BTN_TASK",
+    [BTN_TRIGGER] = "BTN_TRIGGER",
+    [BTN_THUMB] = "BTN_THUMB",
+    [BTN_THUMB2] = "BTN_THUMB2",
+    [BTN_TOP] = "BTN_TOP",
+    [BTN_TOP2] = "BTN_TOP2",
+    [BTN_PINKIE] = "BTN_PINKIE",
+    [BTN_BASE] = "BTN_BASE",
+    [BTN_BASE2] = "BTN_BASE2",
+    [BTN_BASE3] = "BTN_BASE3",
+    [BTN_BASE4] = "BTN_BASE4",
+    [BTN_BASE5] = "BTN_BASE5",
+    [BTN_BASE6] = "BTN_BASE6",
+    [BTN_DEAD] = "BTN_DEAD",
+    [BTN_SOUTH] = "BTN_SOUTH",
+    [BTN_EAST] = "BTN_EAST",
+    [BTN_C] = "BTN_C",
+    [BTN_NORTH] = "BTN_NORTH",
+    [BTN_WEST] = "BTN_WEST",
+    [BTN_Z] = "BTN_Z",
+    [BTN_TL] = "BTN_TL",
+    [BTN_TR] = "BTN_TR",
+    [BTN_TL2] = "BTN_TL2",
+    [BTN_TR2] = "BTN_TR2",
+    [BTN_SELECT] = "BTN_SELECT",
+    [BTN_START] = "BTN_START",
+    [BTN_MODE] = "BTN_MODE",
+    [BTN_THUMBL] = "BTN_THUMBL",
+    [BTN_THUMBR] = "BTN_THUMBR",
+    [BTN_TOOL_PEN] = "BTN_TOOL_PEN",
+    [BTN_TOOL_RUBBER] = "BTN_TOOL_RUBBER",
+    [BTN_TOOL_BRUSH] = "BTN_TOOL_BRUSH",
+    [BTN_TOOL_PENCIL] = "BTN_TOOL_PENCIL",
+    [BTN_TOOL_AIRBRUSH] = "BTN_TOOL_AIRBRUSH",
+    [BTN_TOOL_FINGER] = "BTN_TOOL_FINGER",
+    [BTN_TOOL_MOUSE] = "BTN_TOOL_MOUSE",
+    [BTN_TOOL_LENS] = "BTN_TOOL_LENS",
+    [BTN_TOOL_QUINTTAP] = "BTN_TOOL_QUINTTAP",
+    [BTN_STYLUS3] = "BTN_STYLUS3",
+    [BTN_TOUCH] = "BTN_TOUCH",
+    [BTN_STYLUS] = "BTN_STYLUS",
+    [BTN_STYLUS2] = "BTN_STYLUS2",
+    [BTN_TOOL_DOUBLETAP] = "BTN_TOOL_DOUBLETAP",
+    [BTN_TOOL_TRIPLETAP] = "BTN_TOOL_TRIPLETAP",
+    [BTN_TOOL_QUADTAP] = "BTN_TOOL_QUADTAP",
+    [BTN_GEAR_DOWN] = "BTN_GEAR_DOWN",
+    [BTN_GEAR_UP] = "BTN_GEAR_UP",
+    [BTN_DPAD_UP] = "BTN_DPAD_UP",
+    [BTN_DPAD_DOWN] = "BTN_DPAD_DOWN",
+    [BTN_DPAD_LEFT] = "BTN_DPAD_LEFT",
+    [BTN_DPAD_RIGHT] = "BTN_DPAD_RIGHT",
+    [BTN_TRIGGER_HAPPY1] = "BTN_TRIGGER_HAPPY1",
+    [BTN_TRIGGER_HAPPY2] = "BTN_TRIGGER_HAPPY2",
+    [BTN_TRIGGER_HAPPY3] = "BTN_TRIGGER_HAPPY3",
+    [BTN_TRIGGER_HAPPY4] = "BTN_TRIGGER_HAPPY4",
+    [BTN_TRIGGER_HAPPY5] = "BTN_TRIGGER_HAPPY5",
+    [BTN_TRIGGER_HAPPY6] = "BTN_TRIGGER_HAPPY6",
+    [BTN_TRIGGER_HAPPY7] = "BTN_TRIGGER_HAPPY7",
+    [BTN_TRIGGER_HAPPY8] = "BTN_TRIGGER_HAPPY8",
+    [BTN_TRIGGER_HAPPY9] = "BTN_TRIGGER_HAPPY9",
+    [BTN_TRIGGER_HAPPY10] = "BTN_TRIGGER_HAPPY10",
+    [BTN_TRIGGER_HAPPY11] = "BTN_TRIGGER_HAPPY11",
+    [BTN_TRIGGER_HAPPY12] = "BTN_TRIGGER_HAPPY12",
+    [BTN_TRIGGER_HAPPY13] = "BTN_TRIGGER_HAPPY13",
+    [BTN_TRIGGER_HAPPY14] = "BTN_TRIGGER_HAPPY14",
+    [BTN_TRIGGER_HAPPY15] = "BTN_TRIGGER_HAPPY15",
+    [BTN_TRIGGER_HAPPY16] = "BTN_TRIGGER_HAPPY16",
+    [BTN_TRIGGER_HAPPY17] = "BTN_TRIGGER_HAPPY17",
+    [BTN_TRIGGER_HAPPY18] = "BTN_TRIGGER_HAPPY18",
+    [BTN_TRIGGER_HAPPY19] = "BTN_TRIGGER_HAPPY19",
+    [BTN_TRIGGER_HAPPY20] = "BTN_TRIGGER_HAPPY20",
+    [BTN_TRIGGER_HAPPY21] = "BTN_TRIGGER_HAPPY21",
+    [BTN_TRIGGER_HAPPY22] = "BTN_TRIGGER_HAPPY22",
+    [BTN_TRIGGER_HAPPY23] = "BTN_TRIGGER_HAPPY23",
+    [BTN_TRIGGER_HAPPY24] = "BTN_TRIGGER_HAPPY24",
+    [BTN_TRIGGER_HAPPY25] = "BTN_TRIGGER_HAPPY25",
+    [BTN_TRIGGER_HAPPY26] = "BTN_TRIGGER_HAPPY26",
+    [BTN_TRIGGER_HAPPY27] = "BTN_TRIGGER_HAPPY27",
+    [BTN_TRIGGER_HAPPY28] = "BTN_TRIGGER_HAPPY28",
+    [BTN_TRIGGER_HAPPY29] = "BTN_TRIGGER_HAPPY29",
+    [BTN_TRIGGER_HAPPY30] = "BTN_TRIGGER_HAPPY30",
+    [BTN_TRIGGER_HAPPY31] = "BTN_TRIGGER_HAPPY31",
+    [BTN_TRIGGER_HAPPY32] = "BTN_TRIGGER_HAPPY32",
+    [BTN_TRIGGER_HAPPY33] = "BTN_TRIGGER_HAPPY33",
+    [BTN_TRIGGER_HAPPY34] = "BTN_TRIGGER_HAPPY34",
+    [BTN_TRIGGER_HAPPY35] = "BTN_TRIGGER_HAPPY35",
+    [BTN_TRIGGER_HAPPY36] = "BTN_TRIGGER_HAPPY36",
+    [BTN_TRIGGER_HAPPY37] = "BTN_TRIGGER_HAPPY37",
+    [BTN_TRIGGER_HAPPY38] = "BTN_TRIGGER_HAPPY38",
+    [BTN_TRIGGER_HAPPY39] = "BTN_TRIGGER_HAPPY39",
+    [BTN_TRIGGER_HAPPY40] = "BTN_TRIGGER_HAPPY40",
+};
+
+static const char * const led_map[LED_MAX + 1] = {
+    [LED_NUML] = "LED_NUML",
+    [LED_CAPSL] = "LED_CAPSL",
*** 11201 LINES SKIPPED ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202509042108.584L86Ro060944>