* 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) 2014 Michael Goehler
+ * Copyright (C) 2015 Michael Goehler
*
* This file is part of mdp.
*
206, 207, 201, 200, 199, 199,
198, 198, 197, 197, 196, 196};
-int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reload, int noreload) {
+int ncurses_display(deck_t *deck, int notrans, int nofade, int invert, int reload, int noreload, int slidenum) {
int c = 0; // char
int i = 0; // iterate
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;
// header line 2 is displayed at the bottom
// anyway we display the slide number at the bottom
- int bar_bottom = 1;
+ int bar_bottom = (slidenum || deck->headers > 1)? 1 : 0;
slide_t *slide = deck->slide;
line_t *line;
if(deck->headers > 1) {
line = deck->header->next;
offset = next_blank(line->text, 0) + 1;
- // add text to left footer
- mvwaddwstr(stdscr,
- LINES - 1, 3,
- &line->text->value[offset]);
+ switch(slidenum) {
+ case 0: // add text to center footer
+ mvwaddwstr(stdscr,
+ LINES - 1, (COLS - line->length + offset) / 2,
+ &line->text->value[offset]);
+ break;
+ case 1:
+ case 2: // add text to left footer
+ mvwaddwstr(stdscr,
+ LINES - 1, 3,
+ &line->text->value[offset]);
+ break;
+ }
}
// add slide number to right footer
- mvwprintw(stdscr,
- LINES - 1, COLS - int_length(deck->slides) - int_length(sc) - 6,
- "%d / %d", sc, deck->slides);
+ switch(slidenum) {
+ case 1: // show slide number only
+ mvwprintw(stdscr,
+ LINES - 1, COLS - int_length(sc) - 3,
+ "%d", sc);
+ break;
+ case 2: // show current slide & number of slides
+ mvwprintw(stdscr,
+ LINES - 1, COLS - int_length(deck->slides) - int_length(sc) - 6,
+ "%d / %d", sc, deck->slides);
+ break;
+ }
// make header + fooder visible
wrefresh(content);
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
i = 0;
switch(c) {
- // show previous slide
+ // show previous slide or stop bit
case KEY_UP:
case KEY_LEFT:
case KEY_PPAGE:
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:
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;
// 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;
+ }
// reverse color for code blocks
if(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)
if (*i == L'!') i++;
- if (wcschr(i, L']')[1] == L'(') {
+ if (wcschr(i, L']')[1] == L'(' && wcschr(i, L')')) {
i++;
// turn higlighting and underlining on