From 53cd30c54cb8f98aa8da94aaa8466c1c697da174 Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Thu, 6 Oct 2016 08:53:38 +0300 Subject: [PATCH] Show menu control keys in help menu --- include/extern.h | 2 ++ src/cmd.c | 4 ++- src/options.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++--------- src/pager.c | 10 ++++++ 4 files changed, 93 insertions(+), 16 deletions(-) diff --git a/include/extern.h b/include/extern.h index 7442d998..451b8b1d 100644 --- a/include/extern.h +++ b/include/extern.h @@ -1670,7 +1670,9 @@ E int FDECL(choose_classes_menu, (const char *, int, BOOLEAN_P, char *, char *)); E void FDECL(parsebindings, (char *)); E void FDECL(add_menu_cmd_alias, (CHAR_P, CHAR_P)); +E char FDECL(get_menu_cmd_key, (CHAR_P)); E char FDECL(map_menu_cmd, (CHAR_P)); +E void FDECL(show_menu_controls, (winid, boolean)); E void FDECL(assign_warnings, (uchar *)); E char *FDECL(nh_getenv, (const char *)); E void FDECL(set_duplicate_opt_detection, (int)); diff --git a/src/cmd.c b/src/cmd.c index e40150e1..e2c89b6b 100644 --- a/src/cmd.c +++ b/src/cmd.c @@ -3010,6 +3010,9 @@ dokeylist(VOID_ARGS) keys_used[(uchar)C('c')] = TRUE; #endif + putstr(datawin, 0, ""); + show_menu_controls(datawin, TRUE); + if (dokeylist_putcmds(datawin, TRUE, GENERALCMD, WIZMODECMD, &keys_used)) { putstr(datawin, 0, ""); putstr(datawin, 0, "General commands:"); @@ -4193,7 +4196,6 @@ boolean nodiag; }; } - STATIC_OVL boolean help_dir(sym, msg) char sym; diff --git a/src/options.c b/src/options.c index 53d64a66..2d30ba03 100644 --- a/src/options.c +++ b/src/options.c @@ -469,21 +469,21 @@ static char def_inv_order[MAXOCLASSES] = { typedef struct { const char *name; char cmd; + const char *desc; } menu_cmd_t; -#define NUM_MENU_CMDS 11 -static const menu_cmd_t default_menu_cmd_info[NUM_MENU_CMDS] = { -/* 0*/ { "menu_first_page", MENU_FIRST_PAGE }, - { "menu_last_page", MENU_LAST_PAGE }, - { "menu_next_page", MENU_NEXT_PAGE }, - { "menu_previous_page", MENU_PREVIOUS_PAGE }, - { "menu_select_all", MENU_SELECT_ALL }, -/* 5*/ { "menu_deselect_all", MENU_UNSELECT_ALL }, - { "menu_invert_all", MENU_INVERT_ALL }, - { "menu_select_page", MENU_SELECT_PAGE }, - { "menu_deselect_page", MENU_UNSELECT_PAGE }, - { "menu_invert_page", MENU_INVERT_PAGE }, -/*10*/ { "menu_search", MENU_SEARCH }, +static const menu_cmd_t default_menu_cmd_info[] = { + { "menu_first_page", MENU_FIRST_PAGE, "Go to first page" }, + { "menu_last_page", MENU_LAST_PAGE, "Go to last page" }, + { "menu_next_page", MENU_NEXT_PAGE, "Go to next page" }, + { "menu_previous_page", MENU_PREVIOUS_PAGE, "Go to previous page" }, + { "menu_select_all", MENU_SELECT_ALL, "Select all items" }, + { "menu_deselect_all", MENU_UNSELECT_ALL, "Unselect all items" }, + { "menu_invert_all", MENU_INVERT_ALL, "Insert selection" }, + { "menu_select_page", MENU_SELECT_PAGE, "Select items in current page" }, + { "menu_deselect_page", MENU_UNSELECT_PAGE, "Unselect items in current page" }, + { "menu_invert_page", MENU_INVERT_PAGE, "Invert current page selection" }, + { "menu_search", MENU_SEARCH, "Search and toggle matching items" }, }; /* @@ -3237,7 +3237,7 @@ boolean tinitial, tfrom_file; } /* check for menu command mapping */ - for (i = 0; i < NUM_MENU_CMDS; i++) { + for (i = 0; i < SIZE(default_menu_cmd_info); i++) { fullname = default_menu_cmd_info[i].name; if (duplicate) complain_about_duplicate(opts, 1); @@ -3512,7 +3512,7 @@ char* bindings; return; /* is it a menu command? */ - for (i = 0; i < NUM_MENU_CMDS; i++) { + for (i = 0; i < SIZE(default_menu_cmd_info); i++) { if (!strcmp(default_menu_cmd_info[i].name, bind)) { if (illegal_menu_cmd_key(key)) { char tmp[BUFSZ]; @@ -3578,6 +3578,18 @@ char from_ch, to_ch; } } +char +get_menu_cmd_key(ch) +char ch; +{ + char *found = index(mapped_menu_op, ch); + if (found) { + int idx = (int) (found - mapped_menu_op); + ch = mapped_menu_cmds[idx]; + } + return ch; +} + /* * Map the given character to its corresponding menu command. If it * doesn't match anything, just return the original. @@ -3594,6 +3606,57 @@ char ch; return ch; } +void +show_menu_controls(win, dolist) +winid win; +boolean dolist; +{ + char buf[BUFSZ]; + + putstr(win, 0, "Menu control keys:"); + if (dolist) { + int i; + for (i = 0; i < SIZE(default_menu_cmd_info); i++) { + Sprintf(buf, "%-8s %s", + visctrl(get_menu_cmd_key(default_menu_cmd_info[i].cmd)), + default_menu_cmd_info[i].desc); + putstr(win, 0, buf); + } + } else { + putstr(win, 0, ""); + putstr(win, 0, " Page All items"); + Sprintf(buf, " Select %s %s", + visctrl(get_menu_cmd_key(MENU_SELECT_PAGE)), + visctrl(get_menu_cmd_key(MENU_SELECT_ALL))); + putstr(win, 0, buf); + Sprintf(buf, "Deselect %s %s", + visctrl(get_menu_cmd_key(MENU_UNSELECT_PAGE)), + visctrl(get_menu_cmd_key(MENU_UNSELECT_ALL))); + putstr(win, 0, buf); + Sprintf(buf, " Invert %s %s", + visctrl(get_menu_cmd_key(MENU_INVERT_PAGE)), + visctrl(get_menu_cmd_key(MENU_INVERT_ALL))); + putstr(win, 0, buf); + putstr(win, 0, ""); + Sprintf(buf, " Go to %s Next page", + visctrl(get_menu_cmd_key(MENU_NEXT_PAGE))); + putstr(win, 0, buf); + Sprintf(buf, " %s Previous page", + visctrl(get_menu_cmd_key(MENU_PREVIOUS_PAGE))); + putstr(win, 0, buf); + Sprintf(buf, " %s First page", + visctrl(get_menu_cmd_key(MENU_FIRST_PAGE))); + putstr(win, 0, buf); + Sprintf(buf, " %s Last page", + visctrl(get_menu_cmd_key(MENU_LAST_PAGE))); + putstr(win, 0, buf); + putstr(win, 0, ""); + Sprintf(buf, " %s Search and toggle matching entries", + visctrl(get_menu_cmd_key(MENU_SEARCH))); + putstr(win, 0, buf); + } +} + #if defined(MICRO) || defined(MAC) || defined(WIN32) #define OPTIONS_HEADING "OPTIONS" #else diff --git a/src/pager.c b/src/pager.c index 47374f0a..c14a49bf 100644 --- a/src/pager.c +++ b/src/pager.c @@ -1720,6 +1720,15 @@ hmenu_doextlist() (void) doextlist(); } +void +domenucontrols() +{ + winid cwin = create_nhwindow(NHW_TEXT); + show_menu_controls(cwin, FALSE); + display_nhwindow(cwin, FALSE); + destroy_nhwindow(cwin); +} + /* data for dohelp() */ static struct { void (*f)(); @@ -1735,6 +1744,7 @@ static struct { { dispfile_optionfile, "Longer explanation of game options." }, { dokeylist, "Full list of keyboard commands" }, { hmenu_doextlist, "List of extended commands." }, + { domenucontrols, "List menu control keys" }, { dispfile_license, "The NetHack license." }, { docontact, "Support information." }, #ifdef PORT_HELP -- 2.11.4.GIT