home · contact · privacy
In client, keybinding databases now store keybindings as arrays instead
[plomrogue] / src / client / draw_wins.c
index 1ad1ab2e20d0918723e3553da5f8d63469ac7577..46ef8ed93e838fbf30889a71c0b8beef708342fa 100644 (file)
@@ -2,15 +2,14 @@
 
 #include "draw_wins.h"
 #include <ncurses.h> /* attri_t, chtype */
+#include <stddef.h> /* NULL */
 #include <stdint.h> /* uint8_t, uint16_t, uint32_t, int16_t */
 #include <stdio.h> /* for sprintf() */
 #include <stdlib.h> /* free() */
 #include <string.h> /* strlen(), strtok() */
-#include "../common/try_malloc.h" /* for try_malloc() */
-#include "command_db.h" /* get_command_data() */
+#include "../common/try_malloc.h" /* try_malloc() */
 #include "keybindings.h" /* struct KeyBinding, get_keyname_to_keycode() */
-#include "wincontrol.h" /* struct WinConf, get_winconf_by_win() */
-#include "windows.h" /* struct Win */
+#include "windows.h" /* struct Win, get_win_by_id() */
 #include "world.h" /* global world */
 
 
@@ -39,36 +38,36 @@ static void add_line(struct Win * w, char * line, attr_t attri);
  */
 static void draw_text_from_bottom(struct Win * win, char * text);
 
-/* Return keybinding list line via "kb_pp", iterate pointer pointed to by it. */
-static char * get_kb_line_and_iterate(struct KeyBinding ** kb_pp);
+/* Return a properly formatted keybinding list line for "kb". */
+static char * get_kb_line(struct KeyBinding * kb);
 
 /* Draw from line "start" on config view for keybindings defined at "kb". */
 static void draw_keybinding_config(struct Win * w, struct KeyBindingDB * kb,
                                    uint8_t start);
 
 /* Draw into window "w" from line "start" on a "title" followed by an empty
- * line followed by a list of all keybindings starting at kb_p.
+ * line followed by a list of all keybindings starting in "kbdb".
  */
 static uint16_t draw_titled_keybinding_list(char * title, struct Win * w,
                                             uint16_t start,
-                                            struct KeyBinding * kb_p);
+                                            struct KeyBindingDB * kbdb);
 
 
 
 static void try_resize_winmap(struct Win * w, int new_size_y, int new_size_x)
 {
     char * f_name = "try_resize_winmap()";
-    if (w->winmapsize.y >= new_size_y && w->winmapsize.x >= new_size_x)
+    if (w->winmap_size.y >= new_size_y && w->winmap_size.x >= new_size_x)
     {
         return;
     }
-    if      (w->winmapsize.y > new_size_y)
+    if      (w->winmap_size.y > new_size_y)
     {
-        new_size_y = w->winmapsize.y;
+        new_size_y = w->winmap_size.y;
     }
-    else if (w->winmapsize.x > new_size_x)
+    else if (w->winmap_size.x > new_size_x)
     {
-        new_size_x = w->winmapsize.x;
+        new_size_x = w->winmap_size.x;
     }
     chtype * old_winmap = w->winmap;
     uint32_t new_size = sizeof(chtype) * new_size_y * new_size_x;
@@ -76,9 +75,9 @@ static void try_resize_winmap(struct Win * w, int new_size_y, int new_size_x)
     uint16_t y, x;
     for (y = 0; y < new_size_y; y++)
     {
-        for (x = 0; y < w->winmapsize.y && x < w->winmapsize.x; x++)
+        for (x = 0; y < w->winmap_size.y && x < w->winmap_size.x; x++)
         {
-            chtype ch = old_winmap[(y * w->winmapsize.x) + x];
+            chtype ch = old_winmap[(y * w->winmap_size.x) + x];
             w->winmap[(y * new_size_x) + x] = ch;
         }
         for (; x < new_size_x; x++)
@@ -87,15 +86,15 @@ static void try_resize_winmap(struct Win * w, int new_size_y, int new_size_x)
         }
     }
     free(old_winmap);
