]> Sergey Matveev's repositories - nnn.git/commitdiff
Minor changes to fast redraw
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 12 Jan 2020 18:03:42 +0000 (23:33 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 12 Jan 2020 18:03:42 +0000 (23:33 +0530)
README.md
src/nnn.c

index fa28e4f8e31e46b84609d5f7e8eae908e9ff3946..99e7ceefe625c02cdc32ce6d8e01fcb172190d0c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -30,6 +30,7 @@ It runs smoothly on the Raspberry Pi, Termux [on Android](https://www.youtube.co
   - Works with 8-bit colors
   - Disk-IO sensitive (few disk reads and writes)
   - No FPU usage (all integer calculations, even for file size)
+  - Minimizes screen refresh with fast line redraws
 - Portable
   - Minimal library deps, easily compilable, tiny binary
   - No config file, minimal config with sensible defaults
index 304f935a780f7d890cb5895655696a09d010e7d6..2f51da250759c067bb907aaa9a532b36818798e5 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -337,7 +337,6 @@ static kv plug[PLUGIN_MAX];
 static uchar g_tmpfplen;
 static uchar blk_shift = BLK_SHIFT_512;
 static regex_t archive_re;
-static bool is_move_op = FALSE;
 
 /* Retain old signal handlers */
 #ifdef __linux__
@@ -364,6 +363,7 @@ static char g_pipepath[TMP_LEN_MAX] __attribute__ ((aligned));
 #define STATE_PLUGIN_INIT 0x1
 #define STATE_INTERRUPTED 0x2
 #define STATE_RANGESEL 0x4
+#define STATE_MOVE_OP 0x8
 
 static uchar g_states;
 
@@ -656,7 +656,7 @@ static char *xitoa(uint val)
 static void clearinfoln(void)
 {
        move(xlines - 2, 0);
-       clrtoeol();
+       addch('\n');
 }
 
 #ifdef KEY_RESIZE
@@ -665,7 +665,7 @@ static void clearoldprompt(void)
 {
        clearinfoln();
        tolastln();
-       clrtoeol();
+       addch('\n');
 }
 #endif
 
@@ -4287,7 +4287,46 @@ static void statusbar(char *path)
                         sort, buf, get_lsperms(pent->mode), coolsize(pent->size), ptr, fname);
        }
 
-       clrtoeol();
+       addch('\n');
+}
+
+static int adjust_cols(int ncols)
+{
+       /* Calculate the number of cols available to print entry name */
+       if (cfg.showdetail) {
+               /* Fallback to light mode if less than 35 columns */
+               if (ncols < 36) {
+                       cfg.showdetail ^= 1;
+                       printptr = &printent;
+                       ncols -= 3; /* Preceding space, indicator, newline */
+               } else
+                       ncols -= 35;
+       } else
+               ncols -= 3; /* Preceding space, indicator, newline */
+
+       attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
+       cfg.dircolor = 1;
+
+       return ncols;
+}
+
+static void draw_line(char *path, int ncols)
+{
+       ncols = adjust_cols(ncols);
+
+       move(2 + last - curscroll, 0);
+       printptr(&dents[last], ncols, false);
+       move(2 + cur - curscroll, 0);
+       printptr(&dents[cur], ncols, true);
+
+       /* Must reset e.g. no files in dir */
+       if (cfg.dircolor) {
+               attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
+               cfg.dircolor = 0;
+       }
+
+       statusbar(path);
+       return;
 }
 
 static void redraw(char *path)
@@ -4301,36 +4340,11 @@ static void redraw(char *path)
        char *ptr = path;
 
        // Fast redraw
-       if (is_move_op && last_curscroll == curscroll) {
-               is_move_op = FALSE;
-               /* Calculate the number of cols available to print entry name */
-               if (cfg.showdetail) {
-                       /* Fallback to light mode if less than 35 columns */
-                       if (ncols < 36) {
-                               cfg.showdetail ^= 1;
-                               printptr = &printent;
-                               ncols -= 3; /* Preceding space, indicator, newline */
-                       } else
-                               ncols -= 35;
-               } else
-                       ncols -= 3; /* Preceding space, indicator, newline */
-
-               attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
-               cfg.dircolor = 1;
-
-               move(2 + last - curscroll, 0);
-               printptr(&dents[last], ncols, false);
-               move(2 + cur - curscroll, 0);
-               printptr(&dents[cur], ncols, true);
+       if (g_states & STATE_MOVE_OP) {
+               g_states &= ~STATE_MOVE_OP;
 
-               /* Must reset e.g. no files in dir */
-               if (cfg.dircolor) {
-                       attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
-                       cfg.dircolor = 0;
-               }
-
-               statusbar(path);
-               return;
+               if (last_curscroll == curscroll)
+                       return draw_line(path, ncols);
        }
 
        /* Clear screen */
@@ -4401,20 +4415,7 @@ static void redraw(char *path)
 
        attroff(A_UNDERLINE);
 
-       /* Calculate the number of cols available to print entry name */
-       if (cfg.showdetail) {
-               /* Fallback to light mode if less than 35 columns */
-               if (ncols < 36) {
-                       cfg.showdetail ^= 1;
-                       printptr = &printent;
-                       ncols -= 3; /* Preceding space, indicator, newline */
-               } else
-                       ncols -= 35;
-       } else
-               ncols -= 3; /* Preceding space, indicator, newline */
-
-       attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
-       cfg.dircolor = 1;
+       ncols = adjust_cols(ncols);
 
        /* Print listing */
        for (i = curscroll; i < ndents && i < curscroll + onscreen; ++i)
@@ -4802,7 +4803,7 @@ nochange:
                case SEL_HOME: // fallthrough
                case SEL_END: // fallthrough
                case SEL_FIRST:
-                       is_move_op = TRUE;
+                       g_states |= STATE_MOVE_OP;
                        handle_screen_move(sel);
                        break;
                case SEL_CDHOME: // fallthrough