home · contact · privacy
Server/py: Some more mem map handling fixes …
[plomrogue] / src / client / keybindings.c
index 29e6c05c8150b349cb8a5a9246969a33585c4e96..fc371e866501f7caf9777f021cda9aa2a074e1df 100644 (file)
@@ -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 <ncurses.h> /* keycode defines, cbreak(), halfdelay(), getch() */
+#include <ncurses.h> /* keycode defines, cbreak(), getch(), timeout() */
 #include <stddef.h> /* NULL */
 #include <stdint.h> /* uint8_t, uint16_t, uint32_t */
 #include <stdio.h> /* FILE, sprintf() */
-#include <stdlib.h> /* atoi() */
-#include <string.h> /* 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(10, f_name);        /* max keyname length + 1 */
+    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;