mirror of
https://github.com/jarun/nnn.git
synced 2024-11-28 13:51:31 +00:00
Refactor context selection
This commit is contained in:
parent
0d07e45efb
commit
c43dce6926
119
src/nnn.c
119
src/nnn.c
|
@ -4067,6 +4067,46 @@ static inline void handle_screen_move(enum action sel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int handle_context_switch(enum action sel, char *newpath)
|
||||||
|
{
|
||||||
|
int r = -1, input;
|
||||||
|
|
||||||
|
switch (sel) {
|
||||||
|
case SEL_CYCLE: // fallthrough
|
||||||
|
case SEL_CYCLER:
|
||||||
|
/* visit next and previous contexts */
|
||||||
|
r = cfg.curctx;
|
||||||
|
if (sel == SEL_CYCLE)
|
||||||
|
do
|
||||||
|
r = (r + 1) & ~CTX_MAX;
|
||||||
|
while (!g_ctx[r].c_cfg.ctxactive);
|
||||||
|
else
|
||||||
|
do
|
||||||
|
r = (r + (CTX_MAX - 1)) & (CTX_MAX - 1);
|
||||||
|
while (!g_ctx[r].c_cfg.ctxactive);
|
||||||
|
// fallthrough
|
||||||
|
default: /* SEL_CTXN */
|
||||||
|
if (sel >= SEL_CTX1) /* CYCLE keys are lesser in value */
|
||||||
|
r = sel - SEL_CTX1; /* Save the next context id */
|
||||||
|
|
||||||
|
if (cfg.curctx == r) {
|
||||||
|
if (sel != SEL_CYCLE)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
(r == CTX_MAX - 1) ? (r = 0) : ++r;
|
||||||
|
snprintf(newpath, PATH_MAX, messages[MSG_CREATE_CTX], r + 1);
|
||||||
|
input = get_input(newpath);
|
||||||
|
if (input != 'y' && input != 'Y')
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg.selmode)
|
||||||
|
lastappendpos = selbufpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static void redraw(char *path)
|
static void redraw(char *path)
|
||||||
{
|
{
|
||||||
xlines = LINES;
|
xlines = LINES;
|
||||||
|
@ -4495,10 +4535,7 @@ nochange:
|
||||||
if (cfg.runplugin) {
|
if (cfg.runplugin) {
|
||||||
cfg.runplugin = 0;
|
cfg.runplugin = 0;
|
||||||
/* Must be in plugin dir and same context to select plugin */
|
/* Must be in plugin dir and same context to select plugin */
|
||||||
if ((cfg.runctx != cfg.curctx)
|
if ((cfg.runctx == cfg.curctx) && !strcmp(path, plugindir)) {
|
||||||
|| (strcmp(path, plugindir) != 0))
|
|
||||||
; /* We are somewhere else, continue as usual */
|
|
||||||
else {
|
|
||||||
/* Copy path so we can return back to earlier dir */
|
/* Copy path so we can return back to earlier dir */
|
||||||
xstrlcpy(path, rundir, PATH_MAX);
|
xstrlcpy(path, rundir, PATH_MAX);
|
||||||
rundir[0] = '\0';
|
rundir[0] = '\0';
|
||||||
|
@ -4611,24 +4648,29 @@ nochange:
|
||||||
case SEL_CTX2: // fallthrough
|
case SEL_CTX2: // fallthrough
|
||||||
case SEL_CTX3: // fallthrough
|
case SEL_CTX3: // fallthrough
|
||||||
case SEL_CTX4:
|
case SEL_CTX4:
|
||||||
switch (sel) {
|
if (sel == SEL_LEADER) {
|
||||||
case SEL_CYCLE:
|
|
||||||
fd = '\t';
|
|
||||||
break;
|
|
||||||
case SEL_CYCLER:
|
|
||||||
fd = KEY_BTAB;
|
|
||||||
break;
|
|
||||||
case SEL_CTX1: // fallthrough
|
|
||||||
case SEL_CTX2: // fallthrough
|
|
||||||
case SEL_CTX3: // fallthrough
|
|
||||||
case SEL_CTX4:
|
|
||||||
fd = sel - SEL_CTX1 + '1';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
xstrlcpy(g_buf, messages[MSG_BOOKMARK_KEYS], CMD_LEN_MAX);
|
xstrlcpy(g_buf, messages[MSG_BOOKMARK_KEYS], CMD_LEN_MAX);
|
||||||
printkeys(bookmark, g_buf + strlen(g_buf), BM_MAX);
|
printkeys(bookmark, g_buf + strlen(g_buf), BM_MAX);
|
||||||
printprompt(g_buf);
|
printprompt(g_buf);
|
||||||
fd = get_input(NULL);
|
fd = get_input(NULL);
|
||||||
|
|
||||||
|
if (fd >= '1' && fd <= '4')
|
||||||
|
sel = SEL_CTX1 + (fd - '1');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sel != SEL_LEADER) {
|
||||||
|
r = handle_context_switch(sel, newpath);
|
||||||
|
if (r < 0)
|
||||||
|
continue;
|
||||||
|
savecurctx(&cfg, path, dents[cur].name, r);
|
||||||
|
|
||||||
|
/* Reset the pointers */
|
||||||
|
path = g_ctx[r].c_path;
|
||||||
|
lastdir = g_ctx[r].c_last;
|
||||||
|
lastname = g_ctx[r].c_name;
|
||||||
|
|
||||||
|
setdirwatch();
|
||||||
|
goto begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (fd) {
|
switch (fd) {
|
||||||
|
@ -4644,47 +4686,6 @@ nochange:
|
||||||
if (ndents)
|
if (ndents)
|
||||||
copycurname();
|
copycurname();
|
||||||
goto begin;
|
goto begin;
|
||||||
case '\t': // fallthrough
|
|
||||||
case KEY_BTAB:
|
|
||||||
/* visit next and previous contexts */
|
|
||||||
r = cfg.curctx;
|
|
||||||
if (fd == '\t')
|
|
||||||
do
|
|
||||||
r = (r + 1) & ~CTX_MAX;
|
|
||||||
while (!g_ctx[r].c_cfg.ctxactive);
|
|
||||||
else
|
|
||||||
do
|
|
||||||
r = (r + (CTX_MAX - 1)) & (CTX_MAX - 1);
|
|
||||||
while (!g_ctx[r].c_cfg.ctxactive);
|
|
||||||
fd = '1' + r; // fallthrough
|
|
||||||
case '1': // fallthrough
|
|
||||||
case '2': // fallthrough
|
|
||||||
case '3': // fallthrough
|
|
||||||
case '4':
|
|
||||||
r = fd - '1'; /* Save the next context id */
|
|
||||||
if (cfg.curctx == r) {
|
|
||||||
if (sel != SEL_CYCLE)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
(r == CTX_MAX - 1) ? (r = 0) : ++r;
|
|
||||||
snprintf(newpath, PATH_MAX, messages[MSG_CREATE_CTX], r + 1);
|
|
||||||
fd = get_input(newpath);
|
|
||||||
if (fd != 'y' && fd != 'Y')
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cfg.selmode)
|
|
||||||
lastappendpos = selbufpos;
|
|
||||||
|
|
||||||
savecurctx(&cfg, path, dents[cur].name, r);
|
|
||||||
|
|
||||||
/* Reset the pointers */
|
|
||||||
path = g_ctx[r].c_path;
|
|
||||||
lastdir = g_ctx[r].c_last;
|
|
||||||
lastname = g_ctx[r].c_name;
|
|
||||||
|
|
||||||
setdirwatch();
|
|
||||||
goto begin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!get_kv_val(bookmark, newpath, fd, BM_MAX, TRUE)) {
|
if (!get_kv_val(bookmark, newpath, fd, BM_MAX, TRUE)) {
|
||||||
|
|
Loading…
Reference in a new issue