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:
@@ -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
|
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
|
and white ice was supposed to be rendered in inverse video but that
|
||||||
got broken by the symbols and glyphs overhaul
|
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
|
curses: 'msg_window' option wasn't functional for curses unless the binary
|
||||||
also included tty support
|
also included tty support
|
||||||
|
|||||||
@@ -1087,6 +1087,7 @@ struct instance_globals {
|
|||||||
boolean opt_from_file;
|
boolean opt_from_file;
|
||||||
boolean opt_need_redraw; /* for doset() */
|
boolean opt_need_redraw; /* for doset() */
|
||||||
boolean opt_need_glyph_reset;
|
boolean opt_need_glyph_reset;
|
||||||
|
char *cmdline_windowsys; /* set in unixmain.c */
|
||||||
/* use menucolors to show colors in the pick-a-color menu */
|
/* use menucolors to show colors in the pick-a-color menu */
|
||||||
boolean save_menucolors; /* copy of iflags.use_menu_colors */
|
boolean save_menucolors; /* copy of iflags.use_menu_colors */
|
||||||
struct menucoloring *save_colorings; /* copy of g.menu_colorings */
|
struct menucoloring *save_colorings; /* copy of g.menu_colorings */
|
||||||
|
|||||||
@@ -528,6 +528,7 @@ const struct instance_globals g_init = {
|
|||||||
FALSE, /* opt_from_file */
|
FALSE, /* opt_from_file */
|
||||||
FALSE, /* opt_need_redraw */
|
FALSE, /* opt_need_redraw */
|
||||||
FALSE, /* opt_need_glyph_reset */
|
FALSE, /* opt_need_glyph_reset */
|
||||||
|
NULL, /* cmdline_windowsys */
|
||||||
FALSE, /* save_menucolors */
|
FALSE, /* save_menucolors */
|
||||||
(struct menucoloring *) 0, /* save_colorings */
|
(struct menucoloring *) 0, /* save_colorings */
|
||||||
(struct menucoloring *) 0, /* color_colorings */
|
(struct menucoloring *) 0, /* color_colorings */
|
||||||
|
|||||||
@@ -354,7 +354,10 @@ extern char *curses_fmt_attrs(char *);
|
|||||||
**********************************
|
**********************************
|
||||||
*/
|
*/
|
||||||
boolean
|
boolean
|
||||||
parseoptions(register char *opts, boolean tinitial, boolean tfrom_file)
|
parseoptions(
|
||||||
|
register char *opts,
|
||||||
|
boolean tinitial,
|
||||||
|
boolean tfrom_file)
|
||||||
{
|
{
|
||||||
char *op;
|
char *op;
|
||||||
boolean negated, got_match = FALSE, pfx_match = FALSE;
|
boolean negated, got_match = FALSE, pfx_match = FALSE;
|
||||||
@@ -6242,6 +6245,17 @@ initoptions_init(void)
|
|||||||
memcpy(allopt, allopt_init, sizeof(allopt));
|
memcpy(allopt, allopt_init, sizeof(allopt));
|
||||||
determine_ambiguities();
|
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
|
#ifdef ENHANCED_SYMBOLS
|
||||||
/* make any symbol parsing quicker */
|
/* make any symbol parsing quicker */
|
||||||
if (!glyphid_cache_status())
|
if (!glyphid_cache_status())
|
||||||
@@ -6452,6 +6466,14 @@ initoptions_finish(void)
|
|||||||
config_error_done();
|
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)
|
if (g.cmdline_rcfile)
|
||||||
free((genericptr_t) g.cmdline_rcfile), g.cmdline_rcfile = 0;
|
free((genericptr_t) g.cmdline_rcfile), g.cmdline_rcfile = 0;
|
||||||
/*[end of nethackrc handling]*/
|
/*[end of nethackrc handling]*/
|
||||||
@@ -9511,4 +9533,3 @@ enhance_menu_text(
|
|||||||
#endif /* OPTION_LISTS_ONLY */
|
#endif /* OPTION_LISTS_ONLY */
|
||||||
|
|
||||||
/*options.c*/
|
/*options.c*/
|
||||||
|
|
||||||
|
|||||||
@@ -311,8 +311,7 @@ choose_windows(const char *s)
|
|||||||
if (tmps)
|
if (tmps)
|
||||||
free((genericptr_t) tmps) /*, tmps = 0*/ ;
|
free((genericptr_t) tmps) /*, tmps = 0*/ ;
|
||||||
|
|
||||||
if (windowprocs.win_raw_print == def_raw_print
|
if (windowprocs.win_raw_print == def_raw_print || WINDOWPORT(safestartup))
|
||||||
|| WINDOWPORT(safestartup))
|
|
||||||
nh_terminate(EXIT_SUCCESS);
|
nh_terminate(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -376,7 +376,7 @@ lopt(
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* caveat: argv elements might be arbitrary long */
|
/* caveat: argv elements might be arbitrarily long */
|
||||||
static void
|
static void
|
||||||
process_options(int argc, char *argv[])
|
process_options(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -479,14 +479,6 @@ process_options(int argc, char *argv[])
|
|||||||
flags.initrace = i;
|
flags.initrace = i;
|
||||||
}
|
}
|
||||||
break;
|
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 '@':
|
case '@':
|
||||||
flags.randomall = 1;
|
flags.randomall = 1;
|
||||||
break;
|
break;
|
||||||
@@ -667,6 +659,15 @@ early_options(int *argc_p, char ***argv_p, char **hackdir_p)
|
|||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user