From 0f45252d3f46d28ad99793eb875087462504defb Mon Sep 17 00:00:00 2001 From: verdant Date: Sat, 16 May 2026 21:21:02 +0800 Subject: Initial commit --- .#key_lookup_table_generate.sh | 1 + .#key_value | 1 + README | 28 +++++ main.c | 238 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 268 insertions(+) create mode 120000 .#key_lookup_table_generate.sh create mode 120000 .#key_value create mode 100644 README create mode 100644 main.c diff --git a/.#key_lookup_table_generate.sh b/.#key_lookup_table_generate.sh new file mode 120000 index 0000000..e088276 --- /dev/null +++ b/.#key_lookup_table_generate.sh @@ -0,0 +1 @@ +verdant@glowisle.94783:1778887442 \ No newline at end of file diff --git a/.#key_value b/.#key_value new file mode 120000 index 0000000..e088276 --- /dev/null +++ b/.#key_value @@ -0,0 +1 @@ +verdant@glowisle.94783:1778887442 \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..ebae2ca --- /dev/null +++ b/README @@ -0,0 +1,28 @@ +Keyboard Listener(kl) +===================== + +DESCRIPTION + + This is a simple tool to print the key + you pressed in real-time. + +USAGE + + kl + + The argument is the path + of the event file which is linked to your + keyboard. + + λ /dev/input/by-id/ ls -lhi /dev/input/by-id + total 0 + 1467 lrwxrwxrwx 1 root root 9 May 16 09:22 + usb-SEMICO_USB_Gaming_Keyboard-event-kbd -> ../event4 + + Then run `sudo kl /dev/input/event4`, the key + you pressed will be print on STDOUT. + +REPORT + + Feel free to create a PR : ) + diff --git a/main.c b/main.c new file mode 100644 index 0000000..8faac24 --- /dev/null +++ b/main.c @@ -0,0 +1,238 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define PROGRAM_NAME "kl" + +static struct termios original_term; +const char *key_names[256] = {0}; + +void init_key_names() { + key_names[KEY_Q] = "Q"; + key_names[KEY_W] = "W"; + key_names[KEY_E] = "E"; + key_names[KEY_R] = "R"; + key_names[KEY_T] = "T"; + key_names[KEY_Y] = "Y"; + key_names[KEY_U] = "U"; + key_names[KEY_I] = "I"; + key_names[KEY_O] = "O"; + key_names[KEY_P] = "P"; + key_names[KEY_A] = "A"; + key_names[KEY_S] = "S"; + key_names[KEY_D] = "D"; + key_names[KEY_F] = "F"; + key_names[KEY_G] = "G"; + key_names[KEY_H] = "H"; + key_names[KEY_J] = "J"; + key_names[KEY_K] = "K"; + key_names[KEY_L] = "L"; + key_names[KEY_Z] = "Z"; + key_names[KEY_X] = "X"; + key_names[KEY_C] = "C"; + key_names[KEY_V] = "V"; + key_names[KEY_B] = "B"; + key_names[KEY_N] = "N"; + key_names[KEY_M] = "M"; + + key_names[KEY_1] = "1"; + key_names[KEY_2] = "2"; + key_names[KEY_3] = "3"; + key_names[KEY_4] = "4"; + key_names[KEY_5] = "5"; + key_names[KEY_6] = "6"; + key_names[KEY_7] = "7"; + key_names[KEY_8] = "8"; + key_names[KEY_9] = "9"; + key_names[KEY_0] = "0"; + + key_names[KEY_MINUS] = "-"; + key_names[KEY_EQUAL] = "="; + key_names[KEY_LEFTBRACE] = "["; + key_names[KEY_RIGHTBRACE] = "]"; + key_names[KEY_SEMICOLON] = ";"; + key_names[KEY_APOSTROPHE] = "'"; + key_names[KEY_GRAVE] = "`"; + key_names[KEY_BACKSLASH] = "\\"; + key_names[KEY_COMMA] = ","; + key_names[KEY_DOT] = "."; + key_names[KEY_SLASH] = "/"; + key_names[KEY_SPACE] = ""; + + key_names[KEY_ESC] = ""; + key_names[KEY_BACKSPACE] = ""; + key_names[KEY_TAB] = ""; + key_names[KEY_ENTER] = ""; + key_names[KEY_LEFTSHIFT] = ""; + key_names[KEY_RIGHTSHIFT] = ""; + key_names[KEY_LEFTCTRL] = ""; + key_names[KEY_RIGHTCTRL] = ""; + key_names[KEY_LEFTALT] = ""; + key_names[KEY_RIGHTALT] = ""; + key_names[KEY_LEFTMETA] = ""; + key_names[KEY_RIGHTMETA] = ""; + key_names[KEY_CAPSLOCK] = ""; + key_names[KEY_NUMLOCK] = ""; + key_names[KEY_SCROLLLOCK] = ""; + + key_names[KEY_F1] = ""; + key_names[KEY_F2] = ""; + key_names[KEY_F3] = ""; + key_names[KEY_F4] = ""; + key_names[KEY_F5] = ""; + key_names[KEY_F6] = ""; + key_names[KEY_F7] = ""; + key_names[KEY_F8] = ""; + key_names[KEY_F9] = ""; + key_names[KEY_F10] = ""; + key_names[KEY_F11] = ""; + key_names[KEY_F12] = ""; + key_names[KEY_F13] = ""; + key_names[KEY_F14] = ""; + key_names[KEY_F15] = ""; + key_names[KEY_F16] = ""; + key_names[KEY_F17] = ""; + key_names[KEY_F18] = ""; + key_names[KEY_F19] = ""; + key_names[KEY_F20] = ""; + key_names[KEY_F21] = ""; + key_names[KEY_F22] = ""; + key_names[KEY_F23] = ""; + key_names[KEY_F24] = ""; + + key_names[KEY_KP0] = ""; + key_names[KEY_KP1] = ""; + key_names[KEY_KP2] = ""; + key_names[KEY_KP3] = ""; + key_names[KEY_KP4] = ""; + key_names[KEY_KP5] = ""; + key_names[KEY_KP6] = ""; + key_names[KEY_KP7] = ""; + key_names[KEY_KP8] = ""; + key_names[KEY_KP9] = ""; + key_names[KEY_KPDOT] = ""; + key_names[KEY_KPCOMMA] = ""; + key_names[KEY_KPENTER] = ""; + key_names[KEY_KPMINUS] = ""; + key_names[KEY_KPPLUS] = ""; + key_names[KEY_KPSLASH] = ""; + key_names[KEY_KPASTERISK] = ""; + key_names[KEY_KPEQUAL] = ""; + + key_names[KEY_UP] = ""; + key_names[KEY_DOWN] = ""; + key_names[KEY_LEFT] = ""; + key_names[KEY_RIGHT] = ""; + key_names[KEY_HOME] = ""; + key_names[KEY_END] = ""; + key_names[KEY_PAGEUP] = ""; + key_names[KEY_PAGEDOWN] = ""; + key_names[KEY_INSERT] = ""; + key_names[KEY_DELETE] = ""; + + key_names[KEY_MUTE] = ""; + key_names[KEY_VOLUMEDOWN] = ""; + key_names[KEY_VOLUMEUP] = ""; + key_names[KEY_POWER] = ""; + key_names[KEY_SLEEP] = ""; + key_names[KEY_WAKEUP] = ""; + key_names[KEY_PLAY] = ""; + key_names[KEY_PAUSE] = ""; + key_names[KEY_PLAYPAUSE] = ""; + key_names[KEY_STOPCD] = ""; + key_names[KEY_PREVIOUSSONG] = ""; + key_names[KEY_NEXTSONG] = ""; + key_names[KEY_REWIND] = ""; + key_names[KEY_FASTFORWARD] = ""; + key_names[KEY_RECORD] = ""; + key_names[KEY_EJECTCD] = ""; + + key_names[KEY_SYSRQ] = ""; + key_names[KEY_PAUSE] = ""; + key_names[KEY_MENU] = ""; + key_names[KEY_CALC] = ""; + key_names[KEY_MAIL] = ""; + key_names[KEY_WWW] = ""; + key_names[KEY_SEARCH] = ""; + key_names[KEY_BACK] = ""; + key_names[KEY_FORWARD] = ""; + key_names[KEY_REFRESH] = ""; + key_names[KEY_STOP] = ""; + key_names[KEY_COPY] = ""; + key_names[KEY_CUT] = ""; + key_names[KEY_PASTE] = ""; + key_names[KEY_UNDO] = ""; + key_names[KEY_REDO] = ""; + key_names[KEY_FIND] = ""; + key_names[KEY_HELP] = ""; + key_names[KEY_FILE] = ""; + key_names[KEY_SAVE] = ""; + key_names[KEY_NEW] = ""; + key_names[KEY_OPEN] = ""; + key_names[KEY_CLOSE] = ""; + key_names[KEY_EXIT] = ""; + key_names[KEY_PRINT] = ""; + key_names[KEY_BRIGHTNESSDOWN] = ""; + key_names[KEY_BRIGHTNESSUP] = ""; + key_names[KEY_DISPLAY_OFF] = ""; + key_names[KEY_MICMUTE] = ""; + key_names[KEY_WLAN] = ""; + key_names[KEY_BLUETOOTH] = ""; +} + +void usage() { + printf("Usage: %s .\n", PROGRAM_NAME); +} + +void disable_term_echo() { + struct termios new_setting, init_setting; + tcgetattr(0, &init_setting); + new_setting = init_setting; + + new_setting.c_lflag&=~ECHO; + tcsetattr(0, TCSANOW, &new_setting); +} + +void enable_term_echo() { + tcsetattr(0, TCSANOW, &original_term); +} + +int main(int argc, char** argv) { + if (argc != 2 || strcmp(argv[1], "--help") == 0) { + usage(); + return -1; + } + + disable_term_echo(); + + struct input_event ie; + int fd = open(argv[1], O_RDONLY); + + if (fd == -1 && errno == EACCES) { + printf("Permission denied: please run %s with sudo.\n", PROGRAM_NAME); + return -1; + } + + init_key_names(); + + while (1) { + read(fd, &ie, sizeof(ie)); + + if (ie.type == EV_KEY && ie.value == 2) { + continue; + } + + if (key_names[ie.code] != NULL && ie.value == 1) { + printf("%s\n", key_names[ie.code]); + } + + } + + enable_term_echo(); + return 0; +} -- cgit v1.2.3