env vars documentation
[smdp.git] / src / viewer.c
index d106a62..89365bf 100644 (file)
@@ -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
@@ -60,6 +61,18 @@ static short red_ramp_invert[24]   = { 15, 231, 231, 224, 224, 225,
                                       206, 207, 201, 200, 199, 199,
                                       198, 198, 197, 197, 196, 196};
 
+// unordered list characters
+//
+// override via env vars:
+// export MDP_LIST_OPEN1="    " MDP_LIST_OPEN2="    " MDP_LIST_OPEN3="    "
+// export MDP_LIST_HEAD1=" ■  " MDP_LIST_HEAD2=" ●  " MDP_LIST_HEAD3=" ▫  "
+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 = " +- ";
+
 int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reload, int noreload, int slidenum) {
 
     int c = 0;          // char
@@ -229,12 +242,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 +276,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 +323,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 +357,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,6 +529,33 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa
     return reload;
 }
 
+void setup_list_strings(void)
+{
+    const char *str;
+
+    /* utf8 can require 6 bytes */
+    if ((str = getenv("MDP_LIST_OPEN")) != NULL && strlen(str) <= 4*6) {
+        list_open1 = list_open2 = list_open3 = str;
+    } else {
+        if ((str = getenv("MDP_LIST_OPEN1")) != NULL && strlen(str) <= 4*6)
+            list_open1 = str;
+        if ((str = getenv("MDP_LIST_OPEN2")) != NULL && strlen(str) <= 4*6)
+            list_open2 = str;
+        if ((str = getenv("MDP_LIST_OPEN3")) != NULL && strlen(str) <= 4*6)
+            list_open3 = str;
+    }
+    if ((str = getenv("MDP_LIST_HEAD")) != NULL && strlen(str) <= 4*6) {
+        list_head1 = list_head2 = list_head3 = str;
+    } else {
+        if ((str = getenv("MDP_LIST_HEAD1")) != NULL && strlen(str) <= 4*6)
+            list_head1 = str;
+        if ((str = getenv("MDP_LIST_HEAD2")) != NULL && strlen(str) <= 4*6)
+            list_head2 = str;
+        if ((str = getenv("MDP_LIST_HEAD3")) != NULL && strlen(str) <= 4*6)
+            list_head3 = str;
+    }
+}
+
 void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colors) {
 
     int i; // increment
@@ -533,14 +581,20 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo
     // 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;
         }
 
@@ -553,13 +607,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;
         }
 
@@ -572,12 +630,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;
         }
 
@@ -863,8 +921,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);
@@ -890,8 +951,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);