From: nhmall Date: Sun, 30 Sep 2018 03:21:11 +0000 (-0400) Subject: one more update for the right of the status line X-Git-Tag: NetHack-3.6.2_Released~191^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ef199f37636401a8fa1c5766ef7fc8831f11002e;p=nethack one more update for the right of the status line This tracks the last character written on each row and clears the previous content from the end independently of which field is actually involved. --- diff --git a/include/wintty.h b/include/wintty.h index 009baf69c..99b560d82 100644 --- a/include/wintty.h +++ b/include/wintty.h @@ -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 diff --git a/win/tty/wintty.c b/win/tty/wintty.c index f235f6c91..1f6c0fd52 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -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) {