-    w->winmapsize.y = new_size_y;
-    w->winmapsize.x = new_size_x;
+    w->winmap_size.y = new_size_y;
+    w->winmap_size.x = new_size_x;
 }
 
 
 
 static void set_ch_on_yx(struct Win * w, int y, int x, chtype ch)
 {
-    w->winmap[(y * w->winmapsize.x) + x] = ch;
+    w->winmap[(y * w->winmap_size.x) + x] = ch;
 }
 
 
@@ -104,10 +103,10 @@ static void add_text_with_linebreaks(struct Win * win, char * text)
 {
     uint16_t x, y;
     int16_t z = -1;
-    for (y = win->winmapsize.y; ; y++)
+    for (y = win->winmap_size.y; ; y++)
     {
-        try_resize_winmap(win, y + 1, win->framesize.x);
-        for (x = 0; x < win->framesize.x; x++)
+        try_resize_winmap(win, y + 1, win->frame_size.x);
+        for (x = 0; x < win->frame_size.x; x++)
         {
             z++;
             if      ('\n' == text[z])
@@ -139,12 +138,12 @@ static void add_text_with_linebreaks(struct Win * win, char * text)
 
 static void add_line(struct Win * w, char * line, attr_t attri)
 {
-    uint16_t y = w->winmapsize.y;
+    uint16_t y = w->winmap_size.y;
     uint16_t len_line = strlen(line);
     if (attri
-        && w->winmapsize.x < w->framesize.x && w->framesize.x > len_line)
+        && w->winmap_size.x < w->frame_size.x && w->frame_size.x > len_line)
     {
-        try_resize_winmap(w, y + 1, w->framesize.x);
+        try_resize_winmap(w, y + 1, w->frame_size.x);
     }
     else
     {
@@ -157,7 +156,7 @@ static void add_line(struct Win * w, char * line, attr_t attri)
     }
     if (attri)
     {
-        for (; x < w->framesize.x; x++)
+        for (; x < w->frame_size.x; x++)
         {
             set_ch_on_yx(w, y, x, ' ' | attri);
         }
@@ -177,7 +176,7 @@ static void draw_text_from_bottom(struct Win * win, char * text)
     int16_t z = -1;
     for (y = 0; 0 == toggle; y++)
     {
-        for (x = 0; x < win->framesize.x; x++)
+        for (x = 0; x < win->frame_size.x; x++)
         {
             z++;
             if ('\n' == text[z])
@@ -200,16 +199,16 @@ static void draw_text_from_bottom(struct Win * win, char * text)
 
     /* Depending on what's bigger, determine start point in window or text. */
     uint16_t start_y = 0;
-    if (y < win->framesize.y)
+    if (y < win->frame_size.y)
     {
-        start_y = win->framesize.y - y;
+        start_y = win->frame_size.y - y;
     }
-    else if (y > win->framesize.y)
+    else if (y > win->frame_size.y)
     {
-        uint16_t offset = y - win->framesize.y;
+        uint16_t offset = y - win->frame_size.y;
         for (y = 0; y < offset; y++)
         {
-            for (x = 0; x < win->framesize.x; x++)
+            for (x = 0; x < win->frame_size.x; x++)
             {
                 z++;
                 if ('\n' == text[z])
@@ -232,45 +231,40 @@ static void draw_text_from_bottom(struct Win * win, char * text)
 
 
 
-static char * get_kb_line_and_iterate(struct KeyBinding ** kb_pp)
+static char * get_kb_line(struct KeyBinding * kb)
 {
-    char * f_name = "get_kb_line_and_iterate()";
-    struct KeyBinding * kb_p = * kb_pp;
-    char * keyname = get_keyname_to_keycode(kb_p->key);
-    struct Command * command_data = get_command_data(kb_p->command);
-    char * cmd_dsc = command_data->dsc_long;
-    uint16_t size = 9 + 1 + strlen(cmd_dsc) + 1;
-    char * line = try_malloc(size, f_name);
-    sprintf(line, "%-9s %s", keyname, cmd_dsc);
+    char * f_name = "get_kb_line()";
+    char * keyname = get_keyname_to_keycode(kb->keycode);
+    uint16_t size = 9 + 1 + strlen(kb->command->dsc_long) + 1;
+    char * kb_line = try_malloc(size, f_name);
+    sprintf(kb_line, "%-9s %s", keyname, kb->command->dsc_long);
     free(keyname);
-    * kb_pp = kb_p->next;
-    return line;
+    return kb_line;
 }
 
 
 
-static void draw_keybinding_config(struct Win * w, struct KeyBindingDB * kb,
+static void draw_keybinding_config(struct Win * w, struct KeyBindingDB * kbdb,
                                    uint8_t start)
 {
-    if (0 == kb->kbs)
+    if (0 == kbdb->n_of_kbs)
     {
         add_line(w, "(none)", 0);
         return;
     }
-    struct KeyBinding * kb_p = kb->kbs;
-    uint16_t y;
-    for (y = start; 0 != kb_p; y++)
+    uint16_t y, kb_n;
+    for (y = start, kb_n = 0; kb_n < kbdb->n_of_kbs; y++, kb_n++)
     {
         attr_t attri = 0;
-        if (y - start == kb->select)
+        if (y - start == kbdb->select)
         {
             attri = A_REVERSE;
-            if (1 == kb->edit)
+            if (1 == kbdb->edit)
             {
                 attri = attri | A_BLINK;
             }
         }
-        char * kb_line = get_kb_line_and_iterate(&kb_p);
+        char * kb_line = get_kb_line(&kbdb->kbs[kb_n]);
         add_line(w, kb_line, attri);
         free(kb_line);
     }
@@ -280,21 +274,22 @@ static void draw_keybinding_config(struct Win * w, struct KeyBindingDB * kb,
 
 static uint16_t draw_titled_keybinding_list(char * title, struct Win * w,
                                             uint16_t start,
-                                            struct KeyBinding * kb_p)
+                                            struct KeyBindingDB * kbdb)
 {
     uint16_t y;
     uint8_t state = 0;
-    for (y = start; (0 == state || 0 != kb_p); y++)
+    uint16_t kb_n = 0;
+    for (y = start; (0 == state || kb_n < kbdb->n_of_kbs); y++, kb_n++)
     {
         if (0 == state)
         {
             add_line(w, title, 0);
             y++;
             add_line(w, " ", 0);
-            state = 1 + (0 == kb_p);
+            state = 1 + (0 == kbdb->n_of_kbs);
             continue;
         }
-        char * kb_line = get_kb_line_and_iterate(&kb_p);
+        char * kb_line = get_kb_line(&kbdb->kbs[kb_n]);
         add_line(w, kb_line, 0);
         free(kb_line);
     }
@@ -342,14 +337,10 @@ extern void draw_win_info(struct Win * win)
 {
     char * dsc_turn      = "Turn: ";
     char * dsc_hitpoints = "\nHitpoints: ";
-    char * dsc_score     = "\nScore: ";
-    uint16_t maxl = strlen(dsc_turn) + strlen(dsc_hitpoints) + strlen(dsc_score)
-                    + 5 + 3 + 5; /* Max strlens of strings of numbers to use. */
+    uint16_t maxl = strlen(dsc_turn) + 5 + strlen(dsc_hitpoints) + 3;
     char text[maxl + 1];
-    sprintf(text, "%s%d%s%d%s%d",
-            dsc_turn, world.turn,
-            dsc_hitpoints, world.player_lifepoints,
-            dsc_score, world.score);
+    sprintf(text, "%s%d%s%d",
+            dsc_turn, world.turn, dsc_hitpoints, world.player_lifepoints);
     add_text_with_linebreaks(win, text);
 }
 
@@ -360,12 +351,12 @@ extern void draw_win_inventory(struct Win * win)
     win->center.y = world.player_inventory_select;
     char inventory_copy[strlen(world.player_inventory) + 1];
     sprintf(inventory_copy, "%s", world.player_inventory);
-    char * foo = inventory_copy;
+    char * strtok_target = inventory_copy;
     uint8_t i = 0;
     while (1)
     {
-        char * object = strtok(foo, "\n");
-        foo = NULL;
+        char * object = strtok(strtok_target, "\n");
+        strtok_target = NULL;
         if (NULL == object)
         {
             return;
@@ -385,24 +376,24 @@ extern void draw_win_inventory(struct Win * win)
 extern void draw_win_available_keybindings(struct Win * win)
 {
     char * title = "Active window's keybindings:";
-    struct KeyBinding * kb_p;
-    struct WinConf * wc = get_winconf_by_win(world.wmeta.active);
-    if     (0 == wc->view)
+    struct KeyBindingDB * kbdb;
+    struct Win * w = get_win_by_id(world.winDB.active);
+    if     (0 == w->view)
     {
-        kb_p = wc->kb.kbs;
+        kbdb = &w->kb;
     }
-    else if (1 == wc->view)
+    else if (1 == w->view)
     {
-        kb_p = world.kb_wingeom.kbs;
+        kbdb = &world.kb_wingeom;
     }
-    else if (2 == wc->view)
+    else if (2 == w->view)
     {
-        kb_p = world.kb_winkeys.kbs;
+        kbdb = &world.kb_winkeys;
     }
-    uint16_t offset = draw_titled_keybinding_list(title, win, 0, kb_p);
+    uint16_t offset = draw_titled_keybinding_list(title, win, 0, kbdb);
     add_line(win, " ", 0);
-    struct KeyBinding * kbs_glo = world.kb_global.kbs;
-    draw_titled_keybinding_list("Global keybindings", win, offset + 1, kbs_glo);
+    draw_titled_keybinding_list("Global keybindings", win, offset + 1,
+                                &world.kb_global);
 }
 
 
@@ -433,19 +424,17 @@ extern void draw_win_keybindings_winconf_keybindings(struct Win * win)
 
 extern void draw_winconf_keybindings(struct Win * win)
 {
-    struct WinConf * wc = get_winconf_by_win(win);
     char * title = "Window's keybindings:";
     add_line(win, title, 0);
     add_line(win, " ", 0);
-    draw_keybinding_config(win, &wc->kb, 2);
-    win->center.y = wc->kb.select + 2;
+    draw_keybinding_config(win, &win->kb, 2);
+    win->center.y = win->kb.select + 2;
 }
 
 
 
 extern void draw_winconf_geometry(struct Win * win)
 {
-    struct WinConf * wcp = get_winconf_by_win(win);
     char * title = "Window's geometry:\n";
     char * h_d   = "\nHeight to save: ";
     char * h_pos = " (width in cells)";
@@ -455,11 +444,11 @@ extern void draw_winconf_geometry(struct Win * win)
     char * w_neg = " (negative diff: cells to screen height)";
     char * h_t = h_pos;
     char * w_t = w_pos;
-    if (1 == wcp->height_type)
+    if (1 == win->target_height_type)
     {
         h_t = h_neg;
     }
-    if (1 == wcp->width_type)
+    if (1 == win->target_width_type)
     {
         w_t = w_neg;
     }
@@ -467,7 +456,7 @@ extern void draw_winconf_geometry(struct Win * win)
                     + strlen(h_t) + strlen(h_d) + 6      /* 6 = n of chars to */
                     + strlen(w_t) + strlen(w_d) + 6 + 1; /* write max int16_t */
     char text[maxl + 1];
-    sprintf(text, "%s%s%d%s%s%d%s", title, h_d, wcp->height, h_t,
-                                           w_d, wcp->width,  w_t);
+    sprintf(text, "%s%s%d%s%s%d%s", title, h_d, win->target_height, h_t,
+                                           w_d, win->target_width,  w_t);
     add_text_with_linebreaks(win, text);
 }