allow to reload file
authorMarkus Teich <markus.teich@stusta.mhn.de>
Sat, 2 Sep 2017 17:30:11 +0000 (19:30 +0200)
committerMarkus Teich <markus.teich@stusta.mhn.de>
Sat, 2 Sep 2017 17:30:11 +0000 (19:30 +0200)
config.def.h
sent.1
sent.c

index f66d121a0fc96bd65b0116949beb54f3aad671e5..60eb376def416f1386c83e0b956cca86ffaeb9e1 100644 (file)
@@ -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[] = {
diff --git a/sent.1 b/sent.1
index 7f6927d8dd57ff9efc4bdc5be2f8ddec3f0a80d2..fabc614165626c69b6c08a7bfb80cb3560d6f0ad 100644 (file)
--- a/sent.1
+++ b/sent.1
@@ -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
diff --git a/sent.c b/sent.c
index 6cf53ff6ae1924ecf2684ee74c00cd27cfe3a59d..0da2bfffdbe018ac1ad5a6c4cabfe32915ac93e1 100644 (file)
--- a/sent.c
+++ b/sent.c
@@ -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);
@@ -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;
@@ -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++)
@@ -366,11 +371,38 @@ 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)
 {
@@ -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);
 
@@ -670,6 +701,6 @@ main(int argc, char *argv[])
        xinit();
        run();
 
-       cleanup();
+       cleanup(0);
        return 0;
 }