]> granicus.if.org Git - nethack/commitdiff
one more update for the right of the status line
authornhmall <nhmall@nethack.org>
Sun, 30 Sep 2018 03:21:11 +0000 (23:21 -0400)
committernhmall <nhmall@nethack.org>
Sun, 30 Sep 2018 03:21:11 +0000 (23:21 -0400)
This tracks the last character written on each row and clears
the previous content from the end independently of which field
is actually involved.

include/wintty.h
win/tty/wintty.c

index 009baf69ced486a94a3e11b8075bfa86b3cd77a2..99b560d8258bc5e8d5c403eadfa3d4804de00956 100644 (file)
@@ -75,11 +75,11 @@ struct tty_status_fields {
     int color;
     int attr;
     int x, y;
-    int padright;
     size_t lth;
     boolean valid;
     boolean dirty;
     boolean redraw;
+    boolean last_on_row;
 };
 #endif
 
index f235f6c9107d07fc82c9f3e63989b5b6c8903ee5..1f6c0fd524637ca5c8e9422b271618a17b0f42db 100644 (file)
@@ -3541,7 +3541,8 @@ static enum statusfields fieldorder[2][MAX_PER_ROW] = { /* 2: two status lines *
       BL_CAP, BL_CONDITION, BL_FLUSH }
 };
 
-static int last_on_row[2];
+static int last_on_row[2];  /* [rows] */
+static int finalx[2][2];    /* [rows][NOW or BEFORE] */
 static boolean setlast = FALSE;
 static boolean windowdata_init = FALSE;
 static int cond_shrinklvl = 0, cond_width_at_shrink = 0;
@@ -3588,7 +3589,7 @@ tty_status_init()
         tty_status[NOW][i].valid  = FALSE;
         tty_status[NOW][i].dirty  = FALSE;
         tty_status[NOW][i].redraw = FALSE;
-        tty_status[NOW][i].padright = 0;
+        tty_status[NOW][i].last_on_row = FALSE;
         tty_status[BEFORE][i] = tty_status[NOW][i];
     }
     tty_condition_bits = 0L;
@@ -3886,15 +3887,8 @@ int *topsz, *bottomsz;
             if (tty_status[NOW][idx].lth != tty_status[BEFORE][idx].lth)
                 update_right = TRUE;
 
-            if (idx == last_on_row[row]) {
-                int prevright = tty_status[BEFORE][idx].x
-                                + tty_status[BEFORE][idx].lth,
-                    currright = tty_status[NOW][idx].x
-                                + tty_status[NOW][idx].lth;
-
-                    if (currright < prevright)
-                        tty_status[NOW][idx].padright = prevright - currright;
-            }
+            if (idx == last_on_row[row])
+                tty_status[NOW][idx].last_on_row = TRUE;
 
             if (!update_right && !forcefields) {
                 /*
@@ -4182,22 +4176,22 @@ render_status(VOID_ARGS)
     for (row = 0; row < 2; ++row) {
         curs(WIN_STATUS, 1, row);
         for (i = 0; fieldorder[row][i] != BL_FLUSH; ++i) {
-            int fldidx = fieldorder[row][i];
+            int idx = fieldorder[row][i];
 
-            if (!status_activefields[fldidx])
+            if (!status_activefields[idx])
                 continue;
 
-            if ((tty_status[NOW][fldidx].lth || fldidx == BL_CONDITION)
-                 && (tty_status[NOW][fldidx].redraw || !do_field_opt)) {
-                int coloridx = tty_status[NOW][fldidx].color;
-                int attridx = tty_status[NOW][fldidx].attr;
-                int x = tty_status[NOW][fldidx].x;
+            if ((tty_status[NOW][idx].lth || idx == BL_CONDITION)
+                 && (tty_status[NOW][idx].redraw || !do_field_opt)) {
+                int coloridx = tty_status[NOW][idx].color;
+                int attridx = tty_status[NOW][idx].attr;
+                int x = tty_status[NOW][idx].x;
                 int y = row;
-                char *text = status_vals[fldidx];
-                boolean hitpointbar = (fldidx == BL_TITLE
+                char *text = status_vals[idx];
+                boolean hitpointbar = (idx == BL_TITLE
                                        && iflags.wc2_hitpointbar);
 
-                if (fldidx == BL_CONDITION) {
+                if (idx == BL_CONDITION) {
                     /*
                      * +-----------------+
                      * | Condition Codes |
@@ -4241,7 +4235,7 @@ render_status(VOID_ARGS)
                     }
                     tty_curs(WIN_STATUS, x, y);
                     cl_end();
-                } else if (fldidx == BL_GOLD) {
+                } else if (idx == BL_GOLD) {
                     char buf[BUFSZ];
                     /*
                      * +-----------+
@@ -4318,7 +4312,7 @@ render_status(VOID_ARGS)
                         }
                         tty_putstatusfield(nullfield, "]", x++, y);
                     } else {
-                        tty_putstatusfield(&tty_status[NOW][fldidx],
+                        tty_putstatusfield(&tty_status[NOW][idx],
                                            (char *) 0, x, y);
                     }
                 } else {
@@ -4338,34 +4332,37 @@ render_status(VOID_ARGS)
                         if (coloridx != NO_COLOR && coloridx != CLR_MAX)
                             term_start_color(coloridx);
                     }
-                    tty_putstatusfield(&tty_status[NOW][fldidx],
+                    tty_putstatusfield(&tty_status[NOW][idx],
                                        text, x, y);                    
                     if (iflags.hilite_delta) {
                         if (coloridx != NO_COLOR && coloridx != CLR_MAX)
                             term_end_color();
                         End_Attr(attridx);
                     }
-                    if (tty_status[NOW][fldidx].padright > 0) {
-                        int cnt = tty_status[NOW][fldidx].padright;
-
-                        /* .lth - 1 below because we already did the leading
-                           blank above */
-                        x += (tty_status[NOW][fldidx].lth - 1);
-                        while (cnt-- > 0)
-                            tty_putstatusfield(nullfield, " ", x++, y);
-                    }
                 }
+                if (tty_status[NOW][idx].last_on_row) {
+                    int padright = 0;
+
+                    x = tty_status[NOW][idx].x + tty_status[NOW][idx].lth;
+                    finalx[row][NOW] = x - 1;
+                    if (finalx[row][NOW] < finalx[row][BEFORE])
+                        padright = finalx[row][BEFORE] - finalx[row][NOW];
+                    while (padright-- > 0)
+                        tty_putstatusfield(nullfield, " ", x++, y);
+                }    
             }
             /* reset .redraw, .dirty, .padright now that they've been rendered */
-            tty_status[NOW][fldidx].dirty  = FALSE;
-            tty_status[NOW][fldidx].redraw = FALSE;
-            tty_status[NOW][fldidx].padright = 0;
+            tty_status[NOW][idx].dirty  = FALSE;
+            tty_status[NOW][idx].redraw = FALSE;
+            tty_status[NOW][idx].last_on_row = FALSE;
 
             /*
-             * Make a copy of the entire tty_status struct for comparison
-             * of current and previous.
+             * For comparison of current and previous,
+             * - Copy the entire tty_status struct.
+             * - Copy the last written column number on the line.
              */
-             tty_status[BEFORE][fldidx] = tty_status[NOW][fldidx];
+             tty_status[BEFORE][idx] = tty_status[NOW][idx];
+             finalx[row][BEFORE] = finalx[row][NOW];
         }
     }
     if (cond_disp_width[NOW] < cond_width_at_shrink) {