diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 131620155..6c838961a 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -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 diff --git a/include/decl.h b/include/decl.h index 562678b9a..e931fc09b 100644 --- a/include/decl.h +++ b/include/decl.h @@ -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 */ diff --git a/src/decl.c b/src/decl.c index 150c945e6..721fda639 100644 --- a/src/decl.c +++ b/src/decl.c @@ -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 */ diff --git a/src/options.c b/src/options.c index af835e2ac..0029210ab 100644 --- a/src/options.c +++ b/src/options.c @@ -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*/ - diff --git a/src/windows.c b/src/windows.c index c1c983e21..98be242d3 100644 --- a/src/windows.c +++ b/src/windows.c @@ -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); } diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 6f9dc42e0..733d20d58 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -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; }