top: provide for avoiding task focus ('F') distortions

In the patch referenced below the focus task logic was
improved to ensure that newly cloned tasks 'above' the
focused task did not force an effect like the up arrow
key. That commit also acknowledged that when some task
'above' ended, it *would* act like the down arrow key.

Well, with this commit a task ending 'above' a focused
task no longer distorts the focus. That's assuming the
new '#define FOCUS_HARD_Y' is specified plus the total
focused tasks does not exceed the current screen rows.

Thus, the manual scrolling with up and down arrow keys
is allowed when the total focused exceeds screen rows.

[ but keep in mind that when a focused task has been ]
[ hardened some otherwise useful toggles will not be ]
[ available. keystrokes like 'v' and even 'F' itself ]
[ can not be applied to another task with no scroll. ]

    Reference(s):
. 01/03/22, newlib branch equivalent commit
commit 0e744d3656
. 09/24/21, master branch 'focus' logic improved
commit d7e6c27a79

Signed-off-by: Jim Warner <james.warner@comcast.net>
This commit is contained in:
Jim Warner
2022-01-13 13:13:13 -06:00
committed by Craig Small
parent 6ba099a4d6
commit 99ec6247ec
2 changed files with 14 additions and 4 deletions

View File

@@ -4887,7 +4887,7 @@ static inline const char *forest_display (const WIN_t *q, int idx) {
const char *which = (CHKw(q, Show_CMDLIN)) ? *p->cmdline : p->cmd;
int level = p->pad_3;
#ifdef TREE_FOCUS_X
#ifdef FOCUS_TREE_X
if (q->focus_pid) {
if (idx >= q->focus_beg && idx < q->focus_end)
level -= q->focus_lvl;
@@ -4928,7 +4928,7 @@ static void forest_excluded (WIN_t *q) {
if (i == Frame_maxtask)
q->focus_pid = q->begtask = 0;
else {
#ifdef TREE_FOCUS_X
#ifdef FOCUS_TREE_X
q->focus_lvl = level;
#endif
while (i+1 < Frame_maxtask && q->ppt[i+1]->pad_3 > level)
@@ -4939,6 +4939,15 @@ static void forest_excluded (WIN_t *q) {
q->begtask = q->focus_beg;
q->begnext = 0; // as 'mkVIZoff' but in any window
}
#ifdef FOCUS_HARD_Y
// if some task 'above' us ended, try to maintain focus
// ( but allow scrolling when there are many children )
if (q->begtask > q->focus_beg
&& (Screen_rows > (q->focus_end - q->focus_beg))) {
q->begtask = q->focus_beg;
q->begnext = 0; // as 'mkVIZoff' but in any window
}
#endif
}
} // end: forest_excluded