home · contact · privacy
New window "Available keys" shows keybindings available on current selection.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 17 Sep 2013 01:13:24 +0000 (03:13 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 17 Sep 2013 01:13:24 +0000 (03:13 +0200)
README
config/commands
config/keybindings_global
config/windows/Win_k [new file with mode: 0644]
config/windows/toggle_order
src/control.c
src/draw_wins.c
src/draw_wins.h
src/wincontrol.c

diff --git a/README b/README
index 8a73d7f7e36276e88bd41c839d2ca2f7e80cf4f4..8a9f93d1fbc816042e52a299ce669511ad6c3805 100644 (file)
--- a/README
+++ b/README
@@ -28,14 +28,18 @@ make
 Keybindings and window configuration
 ------------------------------------
 
-In the default window configuration, globally available keybinings are shown at
-game start in the three windows on the left of the screen. The lower two windows
-describe keybindings / actions only available in a window's window configuration
-views -- hit "w" (per default keybindings) to switch the selected / "active"
-window to a view that allows changing its geometry. One further hit on "w"
-switches the window to a view that lists keybindings available specifically for
-that window -- such as for map scrolling actions in the "map" window. All
-keybindings can be changed.
+In the default window configuration, the window appearing on the left sports a
+list of keybindings available globally and additionally via the window currently
+selected as active.
+
+Hit "w" (per default keybindings) to switch the "active" window to a view that
+allows changing its geometry. One further hit on "w" switches the window to a
+view that allows changing its window-specific keybindings. The global
+keybindings may be changed in the "Global keys" window, those of the window
+geometry configuration in the "Window geometry keys" window" and those of the
+window-specific keybindings configuration in the "Window keybinding keys"
+window; by default, these three windows are not visible, but may be turned on by
+hitting the "F5", "F6" and "F7" keys.
 
 What actions are available globally or only in specific windows can be further
 manipulated by editing the files config/keybindings_global and
index 0798687e3306bea6ffb69e95790821dd3afdf230..50da77c01683dfd2e9beab5bd21317d8aa0c6d06 100644 (file)
@@ -43,3 +43,4 @@
 43 map_l map left
 44 map_r map right
 45 map_c map center player
+46 to_a_keywin toggle view of available keybindings
index f2723023d12f562c2b8c7832845d75b9e8df3d79..68c9b89e0ccd325cb82271a6260e78c1bb799250 100644 (file)
@@ -4,12 +4,13 @@
 106 player_d
 104 player_l
 108 player_r
-265 to_g_keywin
-266 to_wg_keywin
-267 to_wk_keywin
-268 to_mapwin
-269 to_infowin
-270 to_logwin
+265 to_a_keywin
+266 to_mapwin
+267 to_infowin
+268 to_logwin
+269 to_g_keywin
+270 to_wg_keywin
+271 to_wk_keywin
 119 winconf
 62 cyc_win_f
 60 cyc_win_b
diff --git a/config/windows/Win_k b/config/windows/Win_k
new file mode 100644 (file)
index 0000000..ca67a5f
--- /dev/null
@@ -0,0 +1,4 @@
+Available keys
+k
+0
+29
index 0ee8c5e6f3ea41478c570d2ef645ff54fdaca40f..0b431e986ec3c367255d43c72b706180aa8a0aeb 100644 (file)
@@ -1 +1 @@
-012mil
+kmil
index a4479cefbf10c7a797f901c5f7296783432de9e7..c1e295f2adfdbbf8f024c6067acd1f73ef65c964 100644 (file)
@@ -206,6 +206,11 @@ extern uint8_t meta_control(int key, struct World * world)
     {
         scroll_pad(win_meta, '-');
     }
+    else if (key == get_available_keycode_to_action(world, "to_a_keywin"))
+    {
+        uint8_t test = toggle_window(win_meta, get_win_by_id(world, 'k'));
+        exit_err(test, world, err_toggle);
+    }
     else if (key == get_available_keycode_to_action(world, "to_g_keywin"))
     {
         exit_err(toggle_window(win_meta, win_keys), world, err_toggle);
index f0397d9fa90fa02da4ae01836163d6f0ab6ad9ca..5b6de1bfc5aa145aae40cd4f1b66bd28bbca99bf 100644 (file)
 
 
 
-/* Write "text" into window "win" as far as possible. Start on row "start_y". */
+/* Write "text" into window "win" as far as possible. Start on row "start_y".
+ * Break lines at newlines.
+ */
 static void draw_with_linebreaks(struct Win * win, char * text,
                                  uint16_t start_y);
 
+/* Write "line" into window "win" at line "y" as far as it fits into it. */
+static void draw_line(struct Win * win, uint16_t y, char * line);
+
 /* Write "text" not starting from the top but from the bottom of "win". */
 static void draw_text_from_bottom(struct Win * win, char * text);
 
@@ -32,6 +37,17 @@ static void draw_map_objects(struct World * world, struct MapObj * start,
 static void draw_kb_view(struct World * world, struct Win * win,
                          char * f_name, struct KeyBiData * kb, uint8_t start);
 
+/* Draw into window "win" from line "start" on a "title" followed by an empty
+ * line followed by a list of all keybindings starting at kb_p.
+ */
+static uint16_t draw_titled_keybinding_list(struct World * world,
+                                            struct Win * win, uint16_t start,
+                                            char * title,
+                                            struct KeyBinding * kb_p);
+
+
+
+
 
 
 static void draw_with_linebreaks(struct Win * win, char * text,
@@ -78,6 +94,17 @@ static void draw_with_linebreaks(struct Win * win, char * text,
 
 
 
+static void draw_line(struct Win * win, uint16_t y, char * line)
+{
+    uint16_t x = 0;
+    for (; x < win->frame.size.x && x < strlen(line); x++)
+    {
+        mvwaddch(win->frame.curses_win, y, x, line[x]);
+    }
+}
+
+
+
 static void draw_text_from_bottom (struct Win * win, char * text)
 {
     /* Determine number of lines text would have in a window of win's width,
@@ -233,6 +260,51 @@ static void draw_kb_view(struct World * world, struct Win * win,
 
 
 
+static uint16_t draw_titled_keybinding_list(struct World * world,
+                                            struct Win * win, uint16_t start,
+                                            char * title,
+                                            struct KeyBinding * kb_p)
+{
+    uint16_t x, y;
+    uint16_t i = 0;
+    uint8_t state = 0;
+    for (y = start; y < win->frame.size.y && (0 == state || 0 != kb_p); y++)
+    {
+        if (0 == state)
+        {
+            for (x = 0; x < win->frame.size.x; x++)
+            {
+                if (i == strlen(title))
+                {
+                    y++;
+                    state = 1 + (0 == kb_p);
+                    i = 0;
+                    break;
+                }
+                mvwaddch(win->frame.curses_win, y, x, title[i]);
+                i++;
+            }
+            continue;
+        }
+        char * keyname = get_name_to_keycode(world, kb_p->key);
+        char * cmd_dsc = get_command_longdsc(world, kb_p->name);
+        char line[9 + 1 + strlen(cmd_dsc) + 1];
+        sprintf(line, "%-9s %s", keyname, cmd_dsc);
+        free(keyname);
+        kb_p = kb_p->next;
+        draw_line(win, y, line);
+    }
+    if (2 == state)
+    {
+        char * line = "(none)";
+        draw_line(win, y, line);
+        y++;
+    }
+    return y;
+}
+
+
+
 extern void draw_win_log(struct Win * win)
 {
     struct World * world = (struct World *) win->data;
@@ -295,6 +367,31 @@ extern void draw_win_info(struct Win * win)
 
 
 
+extern void draw_win_available_keybindings(struct Win * win)
+{
+    struct World * world = (struct World *) win->data;
+    char * title = "Active window's keybindings:";
+    struct KeyBinding * kb_p;
+    struct WinConf * wc = get_winconf_by_win(world, 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(world, win, 0, title, kb_p);
+    draw_titled_keybinding_list(world, win, offset + 1, "Global keybindings:",
+                                world->kb_global.kbs);
+}
+
+
+
 extern void draw_win_keybindings_global(struct Win * win)
 {
     char * f_name = "draw_win_keybindings_global()";
@@ -329,7 +426,7 @@ extern void draw_winconf_keybindings(struct Win * win)
     struct WinConf * wc = get_winconf_by_win(world, win);
     char * title = "Window's keybindings:";
     uint8_t title_space = strlen(title) / win->frame.size.x + 2;
-    mvwaddstr(win->frame.curses_win, 0, 0, "Window's keybindings:");
+    mvwaddstr(win->frame.curses_win, 0, 0, title);
     draw_kb_view(world, win, f_name, &wc->kb, title_space);
 }
 
index d209d8259800e7aa4c8535054703b3c3d6124a6f..c0a156ce625a36d63c37906f3ed1130307469b25 100644 (file)
@@ -17,6 +17,7 @@ struct Win;
 extern void draw_win_log(struct Win * win);
 extern void draw_win_map(struct Win * win);
 extern void draw_win_info(struct Win * win);
+extern void draw_win_available_keybindings(struct Win * win);
 extern void draw_win_keybindings_global(struct Win * win);
 extern void draw_win_keybindings_winconf_geometry(struct Win * win);
 extern void draw_win_keybindings_winconf_keybindings(struct Win * win);
index 6095d36a7a25dcd17f9888d0566edbea1929ce66..0fbb33c1f65df110a0ede3e4fda953540d911c22 100644 (file)
@@ -17,6 +17,7 @@
 #include "rexit.h" /* for exit_err() */
 #include "main.h" /* for World struct */
 #include "draw_wins.h" /* for draw_win_map(), draw_win_info(), draw_win_og(),
+                        * draw_win_available_keybindings(),
                         * draw_win_keybindings_global(),
                         * draw_win_keybindings_winconf_geometry(),
                         * draw_win_keybindings_winconf_keybindings(),
@@ -287,6 +288,10 @@ static void * get_drawfunc_by_char(char c)
     {
         return draw_win_map;
     }
+    else if ('k' == c)
+    {
+        return draw_win_available_keybindings;
+    }
     else if ('0' == c)
     {
         return draw_win_keybindings_global;