X-Git-Url: https://git.danieliu.xyz/?p=smdp.git;a=blobdiff_plain;f=src%2Fviewer.c;h=97e62df7f9114dc354502df634c5f9a0ae66fcd3;hp=8d97139ffb187b6258a09cc9bc5328d958a1dd28;hb=51b2a847fc5798c5b0f56ae93f6e1355038df840;hpb=4b8ad1b3b464836eca2e876dd418a8e8d87bd721 diff --git a/src/viewer.c b/src/viewer.c index 8d97139..97e62df 100644 --- a/src/viewer.c +++ b/src/viewer.c @@ -73,6 +73,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa int max_lines = 0; // max lines per slide int max_cols = 0; // max columns per line int offset; // text offset + int stop = 0; // passed stop bits per slide // header line 1 is displayed at the top int bar_top = (deck->headers > 0) ? 1 : 0; @@ -92,11 +93,11 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa while(line && line->text) { - if (line->text->text) - lc += url_count_inline(line->text->text); + if (line->text->value) + lc += url_count_inline(line->text->value); - if (line->text->text) - line->length -= url_len_inline(line->text->text); + if (line->text->value) + line->length -= url_len_inline(line->text->value); if(line->length > COLS) { i = line->length; @@ -268,7 +269,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa // add text to header mvwaddwstr(stdscr, 0, (COLS - line->length + offset) / 2, - &line->text->text[offset]); + &line->text->value[offset]); } // setup footer @@ -278,7 +279,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa // add text to left footer mvwaddwstr(stdscr, LINES - 1, 3, - &line->text->text[offset]); + &line->text->value[offset]); } // add slide number to right footer @@ -291,21 +292,34 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa wrefresh(stdscr); line = slide->line; - l = 0; + l = stop = 0; // print lines while(line) { add_line(content, l, (COLS - max_cols) / 2, line, max_cols, colors); + + // raise stop counter if we pass a line having a stop bit + if(CHECK_BIT(line->bits, IS_STOP)) + stop++; + l += (line->length / COLS) + 1; line = line->next; + + // only stop here if we didn't stop here recently + if(stop > slide->stop) + break; } - int i, ymax; - getmaxyx( content, ymax, i ); - for (i = 0; i < url_get_amount(); i++) { - mvwprintw(content, ymax - url_get_amount() - 1 + i, 3, - "[%d] ", i); - waddwstr(content, url_get_target(i)); + // print pandoc URL references + // only if we already printed all lines of the current slide + if(!line) { + int i, ymax; + getmaxyx( content, ymax, i ); + for (i = 0; i < url_get_amount(); i++) { + mvwprintw(content, ymax - url_get_amount() - 1 + i, 3, + "[%d] ", i); + waddwstr(content, url_get_target(i)); + } } // make content visible @@ -326,7 +340,7 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa i = 0; switch(c) { - // show previous slide + // show previous slide or stop bit case KEY_UP: case KEY_LEFT: case KEY_PPAGE: @@ -335,15 +349,23 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa case 263: // BACKSPACE (getty) case 'h': case 'k': - if(slide->prev) { - slide = slide->prev; - sc--; + if(stop > 1 || (stop == 1 && !line)) { + // show current slide again + // but stop one stop bit earlier + slide->stop--; } else { - fade = false; + if(slide->prev) { + // show previous slide + slide = slide->prev; + sc--; + } else { + // do nothing + fade = false; + } } break; - // show next slide + // show next slide or stop bit case KEY_DOWN: case KEY_RIGHT: case KEY_NPAGE: @@ -351,11 +373,19 @@ int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reloa case ' ': // SPACE case 'j': case 'l': - if(slide->next) { - slide = slide->next; - sc++; + if(stop && line) { + // show current slide again + // but stop one stop bit later (or at end of slide) + slide->stop++; } else { - fade = false; + if(slide->next) { + // show next slide + slide = slide->next; + sc++; + } else { + // do nothing + fade = false; + } } break; @@ -458,7 +488,7 @@ 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->text) { + if(!line->text->value) { return; } @@ -486,7 +516,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo "%s", prompt); if(!CHECK_BIT(line->bits, IS_CODE)) - inline_display(window, &line->text->text[offset], colors); + inline_display(window, &line->text->value[offset], colors); // IS_UNORDERED_LIST_2 } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_2)) { @@ -505,7 +535,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo "%s", prompt); if(!CHECK_BIT(line->bits, IS_CODE)) - inline_display(window, &line->text->text[offset], colors); + inline_display(window, &line->text->value[offset], colors); // IS_UNORDERED_LIST_1 } else if(CHECK_BIT(line->bits, IS_UNORDERED_LIST_1)) { @@ -523,7 +553,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo "%s", prompt); if(!CHECK_BIT(line->bits, IS_CODE)) - inline_display(window, &line->text->text[offset], colors); + inline_display(window, &line->text->value[offset], colors); } // IS_CODE @@ -537,7 +567,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo wattron(window, COLOR_PAIR(CP_BLACK)); // print whole lines - waddwstr(window, &line->text->text[offset]); + waddwstr(window, &line->text->value[offset]); } if(!CHECK_BIT(line->bits, IS_UNORDERED_LIST_1) && @@ -547,7 +577,7 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo // IS_QUOTE if(CHECK_BIT(line->bits, IS_QUOTE)) { - while(line->text->text[offset] == '>') { + while(line->text->value[offset] == '>') { // print a reverse color block if(colors) { wattron(window, COLOR_PAIR(CP_BLACK)); @@ -560,11 +590,11 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo // find next quote or break offset++; - if(line->text->text[offset] == ' ') + if(line->text->value[offset] == ' ') offset = next_word(line->text, offset); } - inline_display(window, &line->text->text[offset], colors); + inline_display(window, &line->text->value[offset], colors); } else { // IS_CENTER @@ -586,25 +616,28 @@ void add_line(WINDOW *window, int y, int x, line_t *line, int max_cols, int colo wattron(window, A_UNDERLINE); // skip hashes - while(line->text->text[offset] == '#') + while(line->text->value[offset] == '#') offset = next_word(line->text, offset); // print whole lines - waddwstr(window, &line->text->text[offset]); + waddwstr(window, &line->text->value[offset]); wattroff(window, A_UNDERLINE); // no line-wide markdown } else { - inline_display(window, &line->text->text[offset], colors); + inline_display(window, &line->text->value[offset], colors); } } } // fill rest off line with spaces - for(i = getcurx(window) - x; i < max_cols; i++) - wprintw(window, "%s", " "); + // we only need this if the color is inverted (e.g. code-blocks), + // to ensure the background fades too + if(CHECK_BIT(line->bits, IS_CODE)) + for(i = getcurx(window) - x; i < max_cols; i++) + wprintw(window, "%s", " "); // reset to default color if(colors)