top: refactor 'mkVIZ' support to avoid future problems

In the patch referenced below, 2 potential abends were
fixed both of which involved 'alternate display mode'.

The root cause of those abends was a negative value in
the 'begnext' field for other than the current window.

And while that potential is fixed for now the existing
code almost invites such problems again in the future.

So, this patch will remove any temptation to name some
other window in the 'mkVIZrow1' macro. And, since that
macro is not the only source of 'begnext' changes, the
'mkVizrowX' is being added to identify such occasions.

[ and for symmetry i've added a 'mkVIZyes' macro and ]
[ ameliorated an otherwise surreptitious assignment! ]

Reference(s):
commit 8281ac4f98

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2021-06-15 00:00:00 -05:00 committed by Craig Small
parent e782b1d859
commit 2ea082b4af
2 changed files with 23 additions and 18 deletions

View File

@ -4293,7 +4293,7 @@ static void wins_stage_2 (void) {
// with preserved 'other filters' & command line 'user filters',
// we must ensure that we always have a visible task on row one.
mkVIZrow1(Curwin);
mkVIZrow1
// lastly, initialize a signal set used to throttle one troublesome signal
sigemptyset(&Sigwinch_set);
@ -4735,7 +4735,7 @@ static void keys_global (int ch) {
case '?':
case 'h':
help_view();
mkVIZrow1(Curwin);
mkVIZrow1
break;
case 'B':
TOGw(w, View_NOBOLD);
@ -4763,7 +4763,7 @@ static void keys_global (int ch) {
break;
case 'g':
win_select(0);
mkVIZrow1(Curwin);
mkVIZrow1
break;
case 'H':
Thread_mode = !Thread_mode;
@ -4843,7 +4843,7 @@ static void keys_global (int ch) {
break;
case 'Z':
wins_colors();
mkVIZrow1(Curwin);
mkVIZrow1
break;
case '0':
Rc.zero_suppress = !Rc.zero_suppress;
@ -5047,7 +5047,7 @@ static void keys_task (int ch) {
case kbd_CtrlO:
if (VIZCHKw(w)) {
other_filters(ch);
mkVIZrow1(w);
mkVIZrow1
}
break;
case 'U':
@ -5057,7 +5057,7 @@ static void keys_task (int ch) {
if (*str != kbd_ESC
&& (errmsg = user_certify(w, str, ch)))
show_msg(errmsg);
mkVIZrow1(w);
mkVIZrow1
}
break;
case 'V':
@ -5165,7 +5165,7 @@ static void keys_window (int ch) {
case 'w':
if (ALTCHKw) {
win_select(ch);
mkVIZrow1(Curwin);
mkVIZrow1
}
break;
case 'G':
@ -5176,10 +5176,10 @@ static void keys_window (int ch) {
}
break;
case kbd_UP:
if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begnext = -1;
if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) mkVIZrowX(-1)
break;
case kbd_DOWN:
if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begnext = +1;
if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) mkVIZrowX(+1)
break;
#ifdef USE_X_COLHDR // ------------------------------------
case kbd_LEFT:
@ -5249,30 +5249,30 @@ static void keys_window (int ch) {
case kbd_PGUP:
if (VIZCHKw(w)) {
if (CHKw(w, Show_IDLEPS) && 0 < w->begtask) {
w->begnext = -(w->winlines - (Rc.mode_altscr ? 1 : 2));
mkVIZrowX(-(w->winlines - (Rc.mode_altscr ? 1 : 2)))
}
}
break;
case kbd_PGDN:
if (VIZCHKw(w)) {
if (CHKw(w, Show_IDLEPS) && w->begtask < PIDSmaxt - 1) {
w->begnext = +(w->winlines - (Rc.mode_altscr ? 1 : 2));
mkVIZrowX(+(w->winlines - (Rc.mode_altscr ? 1 : 2)))
}
}
break;
case kbd_HOME:
#ifndef SCROLLVAR_NO
if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begtask = w->begpflg = w->varcolbeg = 0;
mkVIZrow1(w);
mkVIZrow1
#else
if (VIZCHKw(w)) if (CHKw(w, Show_IDLEPS)) w->begtask = w->begpflg = 0;
mkVIZrow1(w);
mkVIZrow1
#endif
break;
case kbd_END:
if (VIZCHKw(w)) {
if (CHKw(w, Show_IDLEPS)) {
w->begnext = (PIDSmaxt - w->winlines) + 1;
mkVIZrowX((PIDSmaxt - w->winlines) + 1)
w->begpflg = w->endpflg;
#ifndef SCROLLVAR_NO
w->varcolbeg = 0;
@ -6006,7 +6006,8 @@ static const char *task_show (const WIN_t *q, struct pids_stack *p) {
* 1) exclusively for the 'current' window
* 2) immediately after interacting with the user
* 3) who struck: up, down, pgup, pgdn, home, end, 'o/O' or 'u/U'
* 4) or upon the user switching from one window to another window */
* 4) or upon the user switching from one window to another window
* ( note: it's entirely possible there are NO visible tasks to show ) */
static void window_hlp (void) {
WIN_t *w = Curwin; // avoid gcc bloat with a local copy
int i, reversed;
@ -6040,8 +6041,10 @@ fwd_redux:
&& (*task_show(w, w->ppt[i])))
break;
}
w->begtask = i;
// reached the top, but maybe this guy ain't visible
if (!(w->begtask = i) && !reversed) {
if (!w->begtask && !reversed) {
if (!(wins_usrselect(w, w->ppt[0]))
|| (!(*task_show(w, w->ppt[0])))) {
reversed = 1;
@ -6081,7 +6084,7 @@ static int window_show (WIN_t *q, int wmax) {
error_exit(fmtmk(N_fmt(LIB_errorpid_fmt),__LINE__, strerror(errno)));
}
if (q->begnext) window_hlp();
if (mkVIZyes) window_hlp();
else OFFw(q, NOPRINT_xxx);
i = q->begtask;

View File

@ -402,7 +402,9 @@ typedef struct WIN_t {
// Support for a proper (visible) row #1 whenever Curwin changes
// ( or a key which might affect vertical scrolling was struck )
#define mkVIZrow1(q) { q->begtask -= 1; q->begnext = +1; }
#define mkVIZyes Curwin->begnext != 0
#define mkVIZrow1 { Curwin->begnext = +1; Curwin->begtask -= 1; }
#define mkVIZrowX(n) { Curwin->begnext = (n); }
/* Special Section: end ------------------------------------------ */
/* /////////////////////////////////////////////////////////////// */