add the hardcoded menu control keys to key help

'? k' shows menu controls in a fancy layout and '? i' lists the
same things in basic layout but both only showed the keys that
can be changed via option settings.  Add <return>, <space>, and
<escape> so that all relevant keys are listed together whether
re-bindable or not.  The description of <space> is accurate for
tty and curses but possibly not for other interfaces.

This also reorders how the controls are listed, moving next page
and previous page before first page and last page, and placing
invert between select and deselect rather than after both.
This commit is contained in:
PatR
2020-12-11 05:10:43 -08:00
parent 6e960a4667
commit e2680bfc4a

View File

@@ -1,4 +1,4 @@
/* NetHack 3.7 options.c $NHDT-Date: 1607591206 2020/12/10 09:06:46 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.485 $ */ /* NetHack 3.7 options.c $NHDT-Date: 1607692223 2020/12/11 13:10:23 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.486 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2008. */ /*-Copyright (c) Michael Allison, 2008. */
/* NetHack may be freely redistributed. See license for details. */ /* NetHack may be freely redistributed. See license for details. */
@@ -204,18 +204,19 @@ static NEARDATA const char *runmodes[] = { "teleport", "run", "walk",
static NEARDATA const char *sortltype[] = { "none", "loot", "full" }; static NEARDATA const char *sortltype[] = { "none", "loot", "full" };
static const menu_cmd_t default_menu_cmd_info[] = { 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_next_page", MENU_NEXT_PAGE, "Go to next page" },
{ "menu_previous_page", MENU_PREVIOUS_PAGE, "Go to previous page" }, { "menu_previous_page", MENU_PREVIOUS_PAGE, "Go to previous page" },
{ "menu_select_all", MENU_SELECT_ALL, "Select all items" }, { "menu_first_page", MENU_FIRST_PAGE, "Go to first page" },
{ "menu_deselect_all", MENU_UNSELECT_ALL, "Unselect all items" }, { "menu_last_page", MENU_LAST_PAGE, "Go to last page" },
{ "menu_invert_all", MENU_INVERT_ALL, "Invert selection" }, { "menu_select_all", MENU_SELECT_ALL, "Select all items in entire menu" },
{ "menu_select_page", MENU_SELECT_PAGE, "Select items in current page" }, { "menu_invert_all", MENU_INVERT_ALL, "Invert selection for all items" },
{ "menu_deselect_all", MENU_UNSELECT_ALL,
"Unselect all items in entire menu" },
{ "menu_select_page", MENU_SELECT_PAGE, "Select all items on current page" },
{ "menu_invert_page", MENU_INVERT_PAGE, "Invert current page's selections" },
{ "menu_deselect_page", MENU_UNSELECT_PAGE, { "menu_deselect_page", MENU_UNSELECT_PAGE,
"Unselect items in current page" }, "Unselect all items on current page" },
{ "menu_invert_page", MENU_INVERT_PAGE, "Invert current page selection" }, { "menu_search", MENU_SEARCH, "Search and invert matching items" },
{ "menu_search", MENU_SEARCH, "Search and toggle matching items" },
}; };
static void FDECL(nmcpy, (char *, const char *, int)); static void FDECL(nmcpy, (char *, const char *, int));
@@ -4808,11 +4809,13 @@ handler_disclose(VOID_ARGS)
any.a_char = DISCLOSE_NO_WITHOUT_PROMPT; any.a_char = DISCLOSE_NO_WITHOUT_PROMPT;
add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
"Never disclose, without prompting", "Never disclose, without prompting",
(c == any.a_char) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE); (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
: MENU_ITEMFLAGS_NONE);
any.a_char = DISCLOSE_YES_WITHOUT_PROMPT; any.a_char = DISCLOSE_YES_WITHOUT_PROMPT;
add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
"Always disclose, without prompting", "Always disclose, without prompting",
(c == any.a_char) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE); (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
: MENU_ITEMFLAGS_NONE);
if (*disclosure_names[i] == 'v') { if (*disclosure_names[i] == 'v') {
any.a_char = DISCLOSE_SPECIAL_WITHOUT_PROMPT; /* '#' */ any.a_char = DISCLOSE_SPECIAL_WITHOUT_PROMPT; /* '#' */
add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
@@ -4823,11 +4826,13 @@ handler_disclose(VOID_ARGS)
any.a_char = DISCLOSE_PROMPT_DEFAULT_NO; any.a_char = DISCLOSE_PROMPT_DEFAULT_NO;
add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
"Prompt, with default answer of \"No\"", "Prompt, with default answer of \"No\"",
(c == any.a_char) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE); (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
: MENU_ITEMFLAGS_NONE);
any.a_char = DISCLOSE_PROMPT_DEFAULT_YES; any.a_char = DISCLOSE_PROMPT_DEFAULT_YES;
add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
"Prompt, with default answer of \"Yes\"", "Prompt, with default answer of \"Yes\"",
(c == any.a_char) ? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE); (c == any.a_char) ? MENU_ITEMFLAGS_SELECTED
: MENU_ITEMFLAGS_NONE);
if (*disclosure_names[i] == 'v') { if (*disclosure_names[i] == 'v') {
any.a_char = DISCLOSE_PROMPT_DEFAULT_SPECIAL; /* '?' */ any.a_char = DISCLOSE_PROMPT_DEFAULT_SPECIAL; /* '?' */
add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, 0, any.a_char, ATR_NONE,
@@ -5080,7 +5085,8 @@ handler_sortloot(VOID_ARGS)
any.a_char = *sortl_name; any.a_char = *sortl_name;
add_menu(tmpwin, NO_GLYPH, &any, *sortl_name, 0, ATR_NONE, add_menu(tmpwin, NO_GLYPH, &any, *sortl_name, 0, ATR_NONE,
sortl_name, (flags.sortloot == *sortl_name) sortl_name, (flags.sortloot == *sortl_name)
? MENU_ITEMFLAGS_SELECTED : MENU_ITEMFLAGS_NONE); ? MENU_ITEMFLAGS_SELECTED
: MENU_ITEMFLAGS_NONE);
} }
end_menu(tmpwin, "Select loot sorting type:"); end_menu(tmpwin, "Select loot sorting type:");
n = select_menu(tmpwin, PICK_ONE, &sortl_pick); n = select_menu(tmpwin, PICK_ONE, &sortl_pick);
@@ -7706,58 +7712,97 @@ int nset;
add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE); add_menu(win, NO_GLYPH, &any, 0, 0, ATR_NONE, buf, MENU_ITEMFLAGS_NONE);
} }
/* /* display keys for menu actions; used by cmd.c '?i' and pager.c '?k' */
* used by cmd.c and pager.c
*/
void void
show_menu_controls(win, dolist) show_menu_controls(win, dolist)
winid win; winid win;
boolean dolist; boolean dolist;
{ {
struct xtra_cntrls {
const char *key, *desc;
};
static const struct xtra_cntrls hardcoded[] = {
{ "Return", "Accept current choice(s) and dismiss menu" },
{ "Enter", "Same as Return" },
{ "Space", "If not on last page, advance one page;" },
{ " ", "when on last page, treat like Return" },
{ "Escape", "Cancel menu without making any choice(s)" },
{ (char *) 0, (char *) 0}
};
static const char mc_fmt[] = "%8s %-6s %s",
mc_altfmt[] = "%9s %-6s %s";
char buf[BUFSZ]; char buf[BUFSZ];
const char *fmt, *arg;
const struct xtra_cntrls *xcp;
/*
* Relies on spaces to line things up in columns, so must be rendered
* with a fixed-width font or will look dreadful.
*/
putstr(win, 0, "Menu control keys:"); putstr(win, 0, "Menu control keys:");
if (dolist) { if (dolist) { /* key bindings help: '?i' */
int i; int i;
fmt = "%-7s %s";
for (i = 0; i < SIZE(default_menu_cmd_info); i++) { for (i = 0; i < SIZE(default_menu_cmd_info); i++) {
Sprintf(buf, "%-7s %s", Sprintf(buf, fmt,
visctrl(get_menu_cmd_key(default_menu_cmd_info[i].cmd)), visctrl(get_menu_cmd_key(default_menu_cmd_info[i].cmd)),
default_menu_cmd_info[i].desc); default_menu_cmd_info[i].desc);
putstr(win, 0, buf); putstr(win, 0, buf);
} }
} else { /* no separator before hardcoded */
fmt = "%s%-7s %s"; /* extra specifier to absorb 'arg' */
arg = ""; /* no extra prefix for 'dolist' */
} else { /* menu controls help: '?k' */
putstr(win, 0, ""); putstr(win, 0, "");
putstr(win, 0, " Page All items"); Sprintf(buf, mc_altfmt, "", "Whole", "Current");
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); putstr(win, 0, buf);
Sprintf(buf, "Deselect %s %s", Sprintf(buf, mc_altfmt, "", " Menu", " Page");
visctrl(get_menu_cmd_key(MENU_UNSELECT_PAGE)),
visctrl(get_menu_cmd_key(MENU_UNSELECT_ALL)));
putstr(win, 0, buf); putstr(win, 0, buf);
Sprintf(buf, " Invert %s %s", Sprintf(buf, mc_fmt, "Select",
visctrl(get_menu_cmd_key(MENU_INVERT_PAGE)), visctrl(get_menu_cmd_key(MENU_SELECT_ALL)),
visctrl(get_menu_cmd_key(MENU_INVERT_ALL))); visctrl(get_menu_cmd_key(MENU_SELECT_PAGE)));
putstr(win, 0, buf);
Sprintf(buf, mc_fmt, "Invert",
visctrl(get_menu_cmd_key(MENU_INVERT_ALL)),
visctrl(get_menu_cmd_key(MENU_INVERT_PAGE)));
putstr(win, 0, buf);
Sprintf(buf, mc_fmt, "Deselect",
visctrl(get_menu_cmd_key(MENU_UNSELECT_ALL)),
visctrl(get_menu_cmd_key(MENU_UNSELECT_PAGE)));
putstr(win, 0, buf); putstr(win, 0, buf);
putstr(win, 0, ""); putstr(win, 0, "");
Sprintf(buf, " Go to %s Next page", Sprintf(buf, mc_fmt, "Go to",
visctrl(get_menu_cmd_key(MENU_NEXT_PAGE))); visctrl(get_menu_cmd_key(MENU_NEXT_PAGE)),
"Next page");
putstr(win, 0, buf); putstr(win, 0, buf);
Sprintf(buf, " %s Previous page", Sprintf(buf, mc_fmt, "",
visctrl(get_menu_cmd_key(MENU_PREVIOUS_PAGE))); visctrl(get_menu_cmd_key(MENU_PREVIOUS_PAGE)),
"Previous page");
putstr(win, 0, buf); putstr(win, 0, buf);
Sprintf(buf, " %s First page", Sprintf(buf, mc_fmt, "",
visctrl(get_menu_cmd_key(MENU_FIRST_PAGE))); visctrl(get_menu_cmd_key(MENU_FIRST_PAGE)),
"First page");
putstr(win, 0, buf); putstr(win, 0, buf);
Sprintf(buf, " %s Last page", Sprintf(buf, mc_fmt, "",
visctrl(get_menu_cmd_key(MENU_LAST_PAGE))); visctrl(get_menu_cmd_key(MENU_LAST_PAGE)),
"Last page");
putstr(win, 0, buf); putstr(win, 0, buf);
putstr(win, 0, ""); putstr(win, 0, "");
Sprintf(buf, " %s Search and toggle matching entries", Sprintf(buf, mc_fmt, "Search",
visctrl(get_menu_cmd_key(MENU_SEARCH))); visctrl(get_menu_cmd_key(MENU_SEARCH)),
"Exter a target string and invert all matching entries");
putstr(win, 0, buf); putstr(win, 0, buf);
/* separator before hardcoded */
putstr(win, 0, "");
fmt = "%9s %-8s %s";
arg = "Other "; /* prefix for first hardcoded[] entry, then reset */
}
for (xcp = hardcoded; xcp->key; ++xcp) {
Sprintf(buf, fmt, arg, xcp->key, xcp->desc);
putstr(win, 0, buf);
arg = "";
} }
} }
static int static int