From: nhmall Date: Wed, 26 Feb 2020 19:23:26 +0000 (-0500) Subject: fix the menu_* options which had valok set to No X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=96a559e3924b9729ce1587a1822c20e866470dd3;p=nethack fix the menu_* options which had valok set to No --- diff --git a/doc/options.doc b/doc/options.doc new file mode 100644 index 000000000..37fa821e0 --- /dev/null +++ b/doc/options.doc @@ -0,0 +1,86 @@ +The definitition for each OPTIONS= option resides in include/optlish.h as of +February 2020 in 3.7 WIP. + +Boolean and compound options are combined into a single allopt[] array. + +To add an option: + + 1. Add an entry to include/optlist.h, using the NHOPTB macro for a + boolean on/off option, or NHOPTC macro for a compound option. The + list of options is kept in alphabetical order. + When the list of options is processed during the compile of options.c, + the following will be automatically generated and included in + options.c: + + i) an optfn_xxxx function prototype (xxxx is the option name). + ii) an opt_xxxx enum value for referencing that option index by + name throughout options.c (xxxx is the option name). + iii) an initialization of an element in the allopt[] array, at + index opt_xxxx from step ii (xxxx is the option name). + + 2. Create the optn_xxxx() function in options.c. Failure to do that will + result in a link error of "undefined function xxxx." The functions are + in options.c in alphabetical sequence by function name. + + The skeletal template for an optn_xxxx() function is: + + int + optfn_xxxx(optidx, req, negated, opts, op) + int optidx /* the index of this option opt_xxxx */ + int req; /* the request ID from core functions */ + boolean negated; /* will be true if opt was negated */ + char *opts; /* points to the complete opt string */ + char *op; /* points to value portion of opt string */ + { + if (req == do_init) { + return optn_ok; + } + if (req == do_set) { + /* do option set processing for the option */ + /* if successful, return optn_ok; */ + /* if unsuccessful, return optn_err; */ + } + if (req == get_val) { + /* return the current val of option in supplied opts buf */ + if (!opts) + return optn_err; + Sprintf(opts, "%s", fakefunction to get xxxx value); + return optn_ok; + } + if (req == do_handler) { + + /* this is optional. If the option needs its own + special handling after the doset menu, do it here + or call a function to do it. The naming convention + for such a function in options.c has been + handler_xxxx(), but the function does not need to + reside in options.c */ + + return optn_ok; + } + return optn_ok; + } + + 3. NOTE: If you add (or delete) an option, please update the short + options help (option_help()), the long options help (dat/opthelp) + and also the Guidebooks. + +Here's some information about the req ID's passed to optn_xxxx() functions. +Each optfn_xxxx() function can be called with a req id of: do_init, do_set, +do_handler or get_val. + +req do_init is called from options_init, and if initialization or memory +allocation or other initialization for that particular option is needed, +it can be done in response to the init req + +req do_set is called from parseoptions() for each option it encounters +and the optfn_xxxx() function is expected to react and set the option +based on the string values that parseoptions() passes to it. + +req get_val is passed a buffer from its caller that the optfn_xxxx() is +expected to fill with the current value of the opton. + +req do_handler is called during doset() operations processing in response +to player selections, most likely from the 'O' option-setting menu. The +do_handler req is only called for options that were marked as supporting +do_handler in the option definition in include/optlist.h diff --git a/include/optlist.h b/include/optlist.h index 25c2af7bb..f4070032d 100644 --- a/include/optlist.h +++ b/include/optlist.h @@ -262,21 +262,21 @@ pfx_##a, &flags.mention_decor) NHOPTB(mention_walls, 0, opt_in, set_in_game, Off, Yes, No, No, NoAlias, &flags.mention_walls) - NHOPTC(menu_deselect_all, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_deselect_all, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "deselect all items in a menu") - NHOPTC(menu_deselect_page, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_deselect_page, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "deselect all items on this page of a menu") - NHOPTC(menu_first_page, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_first_page, 4, opt_in, set_in_config, No, No, Yes, No, NoAlias, "jump to the first page in a menu") NHOPTC(menu_headings, 4, opt_in, set_in_game, No, Yes, No, Yes, NoAlias, "display style for menu headings") - NHOPTC(menu_invert_all, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_invert_all, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "invert all items in a menu") - NHOPTC(menu_invert_page, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_invert_page, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "invert all items on this page of a menu") - NHOPTC(menu_last_page, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_last_page, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "jump to the last page in a menu") - NHOPTC(menu_next_page, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_next_page, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "goto the next menu page") NHOPTB(menu_objsyms, 0, opt_in, set_in_game, Off, Yes, No, No, NoAlias, &iflags.menu_head_objsym) @@ -287,13 +287,13 @@ pfx_##a, NHOPTB(menu_overlay, 0, opt_in, set_in_config, Off, No, No, No, NoAlias, (boolean *) 0) #endif - NHOPTC(menu_previous_page, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_previous_page, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "goto the previous menu page") - NHOPTC(menu_search, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_search, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "search for a menu item") - NHOPTC(menu_select_all, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_select_all, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "select all items in a menu") - NHOPTC(menu_select_page, 4, opt_in, set_in_config, No, No, No, No, NoAlias, + NHOPTC(menu_select_page, 4, opt_in, set_in_config, No, Yes, No, No, NoAlias, "select all items on this page of a menu") NHOPTB(menu_tab_sep, 0, opt_in, set_wizonly, Off, Yes, No, No, NoAlias, &iflags.menu_tab_sep) diff --git a/src/options.c b/src/options.c index 5a8638553..954821afa 100644 --- a/src/options.c +++ b/src/options.c @@ -235,7 +235,7 @@ static void FDECL(complain_about_duplicate, (const char *, int)); static int FDECL(length_without_val, (const char *, int len)); static void NDECL(determine_ambiguities); static int FDECL(check_misc_menu_command, (char *, char *)); -int FDECL(spcfn_misc_menu_cmd, (int, BOOLEAN_P, BOOLEAN_P, char *, char *)); +int FDECL(spcfn_misc_menu_cmd, (int, int, BOOLEAN_P, char *, char *)); static const char *FDECL(attr2attrname, (int)); static const char * FDECL(msgtype2name, (int)); @@ -348,6 +348,8 @@ boolean tinitial, tfrom_file; if (optlen_wo_val < optlen) { has_val = TRUE; optlen = optlen_wo_val; + } else { + has_val = FALSE; } for (i = 0; i < OPTCOUNT; ++i) { @@ -423,8 +425,8 @@ boolean tinitial, tfrom_file; } /* - * Now call the option's associated function via the - * function pointer for it in the allopt[] array. + * Now call the option's associated function via the function + * pointer for it in the allopt[] array, specifying a 'do_set' req. */ if (allopt[matchidx].optfn) { op = string_for_opt(opts, TRUE); @@ -436,14 +438,19 @@ boolean tinitial, tfrom_file; if (g.program_state.in_parseoptions > 0) g.program_state.in_parseoptions--; +#if 0 + /* This specialization shouldn't be needed any longer because each of + the individual options is part of the allopts[] list, thus already + taken care of in the for-loop above */ if (!got_match) { int res = check_misc_menu_command(opts, op); if (res >= 0) - optresult = spcfn_misc_menu_cmd(res, FALSE, negated, opts, op); + optresult = spcfn_misc_menu_cmd(res, do_set, negated, opts, op); if (optresult == optn_ok) got_match = TRUE; } +#endif if (!got_match) { /* Is it a symbol? */ @@ -1453,7 +1460,6 @@ char *op UNUSED; return optn_ok; } -#ifdef MAC_GRAPHICS_ENV int optfn_MACgraphics(optidx, req, negated, opts, op) int optidx, req; @@ -1461,12 +1467,33 @@ boolean negated; char *opts; char *op; { +#if defined(MAC_GRAPHICS_ENV) && defined(BACKWARD_COMPAT) + boolean badflag = FALSE; + if (req == do_init) { return optn_ok; } if (req == do_set) { /* "MACgraphics" */ - iflags.MACgraphics = !negated; + if (!negated) { + if (g.symset[PRIMARY].name) { + badflag = TRUE; + } else { + g.symset[PRIMARY].name = dupstr(fullname); + if (!read_sym_file(PRIMARY)) { + badflag = TRUE; + clear_symsetentry(PRIMARY, TRUE); + } + } + if (badflag) { + config_error_add("Failure to load symbol set %s.", fullname); + return FALSE; + } else { + switch_symbols(TRUE); + if (!g.opt_initial && Is_rogue_level(&u.uz)) + assign_graphics(ROGUESET); + } + } return optn_ok; } if (req == get_val) { @@ -1475,9 +1502,20 @@ char *op; opts[0] = '\0'; return optn_ok; } +#else + if (req == do_set) { + config_error_add("'%s' %s; use 'symset:%s' instead", + allopt[optidx].name, +#ifdef MAC_GRAPHICS_ENV /* implies BACKWARD_COMPAT is not defined */ + "no longer supported", +#else + "is not supported", +#endif + allopt[optidx].name); + } +#endif return optn_ok; } -#endif int optfn_map_mode(optidx, req, negated, opts, op) @@ -1575,7 +1613,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1598,7 +1640,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1621,7 +1667,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1681,7 +1731,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1704,7 +1758,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1727,7 +1785,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1750,7 +1812,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1773,7 +1839,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1796,7 +1866,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1819,7 +1893,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -1842,7 +1920,11 @@ char *op UNUSED; return optn_ok; } if (req == do_set) { - return optn_ok; + int res = check_misc_menu_command(opts, op); + + if (res < 0) + return optn_err; + return spcfn_misc_menu_cmd(res, req, negated, opts, op); } if (req == get_val) { if (!opts) @@ -4416,8 +4498,6 @@ boolean negated; char *opts; char *op; { - int i; - if (req == do_init) { return optn_ok; } @@ -4425,9 +4505,6 @@ char *op; if (!allopt[optidx].addr) return optn_ok; /* silent retreat */ - if (optidx == opt_status_updates) - i = 1; - /* option that must come from config file? */ if (!g.opt_initial && (allopt[optidx].setwhere == set_in_config)) return optn_err; @@ -4549,6 +4626,7 @@ char *op; iflags.wc2_petattr = curses_read_attrs("I"); } #endif + g.opt_need_redraw = TRUE; break; case opt_hitpointbar: if (VIA_WINDOWPORT()) { @@ -4588,7 +4666,8 @@ char *op; } int spcfn_misc_menu_cmd(midx, req, negated, opts, op) -int midx, req; +int midx; +int req; boolean negated; char *opts; char *op;