it* My version of sent Err codevoid.de 70 i Err codevoid.de 70 hgit clone git://git.codevoid.de/sent-sdk.git URL:git://git.codevoid.de/sent-sdk.git codevoid.de 70 1Log /git/sent-sdk/log.gph codevoid.de 70 1Files /git/sent-sdk/files.gph codevoid.de 70 1Refs /git/sent-sdk/refs.gph codevoid.de 70 1README /git/sent-sdk/file/README.md.gph codevoid.de 70 1LICENSE /git/sent-sdk/file/LICENSE.gph codevoid.de 70 i--- Err codevoid.de 70 1commit 22a0a7f25596c28588bac5bf9e12cd8c534684d4 /git/sent-sdk/commit/22a0a7f25596c28588bac5bf9e12cd8c534684d4.gph codevoid.de 70 1parent d7eac23083be2278327e94255a182a221a0df273 /git/sent-sdk/commit/d7eac23083be2278327e94255a182a221a0df273.gph codevoid.de 70 hAuthor: Markus Teich URL:mailto:markus.teich@stusta.mhn.de codevoid.de 70 iDate: Sat, 7 Nov 2015 23:54:23 +0100 Err codevoid.de 70 i Err codevoid.de 70 iadd multiline support Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M config.def.h | 2 ++ Err codevoid.de 70 i M example | 62 ++++++++++++++++++++++++++----- Err codevoid.de 70 i M sent.c | 133 +++++++++++++++++++++---------- Err codevoid.de 70 i Err codevoid.de 70 i3 files changed, 146 insertions(+), 51 deletions(-) Err codevoid.de 70 i--- Err codevoid.de 70 1diff --git a/config.def.h b/config.def.h /git/sent-sdk/file/config.def.h.gph codevoid.de 70 it@@ -11,6 +11,8 @@ static char *fontfallbacks[] = { Err codevoid.de 70 i static const char *fgcol = "#000000"; Err codevoid.de 70 i static const char *bgcol = "#FFFFFF"; Err codevoid.de 70 i Err codevoid.de 70 i+static const float linespacing = 1.4; Err codevoid.de 70 i+ Err codevoid.de 70 i /* how much screen estate is to be used at max for the content */ Err codevoid.de 70 i static const float usablewidth = 0.75; Err codevoid.de 70 i static const float usableheight = 0.75; Err codevoid.de 70 1diff --git a/example b/example /git/sent-sdk/file/example.gph codevoid.de 70 it@@ -1,14 +1,58 @@ Err codevoid.de 70 i sent Err codevoid.de 70 i-takahashi Err codevoid.de 70 i-why? Err codevoid.de 70 i+ Err codevoid.de 70 i+Origin: Err codevoid.de 70 i+ Takahashi Err codevoid.de 70 i+ Err codevoid.de 70 i+Why? Err codevoid.de 70 i+• PPTX sucks Err codevoid.de 70 i+• LATEX sucks Err codevoid.de 70 i+• PDF sucks Err codevoid.de 70 i+ Err codevoid.de 70 i+also: Err codevoid.de 70 i+terminal presentations Err codevoid.de 70 i+don't support images… Err codevoid.de 70 i+ Err codevoid.de 70 i @nyan.png Err codevoid.de 70 i+this text will not be displayed, since the @ at the start of the first line Err codevoid.de 70 i+makes this paragraph an image slide. Err codevoid.de 70 i+ Err codevoid.de 70 i easy to use Err codevoid.de 70 i-depends on Xlib, libpng Err codevoid.de 70 i+ Err codevoid.de 70 i+depends on Err codevoid.de 70 i+♽ Xlib Err codevoid.de 70 i+☢ libpng Err codevoid.de 70 i+ Err codevoid.de 70 i ~1000 lines of code Err codevoid.de 70 i-how? Err codevoid.de 70 i-sent FILENAME Err codevoid.de 70 i-one slide per line Err codevoid.de 70 i+ Err codevoid.de 70 i+usage: Err codevoid.de 70 i+$ sent FILE1 [FILE2 …] Err codevoid.de 70 i+ Err codevoid.de 70 i+▸ one slide per paragraph Err codevoid.de 70 i+▸ lines starting with # are ignored Err codevoid.de 70 i+▸ paragraphs starting with a @ line are png images Err codevoid.de 70 i+▸ for an empty slide just use a \ as a paragraph Err codevoid.de 70 i+ Err codevoid.de 70 i # This is a comment and will not be part of the presentation Err codevoid.de 70 i-# The next line starts with a whitespace, it will not produce an image slide Err codevoid.de 70 i- @FILE.png Err codevoid.de 70 i-thanks / questions? Err codevoid.de 70 i+ Err codevoid.de 70 i+# multiple empty lines between paragraphs are also ignored Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 i+# The following lines should produce Err codevoid.de 70 i+# one empty slide Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 i+ Err codevoid.de 70 i+\ Err codevoid.de 70 i+\ Err codevoid.de 70 i+ Err codevoid.de 70 i+\@this_line_actually_started_with_a_\.png Err codevoid.de 70 i+\#This line as well Err codevoid.de 70 i+⇒ Prepend a backslash to kill behaviour of special characters Err codevoid.de 70 i+ Err codevoid.de 70 i+😀😁😂😃😄😅😆😇😈😉😊😋😌😍😎😏 Err codevoid.de 70 i+😐😑😒😓😔😕😖😗😘😙😚😛😜😝😞😟 Err codevoid.de 70 i+😠😡😢😣😥😦😧😨😩😪😫😭😮😯😰😱 Err codevoid.de 70 i+😲😳😴😵😶😷😸😹😺😻😼😽😾😿🙀☠ Err codevoid.de 70 i+ Err codevoid.de 70 i+thanks Err codevoid.de 70 i+questions? Err codevoid.de 70 1diff --git a/sent.c b/sent.c /git/sent-sdk/file/sent.c.gph codevoid.de 70 it@@ -43,7 +43,8 @@ typedef struct { Err codevoid.de 70 i } Image; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- char *text; Err codevoid.de 70 i+ unsigned int linecount; Err codevoid.de 70 i+ char **lines; Err codevoid.de 70 i Image *img; Err codevoid.de 70 i } Slide; Err codevoid.de 70 i Err codevoid.de 70 it@@ -85,7 +86,7 @@ static int pngprepare(Image *img); Err codevoid.de 70 i static void pngscale(Image *img); Err codevoid.de 70 i static void pngdraw(Image *img); Err codevoid.de 70 i Err codevoid.de 70 i-static void getfontsize(char *str, unsigned int *width, unsigned int *height); Err codevoid.de 70 i+static void getfontsize(Slide *s, unsigned int *width, unsigned int *height); Err codevoid.de 70 i static void cleanup(); Err codevoid.de 70 i static void eprintf(const char *, ...); Err codevoid.de 70 i static void die(const char *, ...); Err codevoid.de 70 it@@ -149,7 +150,7 @@ Image *pngopen(char *filename) Err codevoid.de 70 i return NULL; Err codevoid.de 70 i } Err codevoid.de 70 i if (!(img->info_ptr = png_create_info_struct(img->png_ptr)) Err codevoid.de 70 i- || setjmp(png_jmpbuf(img->png_ptr))) { Err codevoid.de 70 i+ || setjmp(png_jmpbuf(img->png_ptr))) { Err codevoid.de 70 i pngfree(img); Err codevoid.de 70 i return NULL; Err codevoid.de 70 i } Err codevoid.de 70 it@@ -315,28 +316,38 @@ void pngdraw(Image *img) Err codevoid.de 70 i img->state |= DRAWN; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void getfontsize(char *str, unsigned int *width, unsigned int *height) Err codevoid.de 70 i+void getfontsize(Slide *s, unsigned int *width, unsigned int *height) Err codevoid.de 70 i { Err codevoid.de 70 i- size_t i; Err codevoid.de 70 i+ size_t i, j; Err codevoid.de 70 i+ unsigned int curw, imax; Err codevoid.de 70 i+ float lfac = linespacing * (s->linecount - 1) + 1; Err codevoid.de 70 i Err codevoid.de 70 i- for (i = 0; i < NUMFONTSCALES; i++) { Err codevoid.de 70 i- drw_setfontset(d, fonts[i]); Err codevoid.de 70 i- *height = fonts[i]->h; Err codevoid.de 70 i- *width = drw_fontset_getwidth(d, str); Err codevoid.de 70 i- if (*width > xw.uw || *height > xw.uh) Err codevoid.de 70 i+ /* fit height */ Err codevoid.de 70 i+ for (j = NUMFONTSCALES - 1; j >= 0; j--) Err codevoid.de 70 i+ if (fonts[j]->h * lfac <= xw.uh) Err codevoid.de 70 i break; Err codevoid.de 70 i+ drw_setfontset(d, fonts[j]); Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* fit width */ Err codevoid.de 70 i+ *width = 0; Err codevoid.de 70 i+ for (i = 0; i < s->linecount; i++) { Err codevoid.de 70 i+ curw = drw_fontset_getwidth(d, s->lines[i]); Err codevoid.de 70 i+ if (curw >= *width) Err codevoid.de 70 i+ imax = i; Err codevoid.de 70 i+ while (j >= 0 && curw > xw.uw) { Err codevoid.de 70 i+ drw_setfontset(d, fonts[--j]); Err codevoid.de 70 i+ curw = drw_fontset_getwidth(d, s->lines[i]); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (imax == i) Err codevoid.de 70 i+ *width = curw; Err codevoid.de 70 i } Err codevoid.de 70 i- if (i > 0) { Err codevoid.de 70 i- drw_setfontset(d, fonts[i-1]); Err codevoid.de 70 i- *height = fonts[i-1]->h; Err codevoid.de 70 i- *width = drw_fontset_getwidth(d, str); Err codevoid.de 70 i- } Err codevoid.de 70 i- *width += d->fonts->h; Err codevoid.de 70 i+ *height = fonts[j]->h * lfac; Err codevoid.de 70 i+ *width += fonts[j]->h; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void cleanup() Err codevoid.de 70 i { Err codevoid.de 70 i- unsigned int i; Err codevoid.de 70 i+ unsigned int i, j; Err codevoid.de 70 i Err codevoid.de 70 i for (i = 0; i < NUMFONTSCALES; i++) Err codevoid.de 70 i drw_fontset_free(fonts[i]); Err codevoid.de 70 it@@ -348,8 +359,9 @@ void cleanup() Err codevoid.de 70 i XCloseDisplay(xw.dpy); Err codevoid.de 70 i if (slides) { Err codevoid.de 70 i for (i = 0; i < slidecount; i++) { Err codevoid.de 70 i- if (slides[i].text) Err codevoid.de 70 i- free(slides[i].text); Err codevoid.de 70 i+ for (j = 0; j < slides[i].linecount; j++) Err codevoid.de 70 i+ free(slides[i].lines[j]); Err codevoid.de 70 i+ free(slides[i].lines); Err codevoid.de 70 i if (slides[i].img) Err codevoid.de 70 i pngfree(slides[i].img); Err codevoid.de 70 i } Err codevoid.de 70 it@@ -394,27 +406,57 @@ void eprintf(const char *fmt, ...) Err codevoid.de 70 i void load(FILE *fp) Err codevoid.de 70 i { Err codevoid.de 70 i static size_t size = 0; Err codevoid.de 70 i+ size_t blen, maxlines; Err codevoid.de 70 i char buf[BUFSIZ], *p; Err codevoid.de 70 i- size_t i = slidecount; Err codevoid.de 70 i+ Slide *s; Err codevoid.de 70 i Err codevoid.de 70 i /* read each line from fp and add it to the item list */ Err codevoid.de 70 i- while (fgets(buf, sizeof(buf), fp)) { Err codevoid.de 70 i- if ((i+1) * sizeof(*slides) >= size) Err codevoid.de 70 i+ while (1) { Err codevoid.de 70 i+ if ((slidecount+1) * sizeof(*slides) >= size) Err codevoid.de 70 i if (!(slides = realloc(slides, (size += BUFSIZ)))) Err codevoid.de 70 i die("cannot realloc %u bytes:", size); Err codevoid.de 70 i- if (*buf == '#') Err codevoid.de 70 i- continue; Err codevoid.de 70 i- if ((p = strchr(buf, '\n'))) Err codevoid.de 70 i- *p = '\0'; Err codevoid.de 70 i- if (!(slides[i].text = strdup(buf))) Err codevoid.de 70 i- die("cannot strdup %u bytes:", strlen(buf)+1); Err codevoid.de 70 i- if (slides[i].text[0] == '@') Err codevoid.de 70 i- slides[i].img = pngopen(slides[i].text + 1); Err codevoid.de 70 i- else Err codevoid.de 70 i- slides[i].img = 0; Err codevoid.de 70 i- i++; Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* eat consecutive empty lines */ Err codevoid.de 70 i+ while ((p = fgets(buf, sizeof(buf), fp))) Err codevoid.de 70 i+ if (strcmp(buf, "\n") != 0 && buf[0] != '#') Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ if (!p) Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* read one slide */ Err codevoid.de 70 i+ maxlines = 0; Err codevoid.de 70 i+ memset((s = &slides[slidecount]), 0, sizeof(Slide)); Err codevoid.de 70 i+ do { Err codevoid.de 70 i+ if (buf[0] == '#') Err codevoid.de 70 i+ continue; Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* grow lines array */ Err codevoid.de 70 i+ if (s->linecount >= maxlines) { Err codevoid.de 70 i+ maxlines = 2 * s->linecount + 1; Err codevoid.de 70 i+ if (!(s->lines = realloc(s->lines, maxlines * sizeof(s->lines[0])))) Err codevoid.de 70 i+ die("cannot realloc %u bytes:", maxlines * sizeof(s->lines[0])); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ blen = strlen(buf); Err codevoid.de 70 i+ if (!(s->lines[s->linecount] = strdup(buf))) Err codevoid.de 70 i+ die("cannot strdup:"); Err codevoid.de 70 i+ if (s->lines[s->linecount][blen-1] == '\n') Err codevoid.de 70 i+ s->lines[s->linecount][blen-1] = '\0'; Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* only make image slide if first line of a slide starts with @ */ Err codevoid.de 70 i+ if (s->linecount == 0 && s->lines[0][0] == '@') { Err codevoid.de 70 i+ memmove(s->lines[0], &s->lines[0][1], blen); Err codevoid.de 70 i+ s->img = pngopen(s->lines[0]); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (s->lines[s->linecount][0] == '\\') Err codevoid.de 70 i+ memmove(s->lines[s->linecount], &s->lines[s->linecount][1], blen); Err codevoid.de 70 i+ s->linecount++; Err codevoid.de 70 i+ } while ((p = fgets(buf, sizeof(buf), fp)) && strcmp(buf, "\n") != 0); Err codevoid.de 70 i+ slidecount++; Err codevoid.de 70 i+ if (!p) Err codevoid.de 70 i+ break; Err codevoid.de 70 i } Err codevoid.de 70 i- slidecount = i; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i void advance(const Arg *arg) Err codevoid.de 70 it@@ -427,9 +469,9 @@ void advance(const Arg *arg) Err codevoid.de 70 i idx = new_idx; Err codevoid.de 70 i xdraw(); Err codevoid.de 70 i if (slidecount > idx + 1 && slides[idx + 1].img && !pngread(slides[idx + 1].img)) Err codevoid.de 70 i- die("could not read image %s", slides[idx + 1].text + 1); Err codevoid.de 70 i+ die("could not read image %s", slides[idx + 1].lines[0]); Err codevoid.de 70 i if (0 < idx && slides[idx - 1].img && !pngread(slides[idx - 1].img)) Err codevoid.de 70 i- die("could not read image %s", slides[idx - 1].text + 1); Err codevoid.de 70 i+ die("could not read image %s", slides[idx - 1].lines[0]); Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 it@@ -476,20 +518,27 @@ void usage() Err codevoid.de 70 i Err codevoid.de 70 i void xdraw() Err codevoid.de 70 i { Err codevoid.de 70 i- unsigned int height, width; Err codevoid.de 70 i+ unsigned int height, width, i; Err codevoid.de 70 i Image *im = slides[idx].img; Err codevoid.de 70 i Err codevoid.de 70 i- getfontsize(slides[idx].text, &width, &height); Err codevoid.de 70 i+ getfontsize(&slides[idx], &width, &height); Err codevoid.de 70 i XClearWindow(xw.dpy, xw.win); Err codevoid.de 70 i Err codevoid.de 70 i if (!im) { Err codevoid.de 70 i drw_rect(d, 0, 0, xw.w, xw.h, 1, 1); Err codevoid.de 70 i- drw_text(d, (xw.w - width) / 2, (xw.h - height) / 2, width, height, slides[idx].text, 0); Err codevoid.de 70 i+ for (i = 0; i < slides[idx].linecount; i++) Err codevoid.de 70 i+ drw_text(d, Err codevoid.de 70 i+ (xw.w - width) / 2, Err codevoid.de 70 i+ (xw.h - height) / 2 + i * linespacing * d->fonts->h, Err codevoid.de 70 i+ width, Err codevoid.de 70 i+ d->fonts->h, Err codevoid.de 70 i+ slides[idx].lines[i], Err codevoid.de 70 i+ 0); Err codevoid.de 70 i drw_map(d, xw.win, 0, 0, xw.w, xw.h); Err codevoid.de 70 i } else if (!(im->state & LOADED) && !pngread(im)) { Err codevoid.de 70 i- eprintf("could not read image %s", slides[idx].text + 1); Err codevoid.de 70 i+ eprintf("could not read image %s", slides[idx].lines[0]); Err codevoid.de 70 i } else if (!(im->state & SCALED) && !pngprepare(im)) { Err codevoid.de 70 i- eprintf("could not prepare image %s for drawing", slides[idx].text + 1); Err codevoid.de 70 i+ eprintf("could not prepare image %s for drawing", slides[idx].lines[0]); Err codevoid.de 70 i } else if (!(im->state & DRAWN)) { Err codevoid.de 70 i pngdraw(im); Err codevoid.de 70 i } Err codevoid.de 70 it@@ -634,7 +683,7 @@ int main(int argc, char *argv[]) Err codevoid.de 70 i } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i- if (!slides || !slides[0].text) Err codevoid.de 70 i+ if (!slides || !slides[0].lines) Err codevoid.de 70 i usage(); Err codevoid.de 70 i Err codevoid.de 70 i xinit(); Err codevoid.de 70 .