mirror of
https://github.com/jarun/nnn.git
synced 2025-01-09 01:21:10 +00:00
Alternate scrolling rules.
This commit is contained in:
parent
9dc3976533
commit
a752235892
84
src/nnn.c
84
src/nnn.c
|
@ -473,6 +473,7 @@ static void redraw(char *path);
|
|||
static int spawn(char *file, char *arg1, char *arg2, const char *dir, uchar flag);
|
||||
static int (*nftw_fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf);
|
||||
static int dentfind(const char *fname, int n);
|
||||
static void move_cursor(int target, int ignore_scrolloff);
|
||||
|
||||
/* Functions */
|
||||
|
||||
|
@ -1656,7 +1657,7 @@ end:
|
|||
if (*ch != '\t')
|
||||
g_ctx[cfg.curctx].c_fltr[0] = g_ctx[cfg.curctx].c_fltr[1] = '\0';
|
||||
|
||||
curscroll = MAX(0, cur - SCROLLOFF);
|
||||
move_cursor(cur, 0);
|
||||
|
||||
curs_set(FALSE);
|
||||
settimeout();
|
||||
|
@ -2881,11 +2882,33 @@ static void populate(char *path, char *lastname)
|
|||
/* Find cur from history */
|
||||
/* No NULL check for lastname, always points to an array */
|
||||
if (!*lastname)
|
||||
cur = 0;
|
||||
move_cursor(0, 0);
|
||||
else
|
||||
cur = dentfind(lastname, ndents);
|
||||
move_cursor(dentfind(lastname, ndents), 0);
|
||||
}
|
||||
|
||||
curscroll = MAX(0, cur - SCROLLOFF);
|
||||
static void move_cursor(int target, int ignore_scrolloff)
|
||||
{
|
||||
int delta, scrolloff, onscreen = xlines - 4;
|
||||
target = MAX(0, MIN(ndents - 1, target));
|
||||
delta = target - cur;
|
||||
cur = target;
|
||||
if (!ignore_scrolloff) {
|
||||
scrolloff = MIN(SCROLLOFF, onscreen >> 1);
|
||||
/*
|
||||
* When ignore_scrolloff is 1, the cursor can jump into the scrolloff
|
||||
* margin area, but when ignore_scrolloff is 0, act like a boa
|
||||
* constrictor and squeeze the cursor towards the middle region of the
|
||||
* screen by allowing it to move inward and disallowing it to move
|
||||
* outward (deeper into the scrolloff margin area).
|
||||
*/
|
||||
if (cur < curscroll + scrolloff && delta < 0)
|
||||
curscroll += delta;
|
||||
else if (cur > curscroll + onscreen - scrolloff - 1 && delta > 0)
|
||||
curscroll += delta;
|
||||
}
|
||||
curscroll = MIN(curscroll, MIN(cur, ndents - onscreen));
|
||||
curscroll = MAX(curscroll, MAX(cur - (onscreen - 1), 0));
|
||||
}
|
||||
|
||||
static void redraw(char *path)
|
||||
|
@ -2895,7 +2918,6 @@ static void redraw(char *path)
|
|||
|
||||
int ncols = (xcols <= PATH_MAX) ? xcols : PATH_MAX;
|
||||
int lastln = xlines, onscreen = xlines - 4;
|
||||
int scrolloff = MIN(SCROLLOFF, onscreen >> 1);
|
||||
int i, attrs;
|
||||
char buf[12];
|
||||
char c;
|
||||
|
@ -2905,12 +2927,8 @@ static void redraw(char *path)
|
|||
/* Clear screen */
|
||||
erase();
|
||||
|
||||
if (ndents <= onscreen)
|
||||
curscroll = 0;
|
||||
else if (cur < curscroll + scrolloff)
|
||||
curscroll = MAX(0, cur - scrolloff);
|
||||
else if (cur > curscroll + onscreen - scrolloff - 1)
|
||||
curscroll = MIN(ndents - onscreen, cur - onscreen + scrolloff + 1);
|
||||
/* Enforce scroll/cursor invariants */
|
||||
move_cursor(cur, 1);
|
||||
|
||||
#ifdef DIR_LIMITED_COPY
|
||||
if (cfg.copymode)
|
||||
|
@ -3168,7 +3186,7 @@ nochange:
|
|||
if (r >= ndents)
|
||||
goto nochange;
|
||||
|
||||
cur = r;
|
||||
move_cursor(r, 1);
|
||||
|
||||
// Single click just selects, double click also opens
|
||||
if (event.bstate != BUTTON1_DOUBLE_CLICKED)
|
||||
|
@ -3264,42 +3282,38 @@ nochange:
|
|||
goto nochange;
|
||||
}
|
||||
case SEL_NEXT:
|
||||
if (cur < ndents - 1)
|
||||
++cur;
|
||||
else if (ndents)
|
||||
/* Roll over, set cursor to first entry */
|
||||
cur = 0;
|
||||
if (ndents)
|
||||
move_cursor((cur + 1) % ndents, 0);
|
||||
break;
|
||||
case SEL_PREV:
|
||||
if (cur > 0)
|
||||
--cur;
|
||||
else if (ndents)
|
||||
/* Roll over, set cursor to last entry */
|
||||
cur = ndents - 1;
|
||||
if (ndents)
|
||||
move_cursor((cur + ndents - 1) % ndents, 0);
|
||||
break;
|
||||
case SEL_PGDN: // fallthrough
|
||||
onscreen = xlines - 4;
|
||||
move_cursor(curscroll + (onscreen - 1), 1);
|
||||
curscroll += onscreen - 1;
|
||||
break;
|
||||
case SEL_CTRL_D:
|
||||
onscreen = xlines - 4;
|
||||
r = sel == SEL_PGDN ? onscreen - 1 : onscreen >> 1;
|
||||
curscroll = MIN(ndents - onscreen, curscroll + r);
|
||||
cur = (curscroll == ndents - onscreen) ? cur + r :
|
||||
curscroll + MIN(SCROLLOFF, onscreen >> 1);
|
||||
cur = MIN(ndents - 1, cur);
|
||||
move_cursor(curscroll + (onscreen - 1), 1);
|
||||
curscroll += onscreen >> 1;
|
||||
break;
|
||||
case SEL_PGUP: // fallthrough
|
||||
onscreen = xlines - 4;
|
||||
move_cursor(curscroll, 1);
|
||||
curscroll -= onscreen - 1;
|
||||
break;
|
||||
case SEL_CTRL_U:
|
||||
onscreen = xlines - 4;
|
||||
r = sel == SEL_PGUP ? onscreen - 1 : onscreen >> 1;
|
||||
curscroll = MAX(0, curscroll - r);
|
||||
cur = (curscroll == 0) ? cur - r :
|
||||
curscroll + onscreen - MIN(SCROLLOFF, onscreen >> 1) - 1;
|
||||
cur = MAX(0, cur);
|
||||
move_cursor(curscroll, 1);
|
||||
curscroll -= onscreen >> 1;
|
||||
break;
|
||||
case SEL_HOME:
|
||||
cur = 0;
|
||||
move_cursor(0, 1);
|
||||
break;
|
||||
case SEL_END:
|
||||
cur = ndents - 1;
|
||||
move_cursor(ndents - 1, 1);
|
||||
break;
|
||||
case SEL_CDHOME: // fallthrough
|
||||
case SEL_CDBEGIN: // fallthrough
|
||||
|
@ -3797,7 +3811,7 @@ nochange:
|
|||
|
||||
/* Don't optimize cur if filtering is on */
|
||||
if (!cfg.filtermode && cur && access(newpath, F_OK) == -1)
|
||||
--cur;
|
||||
move_cursor(cur - 1, 0);
|
||||
|
||||
/* We reduce cur only if it is > 0, so it's at least 0 */
|
||||
copycurname();
|
||||
|
|
Loading…
Reference in a new issue