Unix: command line --windowtype:foo fix

initoptions(), including initoptions_finish(), was running to
completion with the default window system before windowtype from the
command was parsed and activated.  When the default window system
is tty without MS-DOS the map type gets set to ascii; command line
--windowtype:X11 doesn't switch it back to the X11 default of tiled.

So,
| NETHACKOPTIONS=windowtype:X11 nethack
ran nethack in tiles mode but
| nethack --windowtype:X11
ran it in text mode (assuming .nethackrc left tiles vs text with the
default setting).

I think this fix is quite iffy but it seems to work as intended....
It reclassifies '--windowtype' as an "early option" in unixmain.c,
and the options.c code ultimately processes it twice.
This commit is contained in:
PatR
2022-08-28 00:09:50 -07:00
parent 1bdfeb04ab
commit 11c8d5cd5e
6 changed files with 40 additions and 13 deletions

View File

@@ -1369,6 +1369,10 @@ end of game with DUMPLOG could panic due to perm_invent handling, even when
with color Off and the screen symbol for ice the same as for floor, the black
and white ice was supposed to be rendered in inverse video but that
got broken by the symbols and glyphs overhaul
command line processing interleaved with options file processing is complex:
a recent change to make 'color' show up for tty in the short options
menu resulted in 'nethack --windowtype:X11' running X11 with ascii map
('NETHACKOPTIONS=windowtype:X11 nethack' continued to default to tiles)
curses: 'msg_window' option wasn't functional for curses unless the binary
also included tty support

View File

@@ -1087,6 +1087,7 @@ struct instance_globals {
boolean opt_from_file;
boolean opt_need_redraw; /* for doset() */
boolean opt_need_glyph_reset;
char *cmdline_windowsys; /* set in unixmain.c */
/* use menucolors to show colors in the pick-a-color menu */
boolean save_menucolors; /* copy of iflags.use_menu_colors */
struct menucoloring *save_colorings; /* copy of g.menu_colorings */

View File

@@ -528,6 +528,7 @@ const struct instance_globals g_init = {
FALSE, /* opt_from_file */
FALSE, /* opt_need_redraw */
FALSE, /* opt_need_glyph_reset */
NULL, /* cmdline_windowsys */
FALSE, /* save_menucolors */
(struct menucoloring *) 0, /* save_colorings */
(struct menucoloring *) 0, /* color_colorings */

View File

@@ -354,7 +354,10 @@ extern char *curses_fmt_attrs(char *);
**********************************
*/
boolean
parseoptions(register char *opts, boolean tinitial, boolean tfrom_file)
parseoptions(
register char *opts,
boolean tinitial,
boolean tfrom_file)
{
char *op;
boolean negated, got_match = FALSE, pfx_match = FALSE;
@@ -6242,6 +6245,17 @@ initoptions_init(void)
memcpy(allopt, allopt_init, sizeof(allopt));
determine_ambiguities();
/* if windowtype has been specified on the command line, set it up
early so windowtype-specific options use it as their base; we will
set it again in initoptions_finish() so that NETHACKOPTIONS and
.nethrackrc can't override it (command line takes precedence) */
if (g.cmdline_windowsys) {
config_error_init(FALSE, "command line", FALSE);
choose_windows(g.cmdline_windowsys);
config_error_done();
/* do not free g.cmdline_windowsys yet */
}
#ifdef ENHANCED_SYMBOLS
/* make any symbol parsing quicker */
if (!glyphid_cache_status())
@@ -6452,6 +6466,14 @@ initoptions_finish(void)
config_error_done();
}
/* after .nethackrc and NETHACKOPTIONS so that cmdline takes precedence */
if (g.cmdline_windowsys) {
config_error_init(FALSE, "command line", FALSE);
choose_windows(g.cmdline_windowsys);
config_error_done();
free((genericptr_t) g.cmdline_windowsys), g.cmdline_windowsys = NULL;
}
if (g.cmdline_rcfile)
free((genericptr_t) g.cmdline_rcfile), g.cmdline_rcfile = 0;
/*[end of nethackrc handling]*/
@@ -9511,4 +9533,3 @@ enhance_menu_text(
#endif /* OPTION_LISTS_ONLY */
/*options.c*/

View File

@@ -311,8 +311,7 @@ choose_windows(const char *s)
if (tmps)
free((genericptr_t) tmps) /*, tmps = 0*/ ;
if (windowprocs.win_raw_print == def_raw_print
|| WINDOWPORT(safestartup))
if (windowprocs.win_raw_print == def_raw_print || WINDOWPORT(safestartup))
nh_terminate(EXIT_SUCCESS);
}

View File

@@ -376,7 +376,7 @@ lopt(
return p;
}
/* caveat: argv elements might be arbitrary long */
/* caveat: argv elements might be arbitrarily long */
static void
process_options(int argc, char *argv[])
{
@@ -479,14 +479,6 @@ process_options(int argc, char *argv[])
flags.initrace = i;
}
break;
case 'w': /* windowtype: "-wfoo" or "-w[indowtype]=foo"
* or "-w[indowtype]:foo" or "-w[indowtype] foo" */
arg = lopt(arg,
(ArgValRequired | ArgNamOneLetter | ArgErrComplain),
"-windowtype", origarg, &argc, &argv);
if (arg)
choose_windows(arg);
break;
case '@':
flags.randomall = 1;
break;
@@ -667,6 +659,15 @@ early_options(int *argc_p, char ***argv_p, char **hackdir_p)
/*NOTREACHED*/
}
break;
case 'w': /* windowtype: "-wfoo" or "-w[indowtype]=foo"
* or "-w[indowtype]:foo" or "-w[indowtype] foo" */
arg = lopt(arg,
(ArgValRequired | ArgNamOneLetter | ArgErrComplain),
"-windowtype", origarg, &argc, &argv);
if (g.cmdline_windowsys)
free((genericptr_t) g.cmdline_windowsys);
g.cmdline_windowsys = arg ? dupstr(arg) : NULL;
break;
default:
break;
}