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 982e80256045fcbe6e41dd057b21539480098a70 /git/sent-sdk/commit/982e80256045fcbe6e41dd057b21539480098a70.gph codevoid.de 70 1parent 72d33d463fed7ba271961a6f91cae1fed8faa454 /git/sent-sdk/commit/72d33d463fed7ba271961a6f91cae1fed8faa454.gph codevoid.de 70 hAuthor: Stefan Hagen URL:mailto:sh+git[at]codevoid[dot]de codevoid.de 70 iDate: Sun, 3 Nov 2019 12:17:28 +0100 Err codevoid.de 70 i Err codevoid.de 70 iProgress bar patch + %retab Err codevoid.de 70 i Err codevoid.de 70 iDiffstat: Err codevoid.de 70 i M config.def.h | 3 +++ Err codevoid.de 70 i M config.mk | 2 +- Err codevoid.de 70 i M sent.c | 1026 +++++++++++++++---------------- Err codevoid.de 70 i Err codevoid.de 70 i3 files changed, 508 insertions(+), 523 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@@ -19,6 +19,9 @@ static const float linespacing = 1.4; 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 i Err codevoid.de 70 i+/* height of the presentation progress bar */ Err codevoid.de 70 i+static const int progressheight = 5; Err codevoid.de 70 i+ Err codevoid.de 70 i static Mousekey mshortcuts[] = { Err codevoid.de 70 i /* button function argument */ Err codevoid.de 70 i { Button1, advance, {.i = +1} }, Err codevoid.de 70 1diff --git a/config.mk b/config.mk /git/sent-sdk/file/config.mk.gph codevoid.de 70 it@@ -14,7 +14,7 @@ X11LIB = /usr/X11R6/lib Err codevoid.de 70 i INCS = -I. -I/usr/include -I/usr/include/freetype2 -I${X11INC} Err codevoid.de 70 i LIBS = -L/usr/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11 Err codevoid.de 70 i # OpenBSD (uncomment) Err codevoid.de 70 i-#INCS = -I. -I${X11INC} -I${X11INC}/freetype2 Err codevoid.de 70 i+INCS = -I. -I${X11INC} -I${X11INC}/freetype2 Err codevoid.de 70 i # FreeBSD (uncomment) Err codevoid.de 70 i #INCS = -I. -I/usr/local/include -I/usr/local/include/freetype2 -I${X11INC} Err codevoid.de 70 i #LIBS = -L/usr/local/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11 Err codevoid.de 70 1diff --git a/sent.c b/sent.c /git/sent-sdk/file/sent.c.gph codevoid.de 70 it@@ -31,59 +31,59 @@ char *argv0; Err codevoid.de 70 i #define MAXFONTSTRLEN 128 Err codevoid.de 70 i Err codevoid.de 70 i typedef enum { Err codevoid.de 70 i- NONE = 0, Err codevoid.de 70 i- SCALED = 1, Err codevoid.de 70 i+ NONE = 0, Err codevoid.de 70 i+ SCALED = 1, Err codevoid.de 70 i } imgstate; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- unsigned char *buf; Err codevoid.de 70 i- unsigned int bufwidth, bufheight; Err codevoid.de 70 i- imgstate state; Err codevoid.de 70 i- XImage *ximg; Err codevoid.de 70 i- int numpasses; Err codevoid.de 70 i+ unsigned char *buf; Err codevoid.de 70 i+ unsigned int bufwidth, bufheight; Err codevoid.de 70 i+ imgstate state; Err codevoid.de 70 i+ XImage *ximg; Err codevoid.de 70 i+ int numpasses; Err codevoid.de 70 i } Image; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- char *regex; Err codevoid.de 70 i- char *bin; Err codevoid.de 70 i+ char *regex; Err codevoid.de 70 i+ char *bin; Err codevoid.de 70 i } Filter; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { 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- char *embed; 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+ char *embed; Err codevoid.de 70 i } Slide; Err codevoid.de 70 i Err codevoid.de 70 i /* Purely graphic info */ Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- Display *dpy; Err codevoid.de 70 i- Window win; Err codevoid.de 70 i- Atom wmdeletewin, netwmname; Err codevoid.de 70 i- Visual *vis; Err codevoid.de 70 i- XSetWindowAttributes attrs; Err codevoid.de 70 i- int scr; Err codevoid.de 70 i- int w, h; Err codevoid.de 70 i- int uw, uh; /* usable dimensions for drawing text and images */ Err codevoid.de 70 i+ Display *dpy; Err codevoid.de 70 i+ Window win; Err codevoid.de 70 i+ Atom wmdeletewin, netwmname; Err codevoid.de 70 i+ Visual *vis; Err codevoid.de 70 i+ XSetWindowAttributes attrs; Err codevoid.de 70 i+ int scr; Err codevoid.de 70 i+ int w, h; Err codevoid.de 70 i+ int uw, uh; /* usable dimensions for drawing text and images */ Err codevoid.de 70 i } XWindow; Err codevoid.de 70 i Err codevoid.de 70 i typedef union { Err codevoid.de 70 i- int i; Err codevoid.de 70 i- unsigned int ui; Err codevoid.de 70 i- float f; Err codevoid.de 70 i- const void *v; Err codevoid.de 70 i+ int i; Err codevoid.de 70 i+ unsigned int ui; Err codevoid.de 70 i+ float f; Err codevoid.de 70 i+ const void *v; Err codevoid.de 70 i } Arg; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- unsigned int b; Err codevoid.de 70 i- void (*func)(const Arg *); Err codevoid.de 70 i- const Arg arg; Err codevoid.de 70 i+ unsigned int b; Err codevoid.de 70 i+ void (*func)(const Arg *); Err codevoid.de 70 i+ const Arg arg; Err codevoid.de 70 i } Mousekey; Err codevoid.de 70 i Err codevoid.de 70 i typedef struct { Err codevoid.de 70 i- KeySym keysym; Err codevoid.de 70 i- void (*func)(const Arg *); Err codevoid.de 70 i- const Arg arg; Err codevoid.de 70 i+ KeySym keysym; Err codevoid.de 70 i+ void (*func)(const Arg *); Err codevoid.de 70 i+ const Arg arg; Err codevoid.de 70 i } Shortcut; Err codevoid.de 70 i Err codevoid.de 70 i static void fffree(Image *img); Err codevoid.de 70 it@@ -127,580 +127,562 @@ static Fnt *fonts[NUMFONTSCALES]; Err codevoid.de 70 i static int running = 1; Err codevoid.de 70 i Err codevoid.de 70 i static void (*handler[LASTEvent])(XEvent *) = { Err codevoid.de 70 i- [ButtonPress] = bpress, Err codevoid.de 70 i- [ClientMessage] = cmessage, Err codevoid.de 70 i- [ConfigureNotify] = configure, Err codevoid.de 70 i- [Expose] = expose, Err codevoid.de 70 i- [KeyPress] = kpress, Err codevoid.de 70 i+ [ButtonPress] = bpress, Err codevoid.de 70 i+ [ClientMessage] = cmessage, Err codevoid.de 70 i+ [ConfigureNotify] = configure, Err codevoid.de 70 i+ [Expose] = expose, Err codevoid.de 70 i+ [KeyPress] = kpress, Err codevoid.de 70 i }; Err codevoid.de 70 i Err codevoid.de 70 i-int Err codevoid.de 70 i-filter(int fd, const char *cmd) Err codevoid.de 70 i+int filter(int fd, const char *cmd) Err codevoid.de 70 i { Err codevoid.de 70 i- int fds[2]; Err codevoid.de 70 i- Err codevoid.de 70 i- if (pipe(fds) < 0) Err codevoid.de 70 i- die("sent: Unable to create pipe:"); Err codevoid.de 70 i- Err codevoid.de 70 i- switch (fork()) { Err codevoid.de 70 i- case -1: Err codevoid.de 70 i- die("sent: Unable to fork:"); Err codevoid.de 70 i- case 0: Err codevoid.de 70 i- dup2(fd, 0); Err codevoid.de 70 i- dup2(fds[1], 1); Err codevoid.de 70 i- close(fds[0]); Err codevoid.de 70 i- close(fds[1]); Err codevoid.de 70 i- execlp("sh", "sh", "-c", cmd, (char *)0); Err codevoid.de 70 i- fprintf(stderr, "sent: execlp sh -c '%s': %s\n", cmd, strerror(errno)); Err codevoid.de 70 i- _exit(1); Err codevoid.de 70 i- } Err codevoid.de 70 i- close(fds[1]); Err codevoid.de 70 i- return fds[0]; Err codevoid.de 70 i+ int fds[2]; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (pipe(fds) < 0) Err codevoid.de 70 i+ die("sent: Unable to create pipe:"); Err codevoid.de 70 i+ Err codevoid.de 70 i+ switch (fork()) { Err codevoid.de 70 i+ case -1: Err codevoid.de 70 i+ die("sent: Unable to fork:"); Err codevoid.de 70 i+ case 0: Err codevoid.de 70 i+ dup2(fd, 0); Err codevoid.de 70 i+ dup2(fds[1], 1); Err codevoid.de 70 i+ close(fds[0]); Err codevoid.de 70 i+ close(fds[1]); Err codevoid.de 70 i+ execlp("sh", "sh", "-c", cmd, (char *)0); Err codevoid.de 70 i+ fprintf(stderr, "sent: execlp sh -c '%s': %s\n", cmd, strerror(errno)); Err codevoid.de 70 i+ _exit(1); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ close(fds[1]); Err codevoid.de 70 i+ return fds[0]; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-fffree(Image *img) Err codevoid.de 70 i+void fffree(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i- free(img->buf); Err codevoid.de 70 i- if (img->ximg) Err codevoid.de 70 i- XDestroyImage(img->ximg); Err codevoid.de 70 i- free(img); Err codevoid.de 70 i+ free(img->buf); Err codevoid.de 70 i+ if (img->ximg) Err codevoid.de 70 i+ XDestroyImage(img->ximg); Err codevoid.de 70 i+ free(img); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-ffload(Slide *s) Err codevoid.de 70 i+void ffload(Slide *s) Err codevoid.de 70 i { Err codevoid.de 70 i- uint32_t y, x; Err codevoid.de 70 i- uint16_t *row; Err codevoid.de 70 i- uint8_t opac, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b; Err codevoid.de 70 i- size_t rowlen, off, nbytes, i; Err codevoid.de 70 i- ssize_t count; Err codevoid.de 70 i- unsigned char hdr[16]; Err codevoid.de 70 i- char *bin = NULL; Err codevoid.de 70 i- char *filename; Err codevoid.de 70 i- regex_t regex; Err codevoid.de 70 i- int fdin, fdout; Err codevoid.de 70 i- Err codevoid.de 70 i- if (s->img || !(filename = s->embed) || !s->embed[0]) Err codevoid.de 70 i- return; /* already done */ Err codevoid.de 70 i- Err codevoid.de 70 i- for (i = 0; i < LEN(filters); i++) { Err codevoid.de 70 i- if (regcomp(®ex, filters[i].regex, Err codevoid.de 70 i- REG_NOSUB | REG_EXTENDED | REG_ICASE)) { Err codevoid.de 70 i- fprintf(stderr, "sent: Invalid regex '%s'\n", filters[i].regex); Err codevoid.de 70 i- continue; Err codevoid.de 70 i- } Err codevoid.de 70 i- if (!regexec(®ex, filename, 0, NULL, 0)) { Err codevoid.de 70 i- bin = filters[i].bin; Err codevoid.de 70 i- regfree(®ex); Err codevoid.de 70 i- break; Err codevoid.de 70 i- } Err codevoid.de 70 i- regfree(®ex); Err codevoid.de 70 i- } Err codevoid.de 70 i- if (!bin) Err codevoid.de 70 i- die("sent: Unable to find matching filter for '%s'", filename); Err codevoid.de 70 i- Err codevoid.de 70 i- if ((fdin = open(filename, O_RDONLY)) < 0) Err codevoid.de 70 i- die("sent: Unable to open '%s':", filename); Err codevoid.de 70 i- Err codevoid.de 70 i- if ((fdout = filter(fdin, bin)) < 0) Err codevoid.de 70 i- die("sent: Unable to filter '%s':", filename); Err codevoid.de 70 i- close(fdin); Err codevoid.de 70 i- Err codevoid.de 70 i- if (read(fdout, hdr, 16) != 16) Err codevoid.de 70 i- die("sent: Unable to read filtered file '%s':", filename); Err codevoid.de 70 i- if (memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i- die("sent: Filtered file '%s' has no valid farbfeld header", filename); Err codevoid.de 70 i- Err codevoid.de 70 i- s->img = ecalloc(1, sizeof(Image)); Err codevoid.de 70 i- s->img->bufwidth = ntohl(*(uint32_t *)&hdr[8]); Err codevoid.de 70 i- s->img->bufheight = ntohl(*(uint32_t *)&hdr[12]); Err codevoid.de 70 i- Err codevoid.de 70 i- if (s->img->buf) Err codevoid.de 70 i- free(s->img->buf); Err codevoid.de 70 i- /* internally the image is stored in 888 format */ Err codevoid.de 70 i- s->img->buf = ecalloc(s->img->bufwidth * s->img->bufheight, strlen("888")); Err codevoid.de 70 i- Err codevoid.de 70 i- /* scratch buffer to read row by row */ Err codevoid.de 70 i- rowlen = s->img->bufwidth * 2 * strlen("RGBA"); Err codevoid.de 70 i- row = ecalloc(1, rowlen); Err codevoid.de 70 i- Err codevoid.de 70 i- /* extract window background color channels for transparency */ Err codevoid.de 70 i- bg_r = (sc[ColBg].pixel >> 16) % 256; Err codevoid.de 70 i- bg_g = (sc[ColBg].pixel >> 8) % 256; Err codevoid.de 70 i- bg_b = (sc[ColBg].pixel >> 0) % 256; Err codevoid.de 70 i- Err codevoid.de 70 i- for (off = 0, y = 0; y < s->img->bufheight; y++) { Err codevoid.de 70 i- nbytes = 0; Err codevoid.de 70 i- while (nbytes < rowlen) { Err codevoid.de 70 i- count = read(fdout, (char *)row + nbytes, rowlen - nbytes); Err codevoid.de 70 i- if (count < 0) Err codevoid.de 70 i- die("sent: Unable to read from pipe:"); Err codevoid.de 70 i- nbytes += count; Err codevoid.de 70 i- } Err codevoid.de 70 i- for (x = 0; x < rowlen / 2; x += 4) { Err codevoid.de 70 i- fg_r = ntohs(row[x + 0]) / 257; Err codevoid.de 70 i- fg_g = ntohs(row[x + 1]) / 257; Err codevoid.de 70 i- fg_b = ntohs(row[x + 2]) / 257; Err codevoid.de 70 i- opac = ntohs(row[x + 3]) / 257; Err codevoid.de 70 i- /* blend opaque part of image data with window background color to Err codevoid.de 70 i- * emulate transparency */ Err codevoid.de 70 i- s->img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255; Err codevoid.de 70 i- s->img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 255; Err codevoid.de 70 i- s->img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 255; Err codevoid.de 70 i- } Err codevoid.de 70 i- } Err codevoid.de 70 i- Err codevoid.de 70 i- free(row); Err codevoid.de 70 i- close(fdout); Err codevoid.de 70 i+ uint32_t y, x; Err codevoid.de 70 i+ uint16_t *row; Err codevoid.de 70 i+ uint8_t opac, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b; Err codevoid.de 70 i+ size_t rowlen, off, nbytes, i; Err codevoid.de 70 i+ ssize_t count; Err codevoid.de 70 i+ unsigned char hdr[16]; Err codevoid.de 70 i+ char *bin = NULL; Err codevoid.de 70 i+ char *filename; Err codevoid.de 70 i+ regex_t regex; Err codevoid.de 70 i+ int fdin, fdout; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (s->img || !(filename = s->embed) || !s->embed[0]) Err codevoid.de 70 i+ return; /* already done */ Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (i = 0; i < LEN(filters); i++) { Err codevoid.de 70 i+ if (regcomp(®ex, filters[i].regex, Err codevoid.de 70 i+ REG_NOSUB | REG_EXTENDED | REG_ICASE)) { Err codevoid.de 70 i+ fprintf(stderr, "sent: Invalid regex '%s'\n", filters[i].regex); Err codevoid.de 70 i+ continue; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (!regexec(®ex, filename, 0, NULL, 0)) { Err codevoid.de 70 i+ bin = filters[i].bin; Err codevoid.de 70 i+ regfree(®ex); Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ regfree(®ex); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (!bin) Err codevoid.de 70 i+ die("sent: Unable to find matching filter for '%s'", filename); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if ((fdin = open(filename, O_RDONLY)) < 0) Err codevoid.de 70 i+ die("sent: Unable to open '%s':", filename); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if ((fdout = filter(fdin, bin)) < 0) Err codevoid.de 70 i+ die("sent: Unable to filter '%s':", filename); Err codevoid.de 70 i+ close(fdin); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (read(fdout, hdr, 16) != 16) Err codevoid.de 70 i+ die("sent: Unable to read filtered file '%s':", filename); Err codevoid.de 70 i+ if (memcmp("farbfeld", hdr, 8)) Err codevoid.de 70 i+ die("sent: Filtered file '%s' has no valid farbfeld header", filename); Err codevoid.de 70 i+ Err codevoid.de 70 i+ s->img = ecalloc(1, sizeof(Image)); Err codevoid.de 70 i+ s->img->bufwidth = ntohl(*(uint32_t *)&hdr[8]); Err codevoid.de 70 i+ s->img->bufheight = ntohl(*(uint32_t *)&hdr[12]); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (s->img->buf) Err codevoid.de 70 i+ free(s->img->buf); Err codevoid.de 70 i+ /* internally the image is stored in 888 format */ Err codevoid.de 70 i+ s->img->buf = ecalloc(s->img->bufwidth * s->img->bufheight, strlen("888")); Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* scratch buffer to read row by row */ Err codevoid.de 70 i+ rowlen = s->img->bufwidth * 2 * strlen("RGBA"); Err codevoid.de 70 i+ row = ecalloc(1, rowlen); Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* extract window background color channels for transparency */ Err codevoid.de 70 i+ bg_r = (sc[ColBg].pixel >> 16) % 256; Err codevoid.de 70 i+ bg_g = (sc[ColBg].pixel >> 8) % 256; Err codevoid.de 70 i+ bg_b = (sc[ColBg].pixel >> 0) % 256; Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (off = 0, y = 0; y < s->img->bufheight; y++) { Err codevoid.de 70 i+ nbytes = 0; Err codevoid.de 70 i+ while (nbytes < rowlen) { Err codevoid.de 70 i+ count = read(fdout, (char *)row + nbytes, rowlen - nbytes); Err codevoid.de 70 i+ if (count < 0) Err codevoid.de 70 i+ die("sent: Unable to read from pipe:"); Err codevoid.de 70 i+ nbytes += count; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ for (x = 0; x < rowlen / 2; x += 4) { Err codevoid.de 70 i+ fg_r = ntohs(row[x + 0]) / 257; Err codevoid.de 70 i+ fg_g = ntohs(row[x + 1]) / 257; Err codevoid.de 70 i+ fg_b = ntohs(row[x + 2]) / 257; Err codevoid.de 70 i+ opac = ntohs(row[x + 3]) / 257; Err codevoid.de 70 i+ /* blend opaque part of image data with window background color to Err codevoid.de 70 i+ * emulate transparency */ Err codevoid.de 70 i+ s->img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 255; Err codevoid.de 70 i+ s->img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 255; Err codevoid.de 70 i+ s->img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 255; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ free(row); Err codevoid.de 70 i+ close(fdout); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-ffprepare(Image *img) Err codevoid.de 70 i+void ffprepare(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i- int depth = DefaultDepth(xw.dpy, xw.scr); Err codevoid.de 70 i- int width = xw.uw; Err codevoid.de 70 i- int height = xw.uh; Err codevoid.de 70 i+ int depth = DefaultDepth(xw.dpy, xw.scr); Err codevoid.de 70 i+ int width = xw.uw; Err codevoid.de 70 i+ int height = xw.uh; Err codevoid.de 70 i Err codevoid.de 70 i- if (xw.uw * img->bufheight > xw.uh * img->bufwidth) Err codevoid.de 70 i- width = img->bufwidth * xw.uh / img->bufheight; Err codevoid.de 70 i- else Err codevoid.de 70 i- height = img->bufheight * xw.uw / img->bufwidth; Err codevoid.de 70 i+ if (xw.uw * img->bufheight > xw.uh * img->bufwidth) Err codevoid.de 70 i+ width = img->bufwidth * xw.uh / img->bufheight; Err codevoid.de 70 i+ else Err codevoid.de 70 i+ height = img->bufheight * xw.uw / img->bufwidth; Err codevoid.de 70 i Err codevoid.de 70 i- if (depth < 24) Err codevoid.de 70 i- die("sent: Display color depths < 24 not supported"); Err codevoid.de 70 i+ if (depth < 24) Err codevoid.de 70 i+ die("sent: Display color depths < 24 not supported"); Err codevoid.de 70 i Err codevoid.de 70 i- if (!(img->ximg = XCreateImage(xw.dpy, CopyFromParent, depth, ZPixmap, 0, Err codevoid.de 70 i- NULL, width, height, 32, 0))) Err codevoid.de 70 i- die("sent: Unable to create XImage"); Err codevoid.de 70 i+ if (!(img->ximg = XCreateImage(xw.dpy, CopyFromParent, depth, ZPixmap, 0, Err codevoid.de 70 i+ NULL, width, height, 32, 0))) Err codevoid.de 70 i+ die("sent: Unable to create XImage"); Err codevoid.de 70 i Err codevoid.de 70 i- img->ximg->data = ecalloc(height, img->ximg->bytes_per_line); Err codevoid.de 70 i- if (!XInitImage(img->ximg)) Err codevoid.de 70 i- die("sent: Unable to initiate XImage"); Err codevoid.de 70 i+ img->ximg->data = ecalloc(height, img->ximg->bytes_per_line); Err codevoid.de 70 i+ if (!XInitImage(img->ximg)) Err codevoid.de 70 i+ die("sent: Unable to initiate XImage"); Err codevoid.de 70 i Err codevoid.de 70 i- ffscale(img); Err codevoid.de 70 i- img->state |= SCALED; Err codevoid.de 70 i+ ffscale(img); Err codevoid.de 70 i+ img->state |= SCALED; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-ffscale(Image *img) Err codevoid.de 70 i+void ffscale(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i- unsigned int x, y; Err codevoid.de 70 i- unsigned int width = img->ximg->width; Err codevoid.de 70 i- unsigned int height = img->ximg->height; Err codevoid.de 70 i- char* newBuf = img->ximg->data; Err codevoid.de 70 i- unsigned char* ibuf; Err codevoid.de 70 i- unsigned int jdy = img->ximg->bytes_per_line / 4 - width; Err codevoid.de 70 i- unsigned int dx = (img->bufwidth << 10) / width; Err codevoid.de 70 i- Err codevoid.de 70 i- for (y = 0; y < height; y++) { Err codevoid.de 70 i- unsigned int bufx = img->bufwidth / width; Err codevoid.de 70 i- ibuf = &img->buf[y * img->bufheight / height * img->bufwidth * 3]; Err codevoid.de 70 i- Err codevoid.de 70 i- for (x = 0; x < width; x++) { Err codevoid.de 70 i- *newBuf++ = (ibuf[(bufx >> 10)*3+2]); Err codevoid.de 70 i- *newBuf++ = (ibuf[(bufx >> 10)*3+1]); Err codevoid.de 70 i- *newBuf++ = (ibuf[(bufx >> 10)*3+0]); Err codevoid.de 70 i- newBuf++; Err codevoid.de 70 i- bufx += dx; Err codevoid.de 70 i- } Err codevoid.de 70 i- newBuf += jdy; Err codevoid.de 70 i- } Err codevoid.de 70 i+ unsigned int x, y; Err codevoid.de 70 i+ unsigned int width = img->ximg->width; Err codevoid.de 70 i+ unsigned int height = img->ximg->height; Err codevoid.de 70 i+ char* newBuf = img->ximg->data; Err codevoid.de 70 i+ unsigned char* ibuf; Err codevoid.de 70 i+ unsigned int jdy = img->ximg->bytes_per_line / 4 - width; Err codevoid.de 70 i+ unsigned int dx = (img->bufwidth << 10) / width; Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (y = 0; y < height; y++) { Err codevoid.de 70 i+ unsigned int bufx = img->bufwidth / width; Err codevoid.de 70 i+ ibuf = &img->buf[y * img->bufheight / height * img->bufwidth * 3]; Err codevoid.de 70 i+ Err codevoid.de 70 i+ for (x = 0; x < width; x++) { Err codevoid.de 70 i+ *newBuf++ = (ibuf[(bufx >> 10)*3+2]); Err codevoid.de 70 i+ *newBuf++ = (ibuf[(bufx >> 10)*3+1]); Err codevoid.de 70 i+ *newBuf++ = (ibuf[(bufx >> 10)*3+0]); Err codevoid.de 70 i+ newBuf++; Err codevoid.de 70 i+ bufx += dx; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ newBuf += jdy; Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-ffdraw(Image *img) Err codevoid.de 70 i+void ffdraw(Image *img) Err codevoid.de 70 i { Err codevoid.de 70 i- int xoffset = (xw.w - img->ximg->width) / 2; Err codevoid.de 70 i- int yoffset = (xw.h - img->ximg->height) / 2; Err codevoid.de 70 i- XPutImage(xw.dpy, xw.win, d->gc, img->ximg, 0, 0, Err codevoid.de 70 i- xoffset, yoffset, img->ximg->width, img->ximg->height); Err codevoid.de 70 i- XFlush(xw.dpy); Err codevoid.de 70 i+ int xoffset = (xw.w - img->ximg->width) / 2; Err codevoid.de 70 i+ int yoffset = (xw.h - img->ximg->height) / 2; Err codevoid.de 70 i+ XPutImage(xw.dpy, xw.win, d->gc, img->ximg, 0, 0, Err codevoid.de 70 i+ xoffset, yoffset, img->ximg->width, img->ximg->height); Err codevoid.de 70 i+ XFlush(xw.dpy); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-getfontsize(Slide *s, 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- int i, j; Err codevoid.de 70 i- unsigned int curw, newmax; Err codevoid.de 70 i- float lfac = linespacing * (s->linecount - 1) + 1; Err codevoid.de 70 i- 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- LIMIT(j, 0, NUMFONTSCALES - 1); 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- newmax = (curw >= *width); 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 (newmax) Err codevoid.de 70 i- *width = curw; Err codevoid.de 70 i- } Err codevoid.de 70 i- *height = fonts[j]->h * lfac; Err codevoid.de 70 i+ int i, j; Err codevoid.de 70 i+ unsigned int curw, newmax; Err codevoid.de 70 i+ float lfac = linespacing * (s->linecount - 1) + 1; Err codevoid.de 70 i+ 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+ LIMIT(j, 0, NUMFONTSCALES - 1); 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+ newmax = (curw >= *width); 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 (newmax) Err codevoid.de 70 i+ *width = curw; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ *height = fonts[j]->h * lfac; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-cleanup(int slidesonly) Err codevoid.de 70 i+void cleanup(int slidesonly) Err codevoid.de 70 i { Err codevoid.de 70 i- unsigned int i, j; Err codevoid.de 70 i- Err codevoid.de 70 i- if (!slidesonly) { 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 i- free(sc); Err codevoid.de 70 i- drw_free(d); Err codevoid.de 70 i- Err codevoid.de 70 i- XDestroyWindow(xw.dpy, xw.win); Err codevoid.de 70 i- XSync(xw.dpy, False); Err codevoid.de 70 i- XCloseDisplay(xw.dpy); Err codevoid.de 70 i- } Err codevoid.de 70 i- Err codevoid.de 70 i- if (slides) { Err codevoid.de 70 i- for (i = 0; i < slidecount; i++) { 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- fffree(slides[i].img); Err codevoid.de 70 i- } Err codevoid.de 70 i- if (!slidesonly) { Err codevoid.de 70 i- free(slides); Err codevoid.de 70 i- slides = NULL; Err codevoid.de 70 i- } Err codevoid.de 70 i- } Err codevoid.de 70 i+ unsigned int i, j; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!slidesonly) { 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 i+ free(sc); Err codevoid.de 70 i+ drw_free(d); Err codevoid.de 70 i+ Err codevoid.de 70 i+ XDestroyWindow(xw.dpy, xw.win); Err codevoid.de 70 i+ XSync(xw.dpy, False); Err codevoid.de 70 i+ XCloseDisplay(xw.dpy); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (slides) { Err codevoid.de 70 i+ for (i = 0; i < slidecount; i++) { 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+ fffree(slides[i].img); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ if (!slidesonly) { Err codevoid.de 70 i+ free(slides); Err codevoid.de 70 i+ slides = NULL; 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-void Err codevoid.de 70 i-reload(const Arg *arg) Err codevoid.de 70 i+void reload(const Arg *arg) Err codevoid.de 70 i { Err codevoid.de 70 i- FILE *fp = NULL; Err codevoid.de 70 i- unsigned int i; Err codevoid.de 70 i- Err codevoid.de 70 i- if (!fname) { Err codevoid.de 70 i- fprintf(stderr, "sent: Cannot reload from stdin. Use a file!\n"); Err codevoid.de 70 i- return; Err codevoid.de 70 i- } Err codevoid.de 70 i- Err codevoid.de 70 i- cleanup(1); Err codevoid.de 70 i- slidecount = 0; Err codevoid.de 70 i- Err codevoid.de 70 i- if (!(fp = fopen(fname, "r"))) Err codevoid.de 70 i- die("sent: Unable to open '%s' for reading:", fname); Err codevoid.de 70 i- load(fp); Err codevoid.de 70 i- fclose(fp); Err codevoid.de 70 i- Err codevoid.de 70 i- LIMIT(idx, 0, slidecount-1); Err codevoid.de 70 i- for (i = 0; i < slidecount; i++) Err codevoid.de 70 i- ffload(&slides[i]); Err codevoid.de 70 i- xdraw(); Err codevoid.de 70 i+ FILE *fp = NULL; Err codevoid.de 70 i+ unsigned int i; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!fname) { Err codevoid.de 70 i+ fprintf(stderr, "sent: Cannot reload from stdin. Use a file!\n"); Err codevoid.de 70 i+ return; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ cleanup(1); Err codevoid.de 70 i+ slidecount = 0; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!(fp = fopen(fname, "r"))) Err codevoid.de 70 i+ die("sent: Unable to open '%s' for reading:", fname); Err codevoid.de 70 i+ load(fp); Err codevoid.de 70 i+ fclose(fp); Err codevoid.de 70 i+ Err codevoid.de 70 i+ LIMIT(idx, 0, slidecount-1); Err codevoid.de 70 i+ for (i = 0; i < slidecount; i++) Err codevoid.de 70 i+ ffload(&slides[i]); Err codevoid.de 70 i+ xdraw(); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-load(FILE *fp) 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- 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 (1) { 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- if ((slidecount+1) * sizeof(*slides) >= size) Err codevoid.de 70 i- if (!(slides = realloc(slides, (size += BUFSIZ)))) Err codevoid.de 70 i- die("sent: Unable to reallocate %u bytes:", size); 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("sent: Unable to reallocate %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("sent: Unable to 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- /* mark as 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- s->embed = &s->lines[0][1]; 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- 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- Err codevoid.de 70 i- if (!slidecount) Err codevoid.de 70 i- die("sent: No slides in file"); 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+ 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 (1) { 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+ if ((slidecount+1) * sizeof(*slides) >= size) Err codevoid.de 70 i+ if (!(slides = realloc(slides, (size += BUFSIZ)))) Err codevoid.de 70 i+ die("sent: Unable to reallocate %u bytes:", size); 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("sent: Unable to reallocate %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("sent: Unable to 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+ /* mark as 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+ s->embed = &s->lines[0][1]; 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+ 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+ Err codevoid.de 70 i+ if (!slidecount) Err codevoid.de 70 i+ die("sent: No slides in file"); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-advance(const Arg *arg) Err codevoid.de 70 i+void advance(const Arg *arg) Err codevoid.de 70 i { Err codevoid.de 70 i- int new_idx = idx + arg->i; Err codevoid.de 70 i- LIMIT(new_idx, 0, slidecount-1); Err codevoid.de 70 i- if (new_idx != idx) { Err codevoid.de 70 i- if (slides[idx].img) Err codevoid.de 70 i- slides[idx].img->state &= ~SCALED; Err codevoid.de 70 i- idx = new_idx; Err codevoid.de 70 i- xdraw(); Err codevoid.de 70 i- } Err codevoid.de 70 i+ int new_idx = idx + arg->i; Err codevoid.de 70 i+ LIMIT(new_idx, 0, slidecount-1); Err codevoid.de 70 i+ if (new_idx != idx) { Err codevoid.de 70 i+ if (slides[idx].img) Err codevoid.de 70 i+ slides[idx].img->state &= ~SCALED; Err codevoid.de 70 i+ idx = new_idx; Err codevoid.de 70 i+ xdraw(); Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-quit(const Arg *arg) Err codevoid.de 70 i+void quit(const Arg *arg) Err codevoid.de 70 i { Err codevoid.de 70 i- running = 0; Err codevoid.de 70 i+ running = 0; Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-resize(int width, int height) Err codevoid.de 70 i+void resize(int width, int height) Err codevoid.de 70 i { Err codevoid.de 70 i- xw.w = width; Err codevoid.de 70 i- xw.h = height; Err codevoid.de 70 i- xw.uw = usablewidth * width; Err codevoid.de 70 i- xw.uh = usableheight * height; Err codevoid.de 70 i- drw_resize(d, width, height); Err codevoid.de 70 i+ xw.w = width; Err codevoid.de 70 i+ xw.h = height; Err codevoid.de 70 i+ xw.uw = usablewidth * width; Err codevoid.de 70 i+ xw.uh = usableheight * height; Err codevoid.de 70 i+ drw_resize(d, width, height); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-run() Err codevoid.de 70 i+void run() Err codevoid.de 70 i { Err codevoid.de 70 i- XEvent ev; Err codevoid.de 70 i- Err codevoid.de 70 i- /* Waiting for window mapping */ Err codevoid.de 70 i- while (1) { Err codevoid.de 70 i- XNextEvent(xw.dpy, &ev); Err codevoid.de 70 i- if (ev.type == ConfigureNotify) { Err codevoid.de 70 i- resize(ev.xconfigure.width, ev.xconfigure.height); Err codevoid.de 70 i- } else if (ev.type == MapNotify) { Err codevoid.de 70 i- break; Err codevoid.de 70 i- } Err codevoid.de 70 i- } Err codevoid.de 70 i- Err codevoid.de 70 i- while (running) { Err codevoid.de 70 i- XNextEvent(xw.dpy, &ev); Err codevoid.de 70 i- if (handler[ev.type]) Err codevoid.de 70 i- (handler[ev.type])(&ev); Err codevoid.de 70 i- } Err codevoid.de 70 i+ XEvent ev; Err codevoid.de 70 i+ Err codevoid.de 70 i+ /* Waiting for window mapping */ Err codevoid.de 70 i+ while (1) { Err codevoid.de 70 i+ XNextEvent(xw.dpy, &ev); Err codevoid.de 70 i+ if (ev.type == ConfigureNotify) { Err codevoid.de 70 i+ resize(ev.xconfigure.width, ev.xconfigure.height); Err codevoid.de 70 i+ } else if (ev.type == MapNotify) { Err codevoid.de 70 i+ break; Err codevoid.de 70 i+ } Err codevoid.de 70 i+ } Err codevoid.de 70 i+ Err codevoid.de 70 i+ while (running) { Err codevoid.de 70 i+ XNextEvent(xw.dpy, &ev); Err codevoid.de 70 i+ if (handler[ev.type]) Err codevoid.de 70 i+ (handler[ev.type])(&ev); Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-xdraw() Err codevoid.de 70 i+void xdraw() Err codevoid.de 70 i { 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], &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- 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- 0, 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 { Err codevoid.de 70 i- if (!(im->state & SCALED)) Err codevoid.de 70 i- ffprepare(im); Err codevoid.de 70 i- ffdraw(im); Err codevoid.de 70 i- } 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], &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+ 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+ 0, Err codevoid.de 70 i+ slides[idx].lines[i], Err codevoid.de 70 i+ 0); Err codevoid.de 70 i+ if (idx != 0 && progressheight != 0) { Err codevoid.de 70 i+ drw_rect(d, Err codevoid.de 70 i+ 0, xw.h - progressheight, Err codevoid.de 70 i+ (xw.w * idx)/(slidecount - 1), progressheight, Err codevoid.de 70 i+ 1, 0); Err codevoid.de 70 i+ } Err codevoid.de 70 i+ drw_map(d, xw.win, 0, 0, xw.w, xw.h); Err codevoid.de 70 i+ } else { Err codevoid.de 70 i+ if (!(im->state & SCALED)) Err codevoid.de 70 i+ ffprepare(im); Err codevoid.de 70 i+ ffdraw(im); Err codevoid.de 70 i+ } Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-xhints() Err codevoid.de 70 i+void xhints() Err codevoid.de 70 i { Err codevoid.de 70 i- XClassHint class = {.res_name = "sent", .res_class = "presenter"}; Err codevoid.de 70 i- XWMHints wm = {.flags = InputHint, .input = True}; Err codevoid.de 70 i- XSizeHints *sizeh = NULL; Err codevoid.de 70 i+ XClassHint class = {.res_name = "sent", .res_class = "presenter"}; Err codevoid.de 70 i+ XWMHints wm = {.flags = InputHint, .input = True}; Err codevoid.de 70 i+ XSizeHints *sizeh = NULL; Err codevoid.de 70 i Err codevoid.de 70 i- if (!(sizeh = XAllocSizeHints())) Err codevoid.de 70 i- die("sent: Unable to allocate size hints"); Err codevoid.de 70 i+ if (!(sizeh = XAllocSizeHints())) Err codevoid.de 70 i+ die("sent: Unable to allocate size hints"); Err codevoid.de 70 i Err codevoid.de 70 i- sizeh->flags = PSize; Err codevoid.de 70 i- sizeh->height = xw.h; Err codevoid.de 70 i- sizeh->width = xw.w; Err codevoid.de 70 i+ sizeh->flags = PSize; Err codevoid.de 70 i+ sizeh->height = xw.h; Err codevoid.de 70 i+ sizeh->width = xw.w; Err codevoid.de 70 i Err codevoid.de 70 i- XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, &class); Err codevoid.de 70 i- XFree(sizeh); Err codevoid.de 70 i+ XSetWMProperties(xw.dpy, xw.win, NULL, NULL, NULL, 0, sizeh, &wm, &class); Err codevoid.de 70 i+ XFree(sizeh); Err codevoid.de 70 i } Err codevoid.de 70 i Err codevoid.de 70 i-void Err codevoid.de 70 i-xinit() Err codevoid.de 70 i+void xinit() Err codevoid.de 70 i { Err codevoid.de 70 i- XTextProperty prop; Err codevoid.de 70 i- unsigned int i; Err codevoid.de 70 i- Err codevoid.de 70 i- if (!(xw.dpy = XOpenDisplay(NULL))) Err codevoid.de 70 i- die("sent: Unable to open display"); Err codevoid.de 70 i- xw.scr = XDefaultScreen(xw.dpy); Err codevoid.de 70 i- xw.vis = XDefaultVisual(xw.dpy, xw.scr); Err codevoid.de 70 i- resize(DisplayWidth(xw.dpy, xw.scr), DisplayHeight(xw.dpy, xw.scr)); Err codevoid.de 70 i- Err codevoid.de 70 i- xw.attrs.bit_gravity = CenterGravity; Err codevoid.de 70 i- xw.attrs.event_mask = KeyPressMask | ExposureMask | StructureNotifyMask | Err codevoid.de 70 i- ButtonMotionMask | ButtonPressMask; Err codevoid.de 70 i- Err codevoid.de 70 i- xw.win = XCreateWindow(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, 0, Err codevoid.de 70 i- xw.w, xw.h, 0, XDefaultDepth(xw.dpy, xw.scr), Err codevoid.de 70 i- InputOutput, xw.vis, CWBitGravity | CWEventMask, Err codevoid.de 70 i- &xw.attrs); Err codevoid.de 70 i- Err codevoid.de 70 i- xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); Err codevoid.de 70 i- xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False); Err codevoid.de 70 i- XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); Err codevoid.de 70 i- Err codevoid.de 70 i- if (!(d = drw_create(xw.dpy, xw.scr, xw.win, xw.w, xw.h))) Err codevoid.de 70 i- die("sent: Unable to create drawing context"); Err codevoid.de 70 i- sc = drw_scm_create(d, colors, 2); Err codevoid.de 70 i- drw_setscheme(d, sc); Err codevoid.de 70 i- XSetWindowBackground(xw.dpy, xw.win, sc[ColBg].pixel); Err codevoid.de 70 i- Err codevoid.de 70 i- xloadfonts(); Err codevoid.de 70 i- for (i = 0; i < slidecount; i++) Err codevoid.de 70 i- ffload(&slides[i]); Err codevoid.de 70 i- Err codevoid.de 70 i- XStringListToTextProperty(&argv0, 1, &prop); Err codevoid.de 70 i- XSetWMName(xw.dpy, xw.win, &prop); Err codevoid.de 70 i- XSetTextProperty(xw.dpy, xw.win, &prop, xw.netwmname); Err codevoid.de 70 i- XFree(prop.value); Err codevoid.de 70 i- XMapWindow(xw.dpy, xw.win); Err codevoid.de 70 i- xhints(); Err codevoid.de 70 i- XSync(xw.dpy, False); Err codevoid.de 70 i+ XTextProperty prop; Err codevoid.de 70 i+ unsigned int i; Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!(xw.dpy = XOpenDisplay(NULL))) Err codevoid.de 70 i+ die("sent: Unable to open display"); Err codevoid.de 70 i+ xw.scr = XDefaultScreen(xw.dpy); Err codevoid.de 70 i+ xw.vis = XDefaultVisual(xw.dpy, xw.scr); Err codevoid.de 70 i+ resize(DisplayWidth(xw.dpy, xw.scr), DisplayHeight(xw.dpy, xw.scr)); Err codevoid.de 70 i+ Err codevoid.de 70 i+ xw.attrs.bit_gravity = CenterGravity; Err codevoid.de 70 i+ xw.attrs.event_mask = KeyPressMask | ExposureMask | StructureNotifyMask | Err codevoid.de 70 i+ ButtonMotionMask | ButtonPressMask; Err codevoid.de 70 i+ Err codevoid.de 70 i+ xw.win = XCreateWindow(xw.dpy, XRootWindow(xw.dpy, xw.scr), 0, 0, Err codevoid.de 70 i+ xw.w, xw.h, 0, XDefaultDepth(xw.dpy, xw.scr), Err codevoid.de 70 i+ InputOutput, xw.vis, CWBitGravity | CWEventMask, Err codevoid.de 70 i+ &xw.attrs); Err codevoid.de 70 i+ Err codevoid.de 70 i+ xw.wmdeletewin = XInternAtom(xw.dpy, "WM_DELETE_WINDOW", False); Err codevoid.de 70 i+ xw.netwmname = XInternAtom(xw.dpy, "_NET_WM_NAME", False); Err codevoid.de 70 i+ Err codevoid.de 70 i+ XSetWMProtocols(xw.dpy, xw.win, &xw.wmdeletewin, 1); Err codevoid.de 70 i+ Err codevoid.de 70 i+ if (!(d = drw_create(xw.dpy, xw.scr, xw.win, xw.w, xw.h))) Err codevoid.de 70 i+ die("sent: Unable to create drawing context"); Err codevoid.de 70 i+ sc = drw_scm_create(d, colors, 2); Err codevoid.de 70 i+ drw_setscheme(d, Err codevoid.de 70 .