t* My version of sent
       
   URI git clone git://git.codevoid.de/sent-sdk.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 16e4843d0563c1b3aea1574adde8f91ed5de5db3
   DIR parent ec431df440fbe6d60ba49a108c2dc10e045a5033
   URI Author: Markus Teich <markus.teich@stusta.mhn.de>
       Date:   Sat,  2 Sep 2017 19:30:11 +0200
       
       allow to reload file
       
       Diffstat:
         M config.def.h                        |       1 +
         M sent.1                              |       2 ++
         M sent.c                              |      61 +++++++++++++++++++++++--------
       
       3 files changed, 49 insertions(+), 15 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       t@@ -46,6 +46,7 @@ static Shortcut shortcuts[] = {
                { XK_Prior,       advance,        {.i = -1} },
                { XK_n,           advance,        {.i = +1} },
                { XK_p,           advance,        {.i = -1} },
       +        { XK_r,           reload,         {0} },
        };
        
        static Filter filters[] = {
   DIR diff --git a/sent.1 b/sent.1
       t@@ -35,6 +35,8 @@ Go to previous slide, if existent.
        .Bl -tag -width Ds
        .It Sy Escape | q
        Quit.
       +.It Sy r
       +Reload the slides. Only works on file input.
        .It Sy Right | Return | Space | l | j | Down | Next | n
        Go to next slide, if existent.
        .It Sy Left | Backspace | h | k | Up | Prior | p
   DIR diff --git a/sent.c b/sent.c
       t@@ -93,7 +93,8 @@ static void ffscale(Image *img);
        static void ffdraw(Image *img);
        
        static void getfontsize(Slide *s, unsigned int *width, unsigned int *height);
       -static void cleanup();
       +static void cleanup(int slidesonly);
       +static void reload(const Arg *arg);
        static void load(FILE *fp);
        static void advance(const Arg *arg);
        static void quit(const Arg *arg);
       t@@ -115,6 +116,7 @@ static void configure(XEvent *);
        #include "config.h"
        
        /* Globals */
       +static const char *fname = NULL;
        static Slide *slides = NULL;
        static int idx = 0;
        static int slidecount = 0;
       t@@ -346,18 +348,21 @@ getfontsize(Slide *s, unsigned int *width, unsigned int *height)
        }
        
        void
       -cleanup()
       +cleanup(int slidesonly)
        {
                unsigned int i, j;
        
       -        for (i = 0; i < NUMFONTSCALES; i++)
       -                drw_fontset_free(fonts[i]);
       -        free(sc);
       -        drw_free(d);
       +        if (!slidesonly) {
       +                for (i = 0; i < NUMFONTSCALES; i++)
       +                        drw_fontset_free(fonts[i]);
       +                free(sc);
       +                drw_free(d);
       +
       +                XDestroyWindow(xw.dpy, xw.win);
       +                XSync(xw.dpy, False);
       +                XCloseDisplay(xw.dpy);
       +        }
        
       -        XDestroyWindow(xw.dpy, xw.win);
       -        XSync(xw.dpy, False);
       -        XCloseDisplay(xw.dpy);
                if (slides) {
                        for (i = 0; i < slidecount; i++) {
                                for (j = 0; j < slides[i].linecount; j++)
       t@@ -366,12 +371,39 @@ cleanup()
                                if (slides[i].img)
                                        fffree(slides[i].img);
                        }
       -                free(slides);
       -                slides = NULL;
       +                if (!slidesonly) {
       +                        free(slides);
       +                        slides = NULL;
       +                }
                }
        }
        
        void
       +reload(const Arg *arg)
       +{
       +        FILE *fp = NULL;
       +        unsigned int i;
       +
       +        if (!fname) {
       +                fprintf(stderr, "sent: Cannot reload from stdin. Use a file!\n");
       +                return;
       +        }
       +
       +        cleanup(1);
       +        slidecount = 0;
       +
       +        if (!(fp = fopen(fname, "r")))
       +                die("sent: Unable to open '%s' for reading:", fname);
       +        load(fp);
       +        fclose(fp);
       +
       +        LIMIT(idx, 0, slidecount-1);
       +        for (i = 0; i < slidecount; i++)
       +                ffload(&slides[i]);
       +        xdraw();
       +}
       +
       +void
        load(FILE *fp)
        {
                static size_t size = 0;
       t@@ -658,9 +690,8 @@ main(int argc, char *argv[])
        
                if (!argv[0] || !strcmp(argv[0], "-"))
                        fp = stdin;
       -        else if (!(fp = fopen(argv[0], "r")))
       -                die("sent: Unable to open '%s' for reading:", argv[0]);
       -
       +        else if (!(fp = fopen(fname = argv[0], "r")))
       +                die("sent: Unable to open '%s' for reading:", fname);
                load(fp);
                fclose(fp);
        
       t@@ -670,6 +701,6 @@ main(int argc, char *argv[])
                xinit();
                run();
        
       -        cleanup();
       +        cleanup(0);
                return 0;
        }