From 573c61f3300d0146c0bfd31d556e752e753f52d6 Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Wed, 13 Mar 2019 20:54:23 +0530 Subject: [PATCH] Modular context switch --- src/nnn.c | 45 ++++++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/nnn.c b/src/nnn.c index fa39f742..449de4f8 100644 --- a/src/nnn.c +++ b/src/nnn.c @@ -1872,6 +1872,33 @@ static int xlink(char *suffix, char *path, char *buf, int type) return count; } +static void savecurctx(settings *curcfg, char *path, char *curname, int r /* next context num */) +{ + settings cfg = *curcfg; + +#ifdef DIR_LIMITED_COPY + g_crc = 0; +#endif + /* Save current context */ + xstrlcpy(g_ctx[cfg.curctx].c_name, curname, NAME_MAX + 1); + g_ctx[cfg.curctx].c_cfg = cfg; + + if (g_ctx[r].c_cfg.ctxactive) /* Switch to saved context */ + cfg = g_ctx[r].c_cfg; + else { /* Setup a new context from current context */ + g_ctx[r].c_cfg.ctxactive = 1; + xstrlcpy(g_ctx[r].c_path, path, PATH_MAX); + g_ctx[r].c_last[0] = '\0'; + xstrlcpy(g_ctx[r].c_name, curname, NAME_MAX + 1); + g_ctx[r].c_cfg = cfg; + g_ctx[r].c_cfg.runscript = 0; + } + + cfg.curctx = r; + + *curcfg = cfg; +} + static bool parsebmstr(void) { int i = 0; @@ -3172,30 +3199,14 @@ nochange: if (fd != '\r') continue; } -#ifdef DIR_LIMITED_COPY - g_crc = 0; -#endif - /* Save current context */ - xstrlcpy(g_ctx[cfg.curctx].c_name, dents[cur].name, NAME_MAX + 1); - g_ctx[cfg.curctx].c_cfg = cfg; - if (g_ctx[r].c_cfg.ctxactive) /* Switch to saved context */ - cfg = g_ctx[r].c_cfg; - else { /* Setup a new context from current context */ - g_ctx[r].c_cfg.ctxactive = 1; - xstrlcpy(g_ctx[r].c_path, path, PATH_MAX); - g_ctx[r].c_last[0] = '\0'; - xstrlcpy(g_ctx[r].c_name, dents[cur].name, NAME_MAX + 1); - g_ctx[r].c_cfg = cfg; - g_ctx[r].c_cfg.runscript = 0; - } + 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; - cfg.curctx = r; setdirwatch(); goto begin; }