]> Sergey Matveev's repositories - nnn.git/commitdiff
Update context switch logic
authorArun Prakash Jana <engineerarun@gmail.com>
Wed, 13 Mar 2019 17:14:11 +0000 (22:44 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Wed, 13 Mar 2019 17:14:23 +0000 (22:44 +0530)
src/nnn.c

index 449de4f8ce9b79296734c9d3d640592de387def4..117d329ddf0aab0f773a93cebddebda1e14cca8d 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -3176,11 +3176,11 @@ nochange:
                                r = cfg.curctx;
                                if (fd == '>' || fd == '.')
                                        do
-                                               (r == CTX_MAX - 1) ? (r = 0) : ++r;
+                                               r = (r + 1) & ~CTX_MAX;
                                        while (!g_ctx[r].c_cfg.ctxactive);
                                else
                                        do
-                                               (r == 0) ? (r = CTX_MAX - 1) : --r;
+                                               r = (r + (CTX_MAX - 1)) & (CTX_MAX - 1);
                                        while (!g_ctx[r].c_cfg.ctxactive); // fallthrough
                                fd = '1' + r; // fallthrough
                        case '1': // fallthrough
@@ -3919,26 +3919,28 @@ nochange:
                                        presel = MSGWAIT;
                                        goto nochange;
                                }
-                       } // fallthrough
+                       }
+
+                       dentfree(dents);
+                       return;
                case SEL_QUITCTX:
-                       if (sel == SEL_QUITCTX) {
-                               r = cfg.curctx;
-                               for (fd = 1; fd < CTX_MAX; ++fd) {
-                                       (r == CTX_MAX - 1) ? (r = 0) : ++r;
-                                       if (g_ctx[r].c_cfg.ctxactive) {
-                                               g_ctx[cfg.curctx].c_cfg.ctxactive = 0;
+                       fd = cfg.curctx;
+                       for (r = (fd + 1) & ~CTX_MAX;
+                            (r != fd) && !g_ctx[r].c_cfg.ctxactive;
+                            r = ((r + 1) & ~CTX_MAX));
 
-                                               /* Switch to next active context */
-                                               path = g_ctx[r].c_path;
-                                               lastdir = g_ctx[r].c_last;
-                                               lastname = g_ctx[r].c_name;
-                                               cfg = g_ctx[r].c_cfg;
+                       if (r != fd) {
+                               g_ctx[fd].c_cfg.ctxactive = 0;
 
-                                               cfg.curctx = r;
-                                               setdirwatch();
-                                               goto begin;
-                                       }
-                               }
+                               /* Switch to next active context */
+                               path = g_ctx[r].c_path;
+                               lastdir = g_ctx[r].c_last;
+                               lastname = g_ctx[r].c_name;
+                               cfg = g_ctx[r].c_cfg;
+
+                               cfg.curctx = r;
+                               setdirwatch();
+                               goto begin;
                        }
 
                        dentfree(dents);