X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fclient%2Fkeybindings.c;h=fc371e866501f7caf9777f021cda9aa2a074e1df;hb=36519c3ce33ac973889e92971abded12b51f04db;hp=e57e3612c2f21e13e97f4568da08f78a6a764c94;hpb=e8e8f91cff96eebc1b440df18d9c3ef4ced1ca60;p=plomrogue diff --git a/src/client/keybindings.c b/src/client/keybindings.c index e57e361..fc371e8 100644 --- a/src/client/keybindings.c +++ b/src/client/keybindings.c @@ -1,26 +1,22 @@ -/* 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 /* FILE, sprintf(), snprintf() */ #include /* uint8_t, uint16_t, uint32_t */ -#include /* free(), atoi() */ -#include /* strlen(), strchr(), strcmp() */ -#include "../common/readwrite.h" /* textfile_sizes(), try_fgets(),try_fwrite()*/ +#include /* FILE, sprintf() */ +#include "../common/rexit.h" /* exit_trouble() */ #include "../common/try_malloc.h" /* try_malloc() */ -#include "wincontrol.h" /* get_winconf_by_win() */ #include "windows.h" /* draw_all_wins() */ #include "world.h" /* global world */ +struct Command; - -/* Return "n"-th keybinding in keybindings chain from "kb_p" on. */ -static struct KeyBinding * get_keyb_of_n(struct KeyBinding * kb_p, uint16_t n); - -/* Return number of keybindings in keybindings chain from "kb_p" on. */ -static uint16_t get_n_of_keybs(struct KeyBinding * kb_p); - /* Return pointer to global keybindings or to keybindings for wingeometry config * (c = "g") or winkeys config (c = "k") or active window's keybindings ("w"). */ @@ -34,58 +30,24 @@ static uint8_t try_keycode(uint16_t keycode_given, char * keyname, -static struct KeyBinding * get_keyb_of_n(struct KeyBinding * kb_p, uint16_t n) -{ - uint16_t i = 0; - while (1) - { - if (n == i) - { - break; - } - i++; - kb_p = kb_p->next; - } - return kb_p; -} - - - -static uint16_t get_n_of_keybs(struct KeyBinding * kb_p) -{ - uint16_t i = 0; - while (1) - { - if (0 == kb_p) - { - break; - } - i++; - kb_p = kb_p->next; - } - return i; -} - - - static struct KeyBindingDB * char_selected_kb_db(char c) { - struct KeyBindingDB * kbd; - kbd = &world.kb_global; + struct KeyBindingDB * kbdb; + kbdb = &world.kb_global; if ('g' == c) { - kbd = &world.kb_wingeom; + kbdb = &world.kb_wingeom; } else if ('k' == c) { - kbd = &world.kb_winkeys; + kbdb = &world.kb_winkeys; } else if ('w' == c) { - struct WinConf * wc = get_winconf_by_win(world.wmeta.active); - kbd = &wc->kb; + struct Win * w = get_win_by_id(world.winDB.active); + kbdb = &w->kb; } - return kbd; + return kbdb; } @@ -95,7 +57,8 @@ static uint8_t try_keycode(uint16_t keycode_given, char * keyname, { if (keycode_given == keycode_match) { - sprintf(keyname, keyname_match); + int test = sprintf(keyname, "%s", keyname_match); + exit_trouble(test < 0, __func__, "sprintf"); return 1; } return 0; @@ -103,16 +66,16 @@ static uint8_t try_keycode(uint16_t keycode_given, char * keyname, -extern struct Command * get_command_to_keycode(struct KeyBinding * kb_p, - uint16_t key) +extern struct Command * get_command_to_keycode(struct KeyBindingDB * kbdb, + uint16_t keycode) { - while (0 != kb_p) + uint8_t n_kb; + for (n_kb = 0; n_kb < kbdb->n_of_kbs; n_kb++) { - if (key == kb_p->key) + if (keycode == kbdb->kbs[n_kb].keycode) { - return kb_p->command; + return kbdb->kbs[n_kb].command; } - kb_p = kb_p->next; } return NULL; } @@ -121,16 +84,15 @@ extern struct Command * get_command_to_keycode(struct KeyBinding * kb_p, 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") @@ -152,112 +114,40 @@ 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 * delim) -{ - char * f_name = "write_keybindings_to_file()"; - uint16_t linemax = 0; - struct KeyBinding * kb_p = kbd->kbs; - while (0 != kb_p) - { - if (strlen(kb_p->command->dsc_short) > linemax) - { - linemax = strlen(kb_p->command->dsc_short); - } - kb_p = kb_p->next; - } - linemax = linemax + 6; /* + 6 = + 3 digits + ' ' + '\n' + '\0' */ - char line[linemax]; - kb_p = kbd->kbs; - while (0 != kb_p) - { - sprintf(line, "%d %s\n", kb_p->key, kb_p->command->dsc_short); - try_fwrite(line, sizeof(char), strlen(line), file, f_name); - kb_p = kb_p->next; - } - try_fwrite(delim, strlen(delim), 1, file, f_name); -} - - - -extern void read_keybindings_from_file(char * line, uint32_t linemax, - FILE * file, struct KeyBindingDB * kbd) -{ - char * f_name = "read_keybindings_from_file()"; - char * cmdptr; - struct KeyBinding ** loc_last_ptr = &kbd->kbs; - * loc_last_ptr = 0; - while (try_fgets(line, linemax + 1, file, f_name)) - { - if (!strcmp("%\n", line)) - { - break; - } - * loc_last_ptr = try_malloc(sizeof(struct KeyBinding), f_name); - struct KeyBinding * kb_p = * loc_last_ptr; - kb_p->next = 0; - kb_p->key = atoi(line); - cmdptr = strchr(line, ' ') + 1; - cmdptr[strlen(cmdptr) - 1] = '\0'; - kb_p->command = get_command(cmdptr); - loc_last_ptr = & kb_p->next; - } - kbd->edit = 0; - kbd->select = 0; -} - - - -extern void free_keybindings(struct KeyBinding * kb_start) -{ - if (0 == kb_start) - { - return; - } - struct KeyBinding * kb_p = kb_start->next; - if (0 != kb_p) - { - free_keybindings(kb_p); - } - free(kb_start); -} - - - extern void mod_selected_keyb(char kb_c) { - struct KeyBindingDB * kbd = char_selected_kb_db(kb_c); - kbd->edit = 1; + struct KeyBindingDB * kbdb = char_selected_kb_db(kb_c); + kbdb->edit = 1; draw_all_wins(); cbreak(); - int key = getch(); - halfdelay(world.halfdelay); - if (key < 1000) + timeout(-1); + int keycode = getch(); + timeout(0); + if (keycode < 1000) { - struct KeyBinding * kb_p = get_keyb_of_n(kbd->kbs, kbd->select); - kb_p->key = key; + kbdb->kbs[kbdb->select].keycode = keycode; } - kbd->edit = 0; + kbdb->edit = 0; } extern void move_keyb_selection(char kb_c, char dir) { - struct KeyBindingDB * kbd = char_selected_kb_db(kb_c); - if ('u' == dir && kbd->select > 0) + struct KeyBindingDB * kbdb = char_selected_kb_db(kb_c); + if ('u' == dir && kbdb->select > 0) { - kbd->select--; + kbdb->select--; } - else if ('d' == dir && kbd->select < get_n_of_keybs(kbd->kbs) - 1) + else if ('d' == dir && kbdb->select < kbdb->n_of_kbs - 1) { - kbd->select++; + kbdb->select++; } }