+ char * kb_line = get_kb_line_and_iterate(&kb_p);
+ add_line(w, kb_line, attri, 1);
+ free(kb_line);
+ }
+}
+
+
+
+static uint16_t draw_titled_keybinding_list(char * title, struct Win * w,
+ uint16_t start,
+ struct KeyBinding * kb_p)
+{
+ uint16_t y;
+ uint8_t state = 0;
+ for (y = start; (0 == state || 0 != kb_p); y++)
+ {
+ if (0 == state)
+ {
+ add_line(w, title, 0, 0);
+ y++;
+ add_line(w, " ", 0, 0);
+ state = 1 + (0 == kb_p);
+ continue;
+ }
+ char * kb_line = get_kb_line_and_iterate(&kb_p);
+ add_line(w, kb_line, 0, 0);
+ free(kb_line);
+ }
+ if (2 == state)
+ {
+ char * none = "(none)";
+ add_line(w, none, 0, 0);
+ y++;
+ }
+ return y;
+}
+
+
+
+extern void draw_win_log(struct Win * win)
+{
+ draw_text_from_bottom(win, world.log);
+}
+
+
+
+extern void draw_win_map(struct Win * win)
+{
+ struct Map * map = world.map;
+ char * cells = map->cells;
+ try_resize_winmap(win, map->size.y, map->size.x);
+ uint16_t z = 0;
+ uint16_t x, y;
+ for (y = 0; y < map->size.y; y++)
+ {
+ for (x = 0; x < map->size.x; x++)
+ {
+ set_ch_on_yx(win, y, x, cells[z]);
+ z++;
+ }
+ }
+ draw_map_objects(world.map_objs, map, win);
+}
+
+
+
+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)
+ + 10 + 5 + 10; /* max strlens of numbers to be used */
+ char text[maxl + 1];
+ struct MapObj * player = get_player();
+ sprintf(text, "%s%d%s%d%s%d",
+ dsc_turn, world.turn,
+ dsc_hitpoints, player->lifepoints,
+ dsc_score, world.score);
+ add_text_with_linebreaks(win, text);
+}
+
+
+
+extern void draw_win_inventory(struct Win * win)
+{
+ struct MapObj * player = get_player();
+ if (NULL == player->owns)
+ {
+ add_line(win, "(none)", 0, 0);
+ return;
+ }
+ win->center.y = world.inventory_select;
+ struct MapObj * owned = player->owns;
+ uint8_t y;
+ for (y = 0; NULL != owned; y++)
+ {
+ attr_t attri = 0;
+ if (y == world.inventory_select)
+ {
+ attri = A_REVERSE;
+ }
+ struct MapObjDef * mod = get_map_object_def(owned->type);
+ add_line(win, mod->name, attri, 0);
+ owned = owned->next;
+ }
+}
+
+
+
+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)
+ {
+ kb_p = wc->kb.kbs;
+ }
+ else if (1 == wc->view)
+ {
+ kb_p = world.kb_wingeom.kbs;
+ }
+ else if (2 == wc->view)
+ {
+ kb_p = world.kb_winkeys.kbs;
+ }
+ uint16_t offset = draw_titled_keybinding_list(title, win, 0, kb_p);
+ add_line(win, " ", 0, 0);
+ struct KeyBinding * kbs_glo = world.kb_global.kbs;
+ draw_titled_keybinding_list("Global keybindings", win, offset + 1, kbs_glo);
+}
+
+
+
+extern void draw_win_keybindings_global(struct Win * win)
+{
+ win->center.y = world.kb_global.select;
+ draw_kb_view(win, &world.kb_global, 0);
+}
+
+
+
+extern void draw_win_keybindings_winconf_geometry(struct Win * win)
+{
+ win->center.y = world.kb_wingeom.select;
+ draw_kb_view(win, &world.kb_wingeom, 0);
+}
+
+
+
+extern void draw_win_keybindings_winconf_keybindings(struct Win * win)
+{
+ win->center.y = world.kb_winkeys.select;
+ draw_kb_view(win, &world.kb_winkeys, 0);
+}
+
+
+
+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, 0);
+ add_line(win, " ", 0, 0);
+ draw_kb_view(win, &wc->kb, 2);
+ win->center.y = wc->kb.select + 2;
+}
+
+
+
+extern void draw_winconf_geometry(struct Win * win)
+{
+ struct WinConf * wcp = get_winconf_by_win(/*&world, */win);
+ char * title = "Window's geometry:\n";
+ char * h_d = "\nHeight to save: ";
+ char * h_pos = " (width in cells)";
+ char * h_neg = " (negative diff: cells to screen width)";
+ char * w_d = "\n\nWidth to save: ";
+ char * w_pos = " (height in cells)";
+ char * w_neg = " (negative diff: cells to screen height)";
+ char * h_t = h_pos;
+ char * w_t = w_pos;
+ if (1 == wcp->height_type)
+ {
+ h_t = h_neg;
+ }
+ if (1 == wcp->width_type)
+ {
+ w_t = w_neg;