diff options
| author | verdant <i@glowisle.me> | 2026-05-19 23:59:58 +0800 |
|---|---|---|
| committer | verdant <i@glowisle.me> | 2026-05-19 23:59:58 +0800 |
| commit | 163f22d1d281b70a234cd231187aa0bcbb297f91 (patch) | |
| tree | 5070b0511fad3a4aed7dc3d66479d45c5c24a137 | |
| parent | a4697b6c2a4b3f40576238291abf8080da9f9754 (diff) | |
| download | kl-163f22d1d281b70a234cd231187aa0bcbb297f91.tar.gz kl-163f22d1d281b70a234cd231187aa0bcbb297f91.zip | |
Format and split code
| -rw-r--r-- | config.c | 184 | ||||
| -rw-r--r-- | config.h | 32 | ||||
| -rw-r--r-- | main.c | 386 |
3 files changed, 211 insertions, 391 deletions
@@ -7,113 +7,117 @@ #include "config.h" -void fix_config_file_owner(const char *config_path) { - char *sudo_uid_str = getenv("SUDO_UID"); - char *sudo_gid_str = getenv("SUDO_GID"); - - if (sudo_uid_str && sudo_gid_str) { - uid_t original_uid = atoi(sudo_uid_str); - gid_t original_gid = atoi(sudo_gid_str); - - chown(config_path, original_uid, original_gid); - } +void fix_config_file_owner(const char *config_path) +{ + char *sudo_uid_str = getenv("SUDO_UID"); + char *sudo_gid_str = getenv("SUDO_GID"); + + if (sudo_uid_str && sudo_gid_str) { + uid_t original_uid = atoi(sudo_uid_str); + gid_t original_gid = atoi(sudo_gid_str); + + chown(config_path, original_uid, original_gid); + } } -struct config* prepare_config_file() { - struct config* cfg = malloc(sizeof(struct config)); - if (!cfg) { - return NULL; - } +struct config *prepare_config_file() +{ + struct config *cfg = malloc(sizeof(struct config)); + if (!cfg) { + return NULL; + } - char* sudo_user = getenv("SUDO_USER"); - cfg->home = malloc(PATH_MAX); - if (!cfg->home) { - return NULL; - } + char *sudo_user = getenv("SUDO_USER"); + cfg->home = malloc(PATH_MAX); + if (!cfg->home) { + return NULL; + } - snprintf(cfg->home, PATH_MAX, "/home/%s", sudo_user); + snprintf(cfg->home, PATH_MAX, "/home/%s", sudo_user); - cfg->config_file_path = malloc(strlen(cfg->home) + strlen("/.klrc")); + cfg->config_file_path = malloc(strlen(cfg->home) + strlen("/.klrc")); - snprintf(cfg->config_file_path, PATH_MAX, "%s/.klrc", cfg->home); + snprintf(cfg->config_file_path, PATH_MAX, "%s/.klrc", cfg->home); - if (access(cfg->config_file_path, F_OK) == -1) { - FILE* fp = fopen(cfg->config_file_path, "a"); - if (!fp) { - return NULL; + if (access(cfg->config_file_path, F_OK) == -1) { + FILE *fp = fopen(cfg->config_file_path, "a"); + if (!fp) { + return NULL; + } + fputs(CFG_FILE_COMMENT, fp); + printf("Config file was generated: %s\n", + cfg->config_file_path); + printf("Warning: There is no device which is defined in config, see README for details.\n"); + fix_config_file_owner(cfg->config_file_path); + printf("%s\n", cfg->config_file_path); + fclose(fp); } - fputs(CONFIG_FILE_COMMENT, fp); - printf("Config file was generated: %s\n", cfg->config_file_path); - printf("Warning: There is no device which is defined in config, see README for details.\n"); - fix_config_file_owner(cfg->config_file_path); - printf("%s\n", cfg->config_file_path); - fclose(fp); - } - return cfg; + return cfg; } -struct config* parese_config(struct config* cfg) { - if (!cfg) { - return NULL; - } - - FILE* fp = fopen(cfg->config_file_path, "r"); - if (!fp) { - return NULL; - } - - - int line_count = 0; - char line[128]; - char key[64] = {0}; - char val[64] = {0}; +struct config *parese_config(struct config *cfg) +{ + if (!cfg) { + return NULL; + } - while (fgets(line, sizeof(line), fp)) { - line_count++; - /* Skip comment and blank lines */ - if (line[0] == '#' || line[0] == '\n' || line[0] == '\r') { - continue; + FILE *fp = fopen(cfg->config_file_path, "r"); + if (!fp) { + return NULL; } - int count = sscanf(line, "%s = %s", key, val); - if (count != 2) { - printf("Error at %s:%d\n invalid token: %s", cfg->config_file_path, line_count, line); - return NULL; + int line_count = 0; + char line[128]; + char key[64] = { 0 }; + char val[64] = { 0 }; + + while (fgets(line, sizeof(line), fp)) { + line_count++; + /* Skip comment and blank lines */ + if (line[0] == '#' || line[0] == '\n' || line[0] == '\r') { + continue; + } + + int count = sscanf(line, "%s = %s", key, val); + if (count != 2) { + printf("Error at %s:%d\n invalid token: %s", + cfg->config_file_path, line_count, line); + return NULL; + } + + if (CFG_COMPLETE(key, "device")) { + strncpy(cfg->device, val, sizeof(cfg->device) - 1); + cfg->device[sizeof(cfg->device) - 1] = '\0'; + } else if (CFG_COMPLETE(key, "time")) { + if (CFG_COMPLETE(val, "true")) { + cfg->time = true; + } else { + cfg->time = false; + } + } else if (CFG_COMPLETE(key, "key_counter")) { + if (CFG_COMPLETE(val, "true")) { + cfg->keys_counter = true; + } else { + cfg->keys_counter = false; + } + } } - if (CFG_COMPLETE(key, "device")) { - strncpy(cfg->device, val, sizeof(cfg->device) - 1); - cfg->device[sizeof(cfg->device) - 1] = '\0'; - } else if (CFG_COMPLETE(key, "time")) { - if (CFG_COMPLETE(val, "true")) { - cfg->time = true; - } else { - cfg->time = false; - } - } else if (CFG_COMPLETE(key, "key_counter")) { - if (CFG_COMPLETE(val, "true")) { - cfg->keys_counter = true; - } else { - cfg->keys_counter = false; - } - } - } - - fclose(fp); - - return cfg; -} + fclose(fp); -struct config* config_init() { - struct config *cfg = prepare_config_file(); - if (!cfg) { - return NULL; - } + return cfg; +} - if (parese_config(cfg) == NULL) { - return NULL; - } +struct config *config_init() +{ + struct config *cfg = prepare_config_file(); + if (!cfg) { + return NULL; + } + if (parese_config(cfg) == NULL) { + return NULL; + } - return cfg; + return cfg; } @@ -10,27 +10,29 @@ #define PROGRAM_VERSION "0.0.2" #define PROGRAM_AUTHORS "Verdant <im@verdant.ee>" -#define CONFIG_FILE_COMMENT "# kl config file (v"PROGRAM_VERSION")\n" \ - "#\n" \ - "# Please see your README for details.\n" \ - "#\n" \ - "# This file was auto-generated because it was missing.\n" \ +#define CFG_FILE_COMMENT \ + "# kl config file (v" PROGRAM_VERSION ")\n" \ + "#\n" \ + "# Please see your README for details.\n" \ + "#\n" \ + "# This file was auto-generated because it was missing.\n" -#define CFG_COMPLETE(key, val) ((strcmp((key), (val)) == 0) && ((val)[0] != '\0')) +#define CFG_COMPLETE(key, val) \ + ((strcmp((key), (val)) == 0) && ((val)[0] != '\0')) struct config { - char* home; - char* config_file_path; - char device[256]; - bool time; - bool keys_counter; + char *home; + char *config_file_path; + char device[256]; + bool time; + bool keys_counter; + bool show_shifted; }; -struct config* parese_config(struct config* cfg); +struct config *parese_config(struct config *cfg); -struct config* prepare_config_file(); - -struct config* config_init(); +struct config *prepare_config_file(); +struct config *config_init(); #endif @@ -8,308 +8,122 @@ #include <sys/time.h> #include <time.h> #include <string.h> + #include "config.h" +#include "keys.h" +#include "utils.h" -static struct termios original_term; -const char * key_names[256] = { - 0 -}; -static int repeat_counters[256] = { - 1 -}; -static int current_repeat_key = 0; +static int repeat_counters[256] = { 1 }; static int line_lock = -1; -enum KEY_STATUS { - KEY_RELEASE = 0, - KEY_PRESS = 1, - KEY_REPEAT = 2 -}; - -void usage() { - printf("Usage: %s <EVENT_FILE_PATH>.\n", PROGRAM_NAME); -} - -void version() { - printf("%s (v%s)\n", PROGRAM_FULL_NAME, PROGRAM_VERSION); - printf("%s\n", PROGRAM_AUTHORS); - -} - -void init_key_names() { - key_names[KEY_RESERVED] = "KEY_RESERVED"; - 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] = "<SPACE>"; - - key_names[KEY_ESC] = "<ESC>"; - key_names[KEY_BACKSPACE] = "<BACKSPACE>"; - key_names[KEY_TAB] = "<TAB>"; - key_names[KEY_ENTER] = "<ENTER>"; - key_names[KEY_LEFTSHIFT] = "<L_SHIFT>"; - key_names[KEY_RIGHTSHIFT] = "<R_SHIFT>"; - key_names[KEY_LEFTCTRL] = "<L_CTRL>"; - key_names[KEY_RIGHTCTRL] = "<R_CTRL>"; - key_names[KEY_LEFTALT] = "<L_ALT>"; - key_names[KEY_RIGHTALT] = "<R_ALT>"; - key_names[KEY_LEFTMETA] = "<L_META>"; - key_names[KEY_RIGHTMETA] = "<R_META>"; - key_names[KEY_CAPSLOCK] = "<CAPSLOCK>"; - key_names[KEY_NUMLOCK] = "<NUMLOCK>"; - key_names[KEY_SCROLLLOCK] = "<SCROLLLOCK>"; - - key_names[KEY_F1] = "<F1>"; - key_names[KEY_F2] = "<F2>"; - key_names[KEY_F3] = "<F3>"; - key_names[KEY_F4] = "<F4>"; - key_names[KEY_F5] = "<F5>"; - key_names[KEY_F6] = "<F6>"; - key_names[KEY_F7] = "<F7>"; - key_names[KEY_F8] = "<F8>"; - key_names[KEY_F9] = "<F9>"; - key_names[KEY_F10] = "<F10>"; - key_names[KEY_F11] = "<F11>"; - key_names[KEY_F12] = "<F12>"; - key_names[KEY_F13] = "<F13>"; - key_names[KEY_F14] = "<F14>"; - key_names[KEY_F15] = "<F15>"; - key_names[KEY_F16] = "<F16>"; - key_names[KEY_F17] = "<F17>"; - key_names[KEY_F18] = "<F18>"; - key_names[KEY_F19] = "<F19>"; - key_names[KEY_F20] = "<F20>"; - key_names[KEY_F21] = "<F21>"; - key_names[KEY_F22] = "<F22>"; - key_names[KEY_F23] = "<F23>"; - key_names[KEY_F24] = "<F24>"; - - key_names[KEY_KP0] = "<KP0>"; - key_names[KEY_KP1] = "<KP1>"; - key_names[KEY_KP2] = "<KP2>"; - key_names[KEY_KP3] = "<KP3>"; - key_names[KEY_KP4] = "<KP4>"; - key_names[KEY_KP5] = "<KP5>"; - key_names[KEY_KP6] = "<KP6>"; - key_names[KEY_KP7] = "<KP7>"; - key_names[KEY_KP8] = "<KP8>"; - key_names[KEY_KP9] = "<KP9>"; - key_names[KEY_KPDOT] = "<KP.>"; - key_names[KEY_KPCOMMA] = "<KP,>"; - key_names[KEY_KPENTER] = "<KPENTER>"; - key_names[KEY_KPMINUS] = "<KP->"; - key_names[KEY_KPPLUS] = "<KP+>"; - key_names[KEY_KPSLASH] = "<KP/>"; - key_names[KEY_KPASTERISK] = "<KP*>"; - key_names[KEY_KPEQUAL] = "<KP=>"; - - key_names[KEY_UP] = "<UP>"; - key_names[KEY_DOWN] = "<DOWN>"; - key_names[KEY_LEFT] = "<LEFT>"; - key_names[KEY_RIGHT] = "<RIGHT>"; - key_names[KEY_HOME] = "<HOME>"; - key_names[KEY_END] = "<END>"; - key_names[KEY_PAGEUP] = "<PAGEUP>"; - key_names[KEY_PAGEDOWN] = "<PAGEDOWN>"; - key_names[KEY_INSERT] = "<INSERT>"; - key_names[KEY_DELETE] = "<DELETE>"; - - key_names[KEY_MUTE] = "<MUTE>"; - key_names[KEY_VOLUMEDOWN] = "<VOLUMEDOWN>"; - key_names[KEY_VOLUMEUP] = "<VOLUMEUP>"; - key_names[KEY_POWER] = "<POWER>"; - key_names[KEY_SLEEP] = "<SLEEP>"; - key_names[KEY_WAKEUP] = "<WAKEUP>"; - key_names[KEY_PLAY] = "<PLAY>"; - key_names[KEY_PAUSE] = "<PAUSE>"; - key_names[KEY_PLAYPAUSE] = "<PLAYPAUSE>"; - key_names[KEY_STOPCD] = "<STOP>"; - key_names[KEY_PREVIOUSSONG] = "<PREVIOUS>"; - key_names[KEY_NEXTSONG] = "<NEXT>"; - key_names[KEY_REWIND] = "<REWIND>"; - key_names[KEY_FASTFORWARD] = "<FASTFORWARD>"; - key_names[KEY_RECORD] = "<RECORD>"; - key_names[KEY_EJECTCD] = "<EJECT>"; - - key_names[KEY_SYSRQ] = "<SYSRQ>"; - key_names[KEY_PAUSE] = "<PAUSE>"; - key_names[KEY_MENU] = "<MENU>"; - key_names[KEY_CALC] = "<CALC>"; - key_names[KEY_MAIL] = "<MAIL>"; - key_names[KEY_WWW] = "<WWW>"; - key_names[KEY_SEARCH] = "<SEARCH>"; - key_names[KEY_BACK] = "<BACK>"; - key_names[KEY_FORWARD] = "<FORWARD>"; - key_names[KEY_REFRESH] = "<REFRESH>"; - key_names[KEY_STOP] = "<STOP>"; - key_names[KEY_COPY] = "<COPY>"; - key_names[KEY_CUT] = "<CUT>"; - key_names[KEY_PASTE] = "<PASTE>"; - key_names[KEY_UNDO] = "<UNDO>"; - key_names[KEY_REDO] = "<REDO>"; - key_names[KEY_FIND] = "<FIND>"; - key_names[KEY_HELP] = "<HELP>"; - key_names[KEY_FILE] = "<FILE>"; - key_names[KEY_SAVE] = "<SAVE>"; - key_names[KEY_NEW] = "<NEW>"; - key_names[KEY_OPEN] = "<OPEN>"; - key_names[KEY_CLOSE] = "<CLOSE>"; - key_names[KEY_EXIT] = "<EXIT>"; - key_names[KEY_PRINT] = "<PRINT>"; - key_names[KEY_BRIGHTNESSDOWN] = "<BRIGHTNESSDOWN>"; - key_names[KEY_BRIGHTNESSUP] = "<BRIGHTNESSUP>"; - key_names[KEY_DISPLAY_OFF] = "<DISPLAYOFF>"; - key_names[KEY_MICMUTE] = "<MICMUTE>"; - key_names[KEY_WLAN] = "<WLAN>"; - key_names[KEY_BLUETOOTH] = "<BLUETOOTH>"; -} - -void disable_term_echo() { - struct termios new_setting, init_setting; - tcgetattr(0, & original_term); - new_setting = original_term; +enum KEY_STATUS { KEY_RELEASE = 0, KEY_PRESS = 1, KEY_REPEAT = 2 }; - new_setting.c_lflag &= ~ECHO; - tcsetattr(0, TCSANOW, & new_setting); +void usage() +{ + printf("Usage: %s <EVENT_FILE_PATH>.\n", PROGRAM_NAME); } -void enable_term_echo() { - tcsetattr(0, TCSANOW, & original_term); +void version() +{ + printf("%s (v%s)\n", PROGRAM_FULL_NAME, PROGRAM_VERSION); + printf("%s\n", PROGRAM_AUTHORS); } -void print_pure(struct input_event * ie) { - if (repeat_counters[ie -> code] != 1) { - printf("%-15s x%-13d\r", key_names[ie -> code], repeat_counters[ie -> code]); - } else { - printf("%s", key_names[ie -> code]); - } +void print_pure(struct input_event *ie) +{ + if (repeat_counters[ie->code] != 1) { + printf("%-15s x%-13d\r", key_names[ie->code], + repeat_counters[ie->code]); + } else { + printf("%s", key_names[ie->code]); + } - fflush(stdout); + fflush(stdout); } -void print_with_time(struct input_event * ie) { - struct tm * tm_info; - char time_buf[64]; - time_t sec = (time_t) ie -> input_event_sec; - tm_info = localtime( & sec); - strftime(time_buf, sizeof(time_buf), "%F %T", tm_info); - - if (repeat_counters[ie -> code] != 1) { - printf("%s.%06ld: %s x%d\n", time_buf, (long) ie -> time.tv_usec, key_names[ie -> code], repeat_counters[ie -> code]); - } else { - printf("%s.%06ld: %s\n", time_buf, (long) ie -> time.tv_usec, key_names[ie -> code]); - - } - - return; +void print_with_time(struct input_event *ie) +{ + struct tm *tm_info; + char time_buf[64]; + time_t sec = (time_t)ie->input_event_sec; + tm_info = localtime(&sec); + strftime(time_buf, sizeof(time_buf), "%F %T", tm_info); + + if (repeat_counters[ie->code] != 1) { + printf("%s.%06ld: %s x%d\n", time_buf, (long)ie->time.tv_usec, + key_names[ie->code], repeat_counters[ie->code]); + } else { + printf("%s.%06ld: %s\n", time_buf, (long)ie->time.tv_usec, + key_names[ie->code]); + } + + return; } -int main(int argc, char ** argv) { - if (argv[1] != NULL && (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0)) { - usage(); - return -1; - } else if (argv[1] != NULL && (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-v")) == 0) { - version(); - return -1; - } - - setvbuf(stdout, NULL, _IONBF, 0); - disable_term_echo(); - - struct config * cfg = config_init(); - if (!cfg) { - return -1; - } - - printf("Device: %s\n", cfg -> device); - - struct input_event ie; - int fd = open(cfg -> device, O_RDONLY); - - if (fd == -1 && errno == EACCES) { - printf("Permission denied: please run %s with sudo.\n", PROGRAM_NAME); - return -1; - } - - if (fd == -1 && errno == ENOENT) { - printf("Invalid device, please check your config file.\n"); - return -1; - - } - - init_key_names(); - - void( * fp)(struct input_event * ie) = (cfg -> time == true) ? print_with_time : print_pure; - - while (1) { - read(fd, & ie, sizeof(ie)); - if (ie.type == EV_KEY) { - - if (ie.value == KEY_PRESS) { - if (line_lock != -1 && !cfg -> time) printf("\n"); - repeat_counters[ie.code] = 1; +int main(int argc, char **argv) +{ + if (argv[1] != NULL && + (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0)) { + usage(); + return -1; + } else if (argv[1] != NULL && (strcmp(argv[1], "--version") == 0 || + strcmp(argv[1], "-v")) == 0) { + version(); + return -1; + } + + setvbuf(stdout, NULL, _IONBF, 0); + disable_term_echo(); + + struct config *cfg = config_init(); + if (!cfg) { + return -1; + } + + printf("Device: %s\n", cfg->device); + + struct input_event ie; + int fd = open(cfg->device, O_RDONLY); + + if (fd == -1 && errno == EACCES) { + printf("Permission denied: please run %s with sudo.\n", + PROGRAM_NAME); + return -1; + } + + if (fd == -1 && errno == ENOENT) { + printf("Invalid device, please check your config file.\n"); + return -1; + } + + init_key_names(); + + void (*fp)(struct input_event * ie) = + (cfg->time == true) ? print_with_time : print_pure; + + while (1) { + read(fd, &ie, sizeof(ie)); + if (ie.type == EV_KEY) { + if (ie.value == KEY_PRESS) { + if (line_lock != -1 && !cfg->time) + printf("\n"); + repeat_counters[ie.code] = 1; line_lock = ie.code; - fp(&ie); - } + fp(&ie); + } - if (ie.value == KEY_REPEAT) { + if (ie.value == KEY_REPEAT) { if (cfg->time) { - if (cfg->time) printf("\r\033[K"); + if (cfg->time) + printf("\r\033[K"); } - line_lock = ie.code; - repeat_counters[ie.code]++; - fp(&ie); - } - } - - } - - enable_term_echo(); - return 0; + line_lock = ie.code; + repeat_counters[ie.code]++; + fp(&ie); + } + } + } + + enable_term_echo(); + return 0; } |
