From c43dce6926b28402dd3f820d7cae90cb932e6b67 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Thu, 26 Dec 2019 19:37:48 +0530 Subject: [PATCH] Refactor context selection --- src/nnn.c | 119 +++++++++++++++++++++++++++--------------------------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/src/nnn.c b/src/nnn.c index 1d46b291..93c15735 100644 --- a/src/nnn.c +++ b/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) { xlines = LINES; @@ -4495,10 +4535,7 @@ nochange: if (cfg.runplugin) { cfg.runplugin = 0; /* Must be in plugin dir and same context to select plugin */ - if ((cfg.runctx != cfg.curctx) - || (strcmp(path, plugindir) != 0)) - ; /* We are somewhere else, continue as usual */ - else { + if ((cfg.runctx == cfg.curctx) && !strcmp(path, plugindir)) { /* Copy path so we can return back to earlier dir */ xstrlcpy(path, rundir, PATH_MAX); rundir[0] = '\0'; @@ -4611,24 +4648,29 @@ nochange: case SEL_CTX2: // fallthrough case SEL_CTX3: // fallthrough case SEL_CTX4: - switch (sel) { - 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: + if (sel == SEL_LEADER) { xstrlcpy(g_buf, messages[MSG_BOOKMARK_KEYS], CMD_LEN_MAX); printkeys(bookmark, g_buf + strlen(g_buf), BM_MAX); printprompt(g_buf); 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) { @@ -4644,47 +4686,6 @@ nochange: if (ndents) copycurname(); 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)) {