From d1c5649890b80f692bb5cd95ea585f7085c5d2a9 Mon Sep 17 00:00:00 2001 From: nhmall Date: Sat, 29 Sep 2018 22:28:10 -0400 Subject: [PATCH] revisit display artifact appearing to the right of status line The prior fix for this was a bit flawed. It was only considering the length of the last field, but what it really needed to do was consider the placement of the last character of the last field on the row relative to the placement of the last character of the last field on the row previously. If the new placement of that last character of the last field is left of the previous placement, some clearing must be done. --- doc/fixes36.2 | 5 +++-- include/wintty.h | 2 +- win/tty/wintty.c | 25 ++++++++++++++++--------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/doc/fixes36.2 b/doc/fixes36.2 index a56ab4b9f..25fd65dc4 100644 --- a/doc/fixes36.2 +++ b/doc/fixes36.2 @@ -168,8 +168,9 @@ tty: turn off an optimization that is the suspected cause of Windows reported tty: ensure that current status fields are always copied to prior status values so that comparisons are correct tty: fix an out of bounds error in tty_status_update() for BL_HUNGER case -tty: fix leftover display artifact when last field on the row got smaller - and optimize so only the right-most field requires the cleanup code +tty: fix leftover display artifact when the last field on the row got placed + to the left of where it was previously due to it, or one of the fields + to its left, getting shorter X11: its use of genl_status_update exposed a negative index use that could lead to a segfault diff --git a/include/wintty.h b/include/wintty.h index 9a375145e..009baf69c 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 padright; }; #endif diff --git a/win/tty/wintty.c b/win/tty/wintty.c index 145a535fe..f235f6c91 100644 --- a/win/tty/wintty.c +++ b/win/tty/wintty.c @@ -3588,7 +3588,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 = FALSE; + tty_status[NOW][i].padright = 0; tty_status[BEFORE][i] = tty_status[NOW][i]; } tty_condition_bits = 0L; @@ -3883,11 +3883,17 @@ int *topsz, *bottomsz; /* On a change to the field length, everything further to the right must be updated as well */ - if (tty_status[NOW][idx].lth != tty_status[BEFORE][idx].lth) { + if (tty_status[NOW][idx].lth != tty_status[BEFORE][idx].lth) update_right = TRUE; - if ((tty_status[NOW][idx].lth < tty_status[BEFORE][idx].lth) && - idx == last_on_row[row]) - tty_status[NOW][idx].padright = 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 (!update_right && !forcefields) { @@ -4339,10 +4345,11 @@ render_status(VOID_ARGS) term_end_color(); End_Attr(attridx); } - if (tty_status[NOW][fldidx].padright) { - int cnt = tty_status[BEFORE][fldidx].lth - - tty_status[NOW][fldidx].lth; + 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); @@ -4352,7 +4359,7 @@ render_status(VOID_ARGS) /* 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 = FALSE; + tty_status[NOW][fldidx].padright = 0; /* * Make a copy of the entire tty_status struct for comparison