mirror of
https://github.com/jarun/nnn.git
synced 2025-01-09 17:39:38 +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 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 (*nftw_fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf);
|
||||||
static int dentfind(const char *fname, int n);
|
static int dentfind(const char *fname, int n);
|
||||||
|
static void move_cursor(int target, int ignore_scrolloff);
|
||||||
|
|
||||||
/* Functions */
|
/* Functions */
|
||||||
|
|
||||||
|
@ -1656,7 +1657,7 @@ end:
|
||||||
if (*ch != '\t')
|
if (*ch != '\t')
|
||||||
g_ctx[cfg.curctx].c_fltr[0] = g_ctx[cfg.curctx].c_fltr[1] = '\0';
|
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);
|
curs_set(FALSE);
|
||||||
settimeout();
|
settimeout();
|
||||||
|
@ -2881,11 +2882,33 @@ static void populate(char *path, char *lastname)
|
||||||
/* Find cur from history */
|
/* Find cur from history */
|
||||||
/* No NULL check for lastname, always points to an array */
|
/* No NULL check for lastname, always points to an array */
|
||||||
if (!*lastname)
|
if (!*lastname)
|
||||||
cur = 0;
|
move_cursor(0, 0);
|
||||||
else
|
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)
|
static void redraw(char *path)
|
||||||
|
@ -2895,7 +2918,6 @@ static void redraw(char *path)
|
||||||
|
|
||||||
int ncols = (xcols <= PATH_MAX) ? xcols : PATH_MAX;
|
int ncols = (xcols <= PATH_MAX) ? xcols : PATH_MAX;
|
||||||
int lastln = xlines, onscreen = xlines - 4;
|
int lastln = xlines, onscreen = xlines - 4;
|
||||||
int scrolloff = MIN(SCROLLOFF, onscreen >> 1);
|
|
||||||
int i, attrs;
|
int i, attrs;
|
||||||
char buf[12];
|
char buf[12];
|
||||||
char c;
|
char c;
|
||||||
|
@ -2905,12 +2927,8 @@ static void redraw(char *path)
|
||||||
/* Clear screen */
|
/* Clear screen */
|
||||||
erase();
|
erase();
|
||||||
|
|
||||||
if (ndents <= onscreen)
|
/* Enforce scroll/cursor invariants */
|
||||||
curscroll = 0;
|
move_cursor(cur, 1);
|
||||||
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);
|
|
||||||
|
|
||||||
#ifdef DIR_LIMITED_COPY
|
#ifdef DIR_LIMITED_COPY
|
||||||
if (cfg.copymode)
|
if (cfg.copymode)
|
||||||
|
@ -3168,7 +3186,7 @@ nochange:
|
||||||
if (r >= ndents)
|
if (r >= ndents)
|
||||||
goto nochange;
|
goto nochange;
|
||||||
|
|
||||||
cur = r;
|
move_cursor(r, 1);
|
||||||
|
|
||||||
// Single click just selects, double click also opens
|
// Single click just selects, double click also opens
|
||||||
if (event.bstate != BUTTON1_DOUBLE_CLICKED)
|
if (event.bstate != BUTTON1_DOUBLE_CLICKED)
|
||||||
|
@ -3264,42 +3282,38 @@ nochange:
|
||||||
goto nochange;
|
goto nochange;
|
||||||
}
|
}
|
||||||
case SEL_NEXT:
|
case SEL_NEXT:
|
||||||
if (cur < ndents - 1)
|
if (ndents)
|
||||||
++cur;
|
move_cursor((cur + 1) % ndents, 0);
|
||||||
else if (ndents)
|
|
||||||
/* Roll over, set cursor to first entry */
|
|
||||||
cur = 0;
|
|
||||||
break;
|
break;
|
||||||
case SEL_PREV:
|
case SEL_PREV:
|
||||||
if (cur > 0)
|
if (ndents)
|
||||||
--cur;
|
move_cursor((cur + ndents - 1) % ndents, 0);
|
||||||
else if (ndents)
|
|
||||||
/* Roll over, set cursor to last entry */
|
|
||||||
cur = ndents - 1;
|
|
||||||
break;
|
break;
|
||||||
case SEL_PGDN: // fallthrough
|
case SEL_PGDN: // fallthrough
|
||||||
|
onscreen = xlines - 4;
|
||||||
|
move_cursor(curscroll + (onscreen - 1), 1);
|
||||||
|
curscroll += onscreen - 1;
|
||||||
|
break;
|
||||||
case SEL_CTRL_D:
|
case SEL_CTRL_D:
|
||||||
onscreen = xlines - 4;
|
onscreen = xlines - 4;
|
||||||
r = sel == SEL_PGDN ? onscreen - 1 : onscreen >> 1;
|
move_cursor(curscroll + (onscreen - 1), 1);
|
||||||
curscroll = MIN(ndents - onscreen, curscroll + r);
|
curscroll += onscreen >> 1;
|
||||||
cur = (curscroll == ndents - onscreen) ? cur + r :
|
|
||||||
curscroll + MIN(SCROLLOFF, onscreen >> 1);
|
|
||||||
cur = MIN(ndents - 1, cur);
|
|
||||||
break;
|
break;
|
||||||
case SEL_PGUP: // fallthrough
|
case SEL_PGUP: // fallthrough
|
||||||
|
onscreen = xlines - 4;
|
||||||
|
move_cursor(curscroll, 1);
|
||||||
|
curscroll -= onscreen - 1;
|
||||||
|
break;
|
||||||
case SEL_CTRL_U:
|
case SEL_CTRL_U:
|
||||||
onscreen = xlines - 4;
|
onscreen = xlines - 4;
|
||||||
r = sel == SEL_PGUP ? onscreen - 1 : onscreen >> 1;
|
move_cursor(curscroll, 1);
|
||||||
curscroll = MAX(0, curscroll - r);
|
curscroll -= onscreen >> 1;
|
||||||
cur = (curscroll == 0) ? cur - r :
|
|
||||||
curscroll + onscreen - MIN(SCROLLOFF, onscreen >> 1) - 1;
|
|
||||||
cur = MAX(0, cur);
|
|
||||||
break;
|
break;
|
||||||
case SEL_HOME:
|
case SEL_HOME:
|
||||||
cur = 0;
|
move_cursor(0, 1);
|
||||||
break;
|
break;
|
||||||
case SEL_END:
|
case SEL_END:
|
||||||
cur = ndents - 1;
|
move_cursor(ndents - 1, 1);
|
||||||
break;
|
break;
|
||||||
case SEL_CDHOME: // fallthrough
|
case SEL_CDHOME: // fallthrough
|
||||||
case SEL_CDBEGIN: // fallthrough
|
case SEL_CDBEGIN: // fallthrough
|
||||||
|
@ -3797,7 +3811,7 @@ nochange:
|
||||||
|
|
||||||
/* Don't optimize cur if filtering is on */
|
/* Don't optimize cur if filtering is on */
|
||||||
if (!cfg.filtermode && cur && access(newpath, F_OK) == -1)
|
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 */
|
/* We reduce cur only if it is > 0, so it's at least 0 */
|
||||||
copycurname();
|
copycurname();
|
||||||
|
|
Loading…
Reference in a new issue