]> granicus.if.org Git - nethack/commitdiff
curses menu and text window size
authorPatR <rankin@nethack.org>
Fri, 28 Jun 2019 18:59:14 +0000 (11:59 -0700)
committerPatR <rankin@nethack.org>
Fri, 28 Jun 2019 18:59:14 +0000 (11:59 -0700)
Make final inventory disclosure use a full width menu instead of
the default 38-column width with lots of wrapping.  Also, increase
that default from 38 to 40 for the rest of the time.  Commit
9f6588af49766c00998291ff79735922199c8563 made the 38 vs 40 portion
matter much less but I decided to keep it in anyway.

When a menu or 'things that are here' popup has only a couple of
lines and they happen to be narrow, a sized-to-fit window isn't
always easy to spot when it is shown over the ends of old messages
rather than over the map, even with a border box around it.  Give
such windows a minimum size of 5x25 so that they always stand out
enough to be immediately seen.  This will cause more message text to
be rewritten occasionally (after dismissing the menu or text window)
but the curses interface seems to discount that as something to be
concerned about.

doc/fixes36.3
win/curses/cursdial.c

index 7df9c7c556f7e1f8862eea19d2ecc04046c5b9a0..b27d8e64b1e36431588e4e563cdba54c1fe49305 100644 (file)
@@ -1,4 +1,4 @@
-$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.74 $ $NHDT-Date: 1561717038 2019/06/28 10:17:18 $
+$NHDT-Branch: NetHack-3.6 $:$NHDT-Revision: 1.75 $ $NHDT-Date: 1561748351 2019/06/28 18:59:11 $
 
 This fixes36.3 file is here to capture information about updates in the 3.6.x
 lineage following the release of 3.6.2 in May 2019. Please note, however,
@@ -188,6 +188,8 @@ if you reach the edge of a level (relatively uncommon) and try to move off,
        report that you can't go farther if the 'mention_walls' option is set
 wizard-mode: display effect to show where an unseen wished-for monster landed
 curses: enable latent mouse support
+curses: give menus and text windows a minimum size of 5x25 since tiny ones can
+       sometimes be overlooked when shown over old messages rather than map
 curses+'perm_invent': since persistent inventory is narrow, strip off "a",
        "an", or "the" prefix on inventory entries shown there so that a tiny
        bit more of the interesting portion is visible
index a1058d802f3077448d12485b21cb0cab87a34b9d..793e6d81c26ee3087b7ed015862c68f7062ac76c 100644 (file)
@@ -135,7 +135,7 @@ curses_line_input_dialog(const char *prompt, char *answer, int buffer)
     curses_got_input();
 
     if (buffer > (int) sizeof input)
-         buffer = (int) sizeof input;
+        buffer = (int) sizeof input;
     maxwidth = term_cols - 2;
 
     if (iflags.window_inited) {
@@ -388,7 +388,8 @@ curses_ext_cmd()
         getbegyx(extwin2, y0, x0);
         getmaxyx(extwin2, h, w);
         extwin = newwin(1, w - 2, y0 + 1, x0 + 1);
-        if (w - 4 < maxlen) maxlen = w - 4;
+        if (w - 4 < maxlen)
+            maxlen = w - 4;
     } else {
         curses_get_window_xy(MESSAGE_WIN, &winx, &winy);
         curses_get_window_size(MESSAGE_WIN, &messageh, &messagew);
@@ -985,14 +986,24 @@ menu_determine_pages(nhmenu *menu)
 static void
 menu_win_size(nhmenu *menu)
 {
-    int width, height, maxwidth, maxheight, curentrywidth, lastline;
+    int maxwidth, maxheight, curentrywidth, lastline;
     int maxentrywidth = (int) strlen(menu->prompt);
     int maxheaderwidth = 0;
     nhmenu_item *menu_item_ptr;
 
-    maxwidth = 38;              /* Reasonable minimum usable width */
-    if ((term_cols / 2) > maxwidth) {
-        maxwidth = (term_cols / 2);     /* Half the screen */
+    if (program_state.gameover) {
+        /* for final inventory disclosure, use full width */
+        maxwidth = term_cols - 2;
+    } else {
+        /* this used to be 38, which is 80/2 - 2 (half a 'normal' sized
+           screen minus room for a border box), but some data files
+           have been manually formatted for 80 columns (usually limited
+           to 78 but sometimes 79, rarely 80 itself) and using a value
+           less that 40 meant that a full line would wrap twice:
+           1..38, 39..76, and 77..80 */
+        maxwidth = 40; /* Reasonable minimum usable width */
+        if ((term_cols / 2) > maxwidth)
+            maxwidth = (term_cols / 2); /* Half the screen */
     }
     maxheight = menu_max_height();
 
@@ -1017,7 +1028,8 @@ menu_win_size(nhmenu *menu)
         }
     }
 
-    /* If widest entry is smaller than maxwidth, reduce maxwidth accordingly */
+    /* If widest entry is smaller than maxwidth, reduce maxwidth
+       accordingly (but not too far; minimum width will be applied below) */
     if (maxentrywidth < maxwidth) {
         maxwidth = maxentrywidth;
     }
@@ -1032,8 +1044,6 @@ menu_win_size(nhmenu *menu)
             maxwidth = term_cols - 2;
     }
 
-    width = maxwidth;
-
     /* Possibly reduce height if only 1 page */
     if (!menu_is_multipage(menu, maxwidth, maxheight)) {
         menu_item_ptr = menu->entries;
@@ -1047,16 +1057,16 @@ menu_win_size(nhmenu *menu)
         if (lastline < maxheight) {
             maxheight = lastline;
         }
-    } else { /* If multipage, make sure we have enough width for page footer */
-
-        if (width < 20) {
-            width = 20;
-        }
     }
 
-    height = maxheight;
-    menu->width = width;
-    menu->height = height;
+    /* avoid a tiny popup window; when it's shown over the endings of
+       old messsages rather than over the map, it is fairly easy for
+       the player to overlook it, particularly when walking around and
+       stepping on a pile of 2 items; also, multi-page menus need enough
+       room for "(Page M of N) => " even if all entries are narrower
+       than that; we specify same minimum width even when single page */
+    menu->width = max(maxwidth, 25);
+    menu->height = max(maxheight, 5);
 }