fixed window refresh behavior for #100
[smdp.git] / src / viewer.c
index 0021e79..925efb1 100644 (file)
@@ -2,7 +2,7 @@
  * Functions necessary to display a deck of slides in different color modes
  * using ncurses. Only white, red, and blue are supported, as they can be
  * faded in 256 color mode.
- * Copyright (C) 2015 Michael Goehler
+ * Copyright (C) 2016 Michael Goehler
  *
  * This file is part of mdp.
  *
@@ -93,11 +93,10 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
 
         while(line && line->text) {
 
-            if (line->text->value)
+            if (line->text->value) {
                 lc += url_count_inline(line->text->value);
-
-            if (line->text->value)
                 line->length -= url_len_inline(line->text->value);
+            }
 
             if(line->length > COLS) {
                 i = line->length;
@@ -230,12 +229,14 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
         colors = 1;
     }
 
-    // set background color of main window
+    // set background color for main window
     if(colors)
-        wbkgd(stdscr, COLOR_PAIR(CP_YELLOW));
+        wbkgd(stdscr, COLOR_PAIR(CP_WHITE));
 
-    // setup main window
+    // setup content window
     WINDOW *content = newwin(LINES - bar_top - bar_bottom, COLS, 0 + bar_top, 0);
+
+    // set background color of content window
     if(colors)
         wbkgd(content, COLOR_PAIR(CP_WHITE));
 
@@ -262,6 +263,10 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
         // always resize window in case terminal geometry has changed
         wresize(content, LINES - bar_top - bar_bottom, COLS);
 
+        // set main window text color
+        if(colors)
+            wattron(stdscr, COLOR_PAIR(CP_YELLOW));
+
         // setup header
         if(bar_top) {
             line = deck->header;
@@ -305,9 +310,8 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
                 break;
         }
 
-        // make header + fooder visible
-        wrefresh(content);
-        wrefresh(stdscr);
+        // copy changed lines in main window to virtual screen
+        wnoutrefresh(stdscr);
 
         line = slide->line;
         l = stop = 0;
@@ -340,8 +344,11 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
             }
         }
 
-        // make content visible
-        wrefresh(content);
+        // copy changed lines in content window to virtual screen
+        wnoutrefresh(content);
+
+        // compare virtual screen to physical screen and does the actual updates
+        doupdate();
 
         // fade in
         if(fade)
@@ -371,11 +378,15 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
                     // show current slide again
                     // but stop one stop bit earlier
                     slide->stop--;
+                    fade = false;
                 } else {
                     if(slide->prev) {
                         // show previous slide
                         slide = slide->prev;
                         sc--;
+                        //stop on first bullet point always
+                        if(slide->stop > 0)
+                            slide->stop = 0;
                     } else {
                         // do nothing
                         fade = false;
@@ -395,6 +406,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
                     // show current slide again
                     // but stop one stop bit later (or at end of slide)
                     slide->stop++;
+                    fade = false;
                 } else {
                     if(slide->next) {
                         // show next slide
@@ -506,16 +518,26 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
 
 void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) {
 
-    if(!line->text->value) {
-        return;
-    }
-
     int i; // increment
     int offset = 0; // text offset
 
     // move the cursor in position
     wmove(window, y, x);
 
+    if(!line->text->value) {
+
+        // fill rest off line with spaces if we are in a code block
+        if(CHECK_BIT(line->bits, IS_CODE) && colors) {
+            if(colors)
+                wattron(window, COLOR_PAIR(CP_BLACK));
+            for(i = getcurx(window) - x; i < max_cols; i++)
+                wprintw(window, "%s", " ");
+        }
+
+        // do nothing
+        return;
+    }
+
     // IS_UNORDERED_LIST_3
     if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_3)) {
         offset = next_nonblank(line->text, 0);
@@ -577,10 +599,10 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
     // IS_CODE
     if(CHECK_BIT(line->bits, IS_CODE)) {
 
-       if (!CHECK_BIT(line->bits, IS_TILDE_CODE)) {
-               // set static offset for code
-               offset = CODE_INDENT;
-       }
+        if (!CHECK_BIT(line->bits, IS_TILDE_CODE)) {
+            // set static offset for code
+            offset = CODE_INDENT;
+        }
 
         // reverse color for code blocks
         if(colors)
@@ -849,8 +871,11 @@ void fade_out(WINDOW *window, int trans, int colors, int invert) {
                 init_pair(CP_BLACK, 16, white_ramp[i]);
             }
 
-            // refresh window with new color
-            wrefresh(window);
+            // refresh virtual screen with new color
+            wnoutrefresh(window);
+
+            // compare virtual screen to physical screen and does the actual updates
+            doupdate();
 
             // delay for our eyes to recognize the change
             usleep(FADE_DELAY);
@@ -876,8 +901,11 @@ void fade_in(WINDOW *window, int trans, int colors, int invert) {
                 init_pair(CP_BLACK, 16, white_ramp[i]);
             }
 
-            // refresh window with new color
-            wrefresh(window);
+            // refresh virtual screen with new color
+            wnoutrefresh(window);
+
+            // compare virtual screen to physical screen and does the actual updates
+            doupdate();
 
             // delay for our eyes to recognize the change
             usleep(FADE_DELAY);