X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fclient%2Fkeybindings.c;h=fc371e866501f7caf9777f021cda9aa2a074e1df;hb=36519c3ce33ac973889e92971abded12b51f04db;hp=b23a47efab871cb75449f9d980be9df1d564e22c;hpb=83a319d17dcafef7c843c41acad8fae9ecf9d784;p=plomrogue diff --git a/src/client/keybindings.c b/src/client/keybindings.c index b23a47e..fc371e8 100644 --- a/src/client/keybindings.c +++ b/src/client/keybindings.c @@ -1,20 +1,20 @@ -/* src/client/keybindings.c */ +/* src/client/keybindings.c + * + * This file is part of PlomRogue. PlomRogue is licensed under the GPL version 3 + * or any later version. For details on its copyright, license, and warranties, + * see the file NOTICE in the root directory of the PlomRogue source package. + */ #include "keybindings.h" -#include /* keycode defines, cbreak(), halfdelay(), getch() */ +#include /* keycode defines, cbreak(), getch(), timeout() */ #include /* NULL */ #include /* uint8_t, uint16_t, uint32_t */ #include /* FILE, sprintf() */ -#include /* atoi() */ -#include /* strlen(), strchr(), strcmp() */ -#include "../common/err_try_fgets.h" /* err_try_fgets(), err_line() */ -#include "../common/readwrite.h" /* try_fwrite()*/ +#include "../common/rexit.h" /* exit_trouble() */ #include "../common/try_malloc.h" /* try_malloc() */ -#include "command_db.h" /* get_command() */ -#include "misc.h" /* array_append() */ #include "windows.h" /* draw_all_wins() */ #include "world.h" /* global world */ - +struct Command; /* Return pointer to global keybindings or to keybindings for wingeometry config @@ -57,7 +57,8 @@ static uint8_t try_keycode(uint16_t keycode_given, char * keyname, { if (keycode_given == keycode_match) { - sprintf(keyname, "%s", keyname_match); + int test = sprintf(keyname, "%s", keyname_match); + exit_trouble(test < 0, __func__, "sprintf"); return 1; } return 0; @@ -68,7 +69,7 @@ static uint8_t try_keycode(uint16_t keycode_given, char * keyname, extern struct Command * get_command_to_keycode(struct KeyBindingDB * kbdb, uint16_t keycode) { - uint16_t n_kb; + uint8_t n_kb; for (n_kb = 0; n_kb < kbdb->n_of_kbs; n_kb++) { if (keycode == kbdb->kbs[n_kb].keycode) @@ -83,16 +84,15 @@ extern struct Command * get_command_to_keycode(struct KeyBindingDB * kbdb, extern char * get_keyname_to_keycode(uint16_t keycode) { - char * f_name = "get_name_to_keycode()"; - char * keyname = try_malloc(15, f_name); /* FIXME: Why 15? */ + char * keyname = try_malloc(10, __func__); /* max keyname length + 1 */ if (32 < keycode && keycode < 127) { - sprintf(keyname, "%c", keycode); + exit_trouble(sprintf(keyname, "%c", keycode) < 0, __func__, "sprintf"); } else if (keycode >= KEY_F0 && keycode <= KEY_F(63)) { uint16_t f = keycode - KEY_F0; - sprintf(keyname, "F%d", f); + exit_trouble(sprintf(keyname, "F%d", f) < 0, __func__, "sprintf");; } else if ( try_keycode(keycode, keyname, 9, "TAB") || try_keycode(keycode, keyname, 10, "RETURN") @@ -114,87 +114,22 @@ extern char * get_keyname_to_keycode(uint16_t keycode) } else { - sprintf(keyname, "(unknown)"); + exit_trouble(sprintf(keyname, "(unknown)") < 0, __func__, "sprintf"); } return keyname; } -extern void write_keybindings_to_file(FILE * file, struct KeyBindingDB * kbd) -{ - char * f_name = "write_keybindings_to_file()"; - uint16_t linemax = 0; - uint16_t n_kb; - for (n_kb = 0; n_kb < kbd->n_of_kbs; n_kb++) - { - if (strlen(kbd->kbs[n_kb].command->dsc_short) > linemax) - { - linemax = strlen(kbd->kbs[n_kb].command->dsc_short); - } - } - linemax = linemax + 6; /* + 6 = + 3 digits + ' ' + '\n' + '\0' */ - char line[linemax]; - for (n_kb = 0; n_kb < kbd->n_of_kbs; n_kb++) - { - sprintf(line, "%d %s\n", - kbd->kbs[n_kb].keycode, kbd->kbs[n_kb].command->dsc_short); - try_fwrite(line, sizeof(char), strlen(line), file, f_name); - } - try_fwrite(world.delim, strlen(world.delim), 1, file, f_name); -} - - - -extern void read_keybindings_from_file(char * line, uint32_t linemax, - FILE * file, struct KeyBindingDB * kbdb) -{ - char * context = "Failed reading keybindings from interface config file. "; - char * err_space = "Line illegally ends in whitespace."; - char * err_nospace = "No whitespace found in line."; - char * err_int = "Line starts not with a decimal number in digits."; - char * err_toolarge = "Keycode number too large, must be below 1000."; - char * err_cmd = "No such command in command DB."; - kbdb->n_of_kbs = 0; - while (1) - { - err_try_fgets(line, linemax, file, context, "0nf"); - if (!strcmp(world.delim, line)) - { - break; - } - err_line(' ' == line[strlen(line) - 2], line, context, err_space); - char * ptr_space; - err_line(!(ptr_space = strchr(line, ' ')), line, context, err_nospace); - uint8_t i = 0; - err_line(0 == (ptr_space - line), line, context, err_int); - for (; i < (ptr_space - line); i++) - { - err_line(line[i] < '0' || '9' < line[i], line, context, err_int); - } - err_line(i > 3, line, context, err_toolarge); - - struct KeyBinding kb; - line[strlen(line) - 1] = '\0'; - kb.command = get_command(ptr_space + 1); - err_line(!(kb.command), line, context, err_cmd); - kb.keycode = atoi(line); - array_append(kbdb->n_of_kbs, sizeof(struct KeyBinding), (void *) &kb, - (void **) kbdb); - kbdb->n_of_kbs++; - } -} - - - extern void mod_selected_keyb(char kb_c) { struct KeyBindingDB * kbdb = char_selected_kb_db(kb_c); kbdb->edit = 1; draw_all_wins(); cbreak(); + timeout(-1); int keycode = getch(); - halfdelay(world.halfdelay); + timeout(0); if (keycode < 1000) { kbdb->kbs[kbdb->select].keycode = keycode;