Added configurable list string from env.
[smdp.git] / src / viewer.c
index ea33584..56291db 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.
  *
@@ -26,6 +26,7 @@
 #include <wctype.h> // iswalnum
 #include <string.h> // strcpy
 #include <unistd.h> // usleep
+#include <stdlib.h> // getenv
 #include "viewer.h"
 
 // color ramp for fading from black to color
@@ -229,12 +230,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));
 
@@ -261,6 +264,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;
@@ -304,9 +311,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;
@@ -339,8 +345,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)
@@ -508,11 +517,56 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
     return reload;
 }
 
-void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) {
+static const char *list_open1 = " |  ";
+static const char *list_open2 = " |  ";
+static const char *list_open3 = " |  ";
+static const char *list_head1 = " +- ";
+static const char *list_head2 = " +- ";
+static const char *list_head3 = " +- ";
+/*
 
-    if(!line->text->value) {
-        return;
+export MDP_LIST_OPEN3="    "
+export MDP_LIST_OPEN2="    "
+export MDP_LIST_OPEN3="    "
+export MDP_LIST_HEAD1=" ■  "
+export MDP_LIST_HEAD2=" ▫  "
+export MDP_LIST_HEAD3=" ●  "
+
+export MDP_LIST_OPEN2=" │  "
+export MDP_LIST_OPEN2=" │  "
+export MDP_LIST_OPEN3=" │  "
+export MDP_LIST_HEAD1=" ▇─ "
+export MDP_LIST_HEAD2=" ▓─ "
+export MDP_LIST_HEAD3=" ▒─ "
+*
+*/
+void setup_list_strings(void)
+{
+    const char *str;
+
+    if ((str = getenv("MDP_LIST_OPEN")) != NULL) {
+        list_open1 = list_open2 = list_open3 = str;
+    } else {
+        if ((str = getenv("MDP_LIST_OPEN1")) != NULL)
+            list_open1 = str;
+        if ((str = getenv("MDP_LIST_OPEN2")) != NULL)
+            list_open2 = str;
+        if ((str = getenv("MDP_LIST_OPEN3")) != NULL)
+            list_open3 = str;
+    }
+    if ((str = getenv("MDP_LIST_HEAD")) != NULL) {
+        list_head1 = list_head2 = list_head3 = str;
+    } else {
+        if ((str = getenv("MDP_LIST_HEAD1")) != NULL)
+            list_head1 = str;
+        if ((str = getenv("MDP_LIST_HEAD2")) != NULL)
+            list_head2 = str;
+        if ((str = getenv("MDP_LIST_HEAD3")) != NULL)
+            list_head3 = str;
     }
+}
+
+void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) {
 
     int i; // increment
     int offset = 0; // text offset
@@ -520,17 +574,37 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
     // 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);
-        char prompt[13];
-        strcpy(&prompt[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
-        strcpy(&prompt[4], CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)? " |  " : "    ");
+        char prompt[13 * 6];
+        int pos = 0, len, cnt;
+        len = sizeof(prompt) - pos;
+        cnt = snprintf(&prompt[pos], len, "%s", CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? list_open1 : "    ");
+        pos += (cnt > len - 1 ? len - 1 : cnt);
+        len = sizeof(prompt) - pos;
+        cnt = snprintf(&prompt[pos], len, "%s", CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)? list_open2 : "    ");
+        pos += (cnt > len - 1 ? len - 1 : cnt);
+        len = sizeof(prompt) - pos;
 
         if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_EXT)) {
-            strcpy(&prompt[8], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_3)? " |  " : "    ");
+            snprintf(&prompt[pos], len, "%s", line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_3)? list_open3 : "    ");
         } else {
-            strcpy(&prompt[8], " +- ");
+            snprintf(&prompt[pos], len, "%s", list_head3);
             offset += 2;
         }
 
@@ -543,13 +617,17 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
     // IS_UNORDERED_LIST_2
     } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)) {
         offset = next_nonblank(line->text, 0);
-        char prompt[9];
-        strcpy(&prompt[0], CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
+        char prompt[9 * 6];
+        int pos = 0, len, cnt;
+        len = sizeof(prompt) - pos;
+        cnt = snprintf(&prompt[pos], len, "%s", CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)? list_open1 : "    ");
+        pos += (cnt > len - 1 ? len - 1 : cnt);
+        len = sizeof(prompt) - pos;
 
         if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_EXT)) {
-            strcpy(&prompt[4], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_2)? " |  " : "    ");
+            snprintf(&prompt[pos], len, "%s", line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_2)? list_open2 : "    ");
         } else {
-            strcpy(&prompt[4], " +- ");
+            snprintf(&prompt[pos], len, "%s", list_head2);
             offset += 2;
         }
 
@@ -562,12 +640,12 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
     // IS_UNORDERED_LIST_1
     } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)) {
         offset = next_nonblank(line->text, 0);
-        char prompt[5];
+        char prompt[5 * 6];
 
         if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_EXT)) {
-            strcpy(&prompt[0], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_1)? " |  " : "    ");
+            strcpy(&prompt[0], line->next && CHECK_BIT(line->next->bits, IS_UNORDERED_LIST_1)? list_open1 : "    ");
         } else {
-            strcpy(&prompt[0], " +- ");
+            strcpy(&prompt[0], list_head1);
             offset += 2;
         }
 
@@ -853,8 +931,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);
@@ -880,8 +961,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);