]> granicus.if.org Git - nethack/commitdiff
tty perm_invent option handling
authorPatR <rankin@nethack.org>
Mon, 20 Jun 2022 23:18:50 +0000 (16:18 -0700)
committerPatR <rankin@nethack.org>
Mon, 20 Jun 2022 23:18:50 +0000 (16:18 -0700)
The code for toggling perm_invent when windowtype=="tty" was inserted
into the middle of several switch cases that share 'need_redraw' so
was getting executed for various other options such as 'use_inverse'
that precede it in the list of cases.  It was also continuing on to
general feedback for boolean options, reporting "'perm_invent option
toggled on" even if it failed and the option stayed off.

src/options.c
win/tty/wintty.c

index 19b539adbf6b2d0090673c89e3075cc95e282c17..170329e8ba36fabd9acf7727c96e1646504767bb 100644 (file)
@@ -4403,6 +4403,27 @@ optfn_boolean(int optidx, int req, boolean negated, char *opts, char *op)
                 }
             }
             break;
+        case opt_perm_invent:
+#ifdef TTY_PERM_INVENT
+            /* if attempting to enable perm_invent fails, say so and return
+               before "'perm_invent' option toggled on" would be given below;
+               tty_perm_invent_toggled() and routines it calls don't check
+               iflags.perm_invent so it doesn't matter that 'SET IT HERE'
+               hasn't been executed yet */
+            if (WINDOWPORT("tty") && !negated) {
+                tty_perm_invent_toggled(!negated);
+
+                if (g.tty_invent_win == WIN_ERR) {
+                    /* FIXME: there is some confusion between this and
+                       tty_create_nhwindow(NHW_TTYINVENT) over when this
+                       should be done */
+                    set_option_mod_status("perm_invent", set_gameview);
+                    if (!g.opt_initial)
+                        config_error_add("Enabling perm_invent failed");
+                    return optn_silenterr;
+                }
+            }
+#endif
         }
         /* this dates from when 'O' prompted for a line of options text
            rather than use a menu to control access to which options can
@@ -4471,10 +4492,6 @@ optfn_boolean(int optidx, int req, boolean negated, char *opts, char *op)
         case opt_use_inverse:
         case opt_hilite_pile:
         case opt_perm_invent:
-#ifdef TTY_PERM_INVENT
-            if (WINDOWPORT("tty"))
-                tty_perm_invent_toggled(negated);
-#endif
         case opt_ascii_map:
         case opt_tiled_map:
             g.opt_need_redraw = TRUE;
index e1fe089e9f6fecb7055d04cadf3157c875a1af33..b359e78a7830c2fc8d1546d1ba5e4c3cba7a0718 100644 (file)
@@ -1630,12 +1630,12 @@ tty_create_nhwindow(int type)
                raw_printf("tty perm_invent could not be enabled.");
                 if (newwin->rows < tty_pi_minrow)
                     raw_printf(
-                "tty perm_invent requires %d rows, your terminal has %d.",
+                      "tty perm_invent requires %d rows, your terminal has %d.",
                                 (iflags.wc2_statuslines > 2) ? 54 : 53,
                                 ttyDisplay->rows);
                 else
                    raw_printf(
-                "tty perm_invent requires %d columns, your terminal has %d.",
+                   "tty perm_invent requires %d columns, your terminal has %d.",
                           tty_pi_mincol, ttyDisplay->cols);
             }
             set_option_mod_status("perm_invent", set_gameview);
@@ -2902,7 +2902,7 @@ tty_putstr(winid window, int attr, const char *str)
         return;
     if (cw->type != NHW_MESSAGE
 #ifdef TTY_PERM_INVENT
-&& window != g.tty_invent_win
+        && window != g.tty_invent_win
 #endif
        )
         str = compress_str(str);
@@ -3484,12 +3484,11 @@ x                                       x                                     x
     }
     for (pass = 0; pass < 2; ++pass) {
         for (row = 1; row < (cw->maxrow - 1); ++row) { /* row below top border */
-            for (col = (pass
-                            ? bordercol[border_middle] + 1
-                            : bordercol[border_left] + 1);
-                 col < (pass
-                            ? bordercol[border_right]
-                            : bordercol[border_middle]); ++col) {
+            for (col = (pass ? bordercol[border_middle] + 1
+                             : bordercol[border_left] + 1);
+                 col < (pass ? bordercol[border_right]
+                             : bordercol[border_middle]);
+                 ++col) {
                 cell = &cw->cells[row][col];
                 if (obj && *text && ccnt < (bordercol[border_middle] - 1)) {
                     if (cell->content.ttychar != *text)
@@ -3605,7 +3604,8 @@ x                                       x                                     x
             if (row == 0) {
                 if (col == bordercol[border_left])
                     glyph = cmap_to_glyph(S_tlcorn);
-                else if ((col > bordercol[border_left] && col < bordercol[border_middle])
+                else if ((col > bordercol[border_left]
+                          && col < bordercol[border_middle])
                          || (col > bordercol[border_middle]
                              && col < bordercol[border_right]))
                     glyph = cmap_to_glyph(S_hwall);
@@ -3616,7 +3616,8 @@ x                                       x                                     x
             } else if (row == (cw->maxrow - 1)) {
                 if (col == bordercol[border_left])
                     glyph = cmap_to_glyph(S_blcorn);
-                else if ((col > bordercol[border_left] && col < bordercol[border_middle])
+                else if ((col > bordercol[border_left]
+                          && col < bordercol[border_middle])
                          || (col > bordercol[border_middle]
                              && col < bordercol[border_right]))
                     glyph = cmap_to_glyph(S_hwall);
@@ -3656,14 +3657,13 @@ void
 tty_perm_invent_toggled(boolean negated)
 {
     if (negated) {
-        destroy_nhwindow(g.tty_invent_win), g.tty_invent_win = WIN_ERR;
+        if (g.tty_invent_win != WIN_ERR)
+            destroy_nhwindow(g.tty_invent_win), g.tty_invent_win = WIN_ERR;
         done_box_init = FALSE;
     } else {
-        if (WINDOWPORT("tty")) {
-            g.tty_invent_win = create_nhwindow(NHW_TTYINVENT);
-            if (g.tty_invent_win != WIN_ERR)
-                display_nhwindow(g.tty_invent_win, FALSE);
-        }
+        g.tty_invent_win = create_nhwindow(NHW_TTYINVENT);
+        if (g.tty_invent_win != WIN_ERR)
+            display_nhwindow(g.tty_invent_win, FALSE);
     }
 }
 #endif