top: plug a minor hole in the vertical scrolling logic

In that commit referenced below, a few edge cases were
addressed regarding vertical positioning involving any
'hidden' tasks. But, 2 additional edge cases remained.

In a running top, if the user employed 'other filters'
(o/O) or 'user filters' (u/U) proper vertical position
was not ensured. And, while this could be easily fixed
by striking the home/end or up/down arrow keys, it was
very poor etiquette to shift this burden to the users.

So, this patch plugs that gap, automating the process.

Reference(s):
commit 9d59ddc466

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner 2018-09-18 00:00:00 -05:00 committed by Craig Small
parent a6dfc2382e
commit 59f02f19c7
2 changed files with 9 additions and 4 deletions

View File

@ -4231,7 +4231,8 @@ static void wins_stage_2 (void) {
// fill in missing Fieldstab members and build each window's columnhdr // fill in missing Fieldstab members and build each window's columnhdr
zap_fieldstab(); zap_fieldstab();
// with preserved 'other filters', ensure a visible task on row #1 // with preserved 'other filters' & command line 'user filters',
// we must ensure that we always have a visible task on row one.
mkVIZrow1(Curwin); mkVIZrow1(Curwin);
// lastly, initialize a signal set used to throttle one troublesome signal // lastly, initialize a signal set used to throttle one troublesome signal
@ -4943,7 +4944,10 @@ static void keys_task (int ch) {
case 'O': case 'O':
case 'o': case 'o':
case kbd_CtrlO: case kbd_CtrlO:
if (VIZCHKw(w)) other_filters(ch); if (VIZCHKw(w)) {
other_filters(ch);
mkVIZrow1(w);
}
break; break;
case 'U': case 'U':
case 'u': case 'u':
@ -4952,6 +4956,7 @@ static void keys_task (int ch) {
if (*str != kbd_ESC if (*str != kbd_ESC
&& (errmsg = user_certify(w, str, ch))) && (errmsg = user_certify(w, str, ch)))
show_msg(errmsg); show_msg(errmsg);
mkVIZrow1(w);
} }
break; break;
case 'V': case 'V':
@ -5780,7 +5785,7 @@ static const char *task_show (const WIN_t *q, struct pids_stack *p) {
* In reality, this function is called: * In reality, this function is called:
* 1) exclusively for the 'current' window * 1) exclusively for the 'current' window
* 2) immediately after interacting with the user * 2) immediately after interacting with the user
* 3) who struck 1 of these: up, down, pgup, pgdn, home or end * 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 */
static void window_hlp (void) { static void window_hlp (void) {
WIN_t *w = Curwin; // avoid gcc bloat with a local copy WIN_t *w = Curwin; // avoid gcc bloat with a local copy

View File

@ -390,7 +390,7 @@ typedef struct WIN_t {
#endif #endif
// Support for a proper (visible) row #1 whenever Curwin changes // Support for a proper (visible) row #1 whenever Curwin changes
// ( or a certain vertical scrolling key has been struck ) // ( or a key which might affect vertical scrolling was struck )
#define mkVIZrow1(q) { q->begtask -= 1; q->begnext = +1; } #define mkVIZrow1(q) { q->begtask -= 1; q->begnext = +1; }
/* Special Section: end ------------------------------------------ */ /* Special Section: end ------------------------------------------ */