Krolyxon
Commit 5105127

Branches

Refs →

nsxiv5105127

Added slideshow support

Author
Bert
Date
2011-09-10 18:41 +0200
Parent
79d780a
Commit
510512714df01110cf42cb2a11d944f55297c5cc

+136 −35

10 files changed

  1. M commands.c +48 −4
  2. M commands.h +2 −0
  3. M config.def.h +8 −0
  4. M image.c +3 −2
  5. M image.h +3 −0
  6. M main.c +47 −17
  7. M options.c +7 −8
  8. M options.h +6 −2
  9. M util.c +11 −2
  10. M util.h +1 −0
M commands.c View
@@ -35,6 +35,7 @@ void load_image(int);
3535 void redraw();
3636 void reset_cursor();
3737 void animate();
38+void slideshow();
3839 void set_timeout(timeout_f, int, int);
3940 void reset_timeout(timeout_f);
4041
@@ -57,6 +58,10 @@ int it_switch_mode(arg_t a) {
5758 tns_init(&tns, filecnt);
5859 img_close(&img, 0);
5960 reset_timeout(reset_cursor);
61+ if (img.slideshow) {
62+ img.slideshow = 0;
63+ reset_timeout(slideshow);
64+ }
6065 tns.sel = fileidx;
6166 tns.dirty = 1;
6267 mode = MODE_THUMB;
@@ -168,12 +173,11 @@ int i_toggle_animation(arg_t a) {
168173 if (img.multi.animate) {
169174 reset_timeout(animate);
170175 img.multi.animate = 0;
171− return 0;
172176 } else {
173177 delay = img_frame_animate(&img, 1);
174178 set_timeout(animate, delay, 1);
175− return 1;
176179 }
180+ return 1;
177181 }
178182
179183 int it_move(arg_t a) {
@@ -318,6 +322,46 @@ int i_rotate(arg_t a) {
318322 return 0;
319323 }
320324
325+int i_toggle_slideshow(arg_t a) {
326+ if (mode == MODE_IMAGE) {
327+ if (img.slideshow) {
328+ img.slideshow = 0;
329+ reset_timeout(slideshow);
330+ return 1;
331+ } else if (fileidx + 1 < filecnt) {
332+ img.slideshow = 1;
333+ set_timeout(slideshow, img.ss_delay, 1);
334+ return 1;
335+ }
336+ }
337+ return 0;
338+}
339+
340+int i_adjust_slideshow(arg_t a) {
341+ long d = (long) a;
342+ int i, delays[] = { 1, 2, 3, 5, 10, 15, 20, 30, 60, 120, 180, 300, 600 };
343+
344+ if (mode != MODE_IMAGE || !img.slideshow)
345+ return 0;
346+
347+ if (d < 0) {
348+ for (i = ARRLEN(delays) - 2; i >= 0; i--) {
349+ if (img.ss_delay > delays[i] * 1000) {
350+ img.ss_delay = delays[i] * 1000;
351+ return 1;
352+ }
353+ }
354+ } else {
355+ for (i = 1; i < ARRLEN(delays); i++) {
356+ if (img.ss_delay < delays[i] * 1000) {
357+ img.ss_delay = delays[i] * 1000;
358+ return 1;
359+ }
360+ }
361+ }
362+ return 0;
363+}
364+
321365 int i_toggle_antialias(arg_t a) {
322366 if (mode == MODE_IMAGE) {
323367 img_toggle_antialias(&img);
@@ -365,14 +409,14 @@ int it_shell_cmd(arg_t a) {
365409 n = mode == MODE_IMAGE ? fileidx : tns.sel;
366410
367411 if (setenv("SXIV_IMG", files[n].path, 1) < 0) {
368− warn("could not change env.-variable: SXIV_IMG. command line was: %s",
412+ warn("could not set env.-variable: SXIV_IMG. command line was: %s",
369413 cmdline);
370414 return 0;
371415 }
372416
373417 if ((pid = fork()) == 0) {
374418 execl("/bin/sh", "/bin/sh", "-c", cmdline, NULL);
375− warn("could not exec: /bin/sh");
419+ warn("could not exec: /bin/sh. command line was: %s", cmdline);
376420 exit(1);
377421 } else if (pid < 0) {
378422 warn("could not fork. command line was: %s", cmdline);
M commands.h View
@@ -57,6 +57,8 @@ int i_zoom(arg_t);
5757 int i_fit_to_win(arg_t);
5858 int i_fit_to_img(arg_t);
5959 int i_rotate(arg_t);
60+int i_toggle_slideshow(arg_t);
61+int i_adjust_slideshow(arg_t);
6062 int i_toggle_antialias(arg_t);
6163 int it_toggle_alpha(arg_t);
6264 int it_open_with(arg_t);
M config.def.h View
@@ -29,6 +29,9 @@ static const float zoom_levels[] = {
2929 100.0, 150.0, 200.0, 400.0, 800.0
3030 };
3131
32+/* default slideshow delay (in sec, overwritten via -S option): */
33+enum { SLIDESHOW_DELAY = 5 };
34+
3235 /* default settings for multi-frame gif images: */
3336 enum {
3437 GIF_DELAY = 100, /* delay time (in ms) */
@@ -104,6 +107,11 @@ static const keymap_t keys[] = {
104107 { False, XK_less, i_rotate, (arg_t) DIR_LEFT },
105108 { False, XK_greater, i_rotate, (arg_t) DIR_RIGHT },
106109
110+ { False, XK_s, i_toggle_slideshow, (arg_t) None },
111+ { True, XK_plus, i_adjust_slideshow, (arg_t) +1 },
112+ { True, XK_equal, i_adjust_slideshow, (arg_t) +1 },
113+ { True, XK_minus, i_adjust_slideshow, (arg_t) -1 },
114+
107115 { False, XK_a, i_toggle_antialias, (arg_t) None },
108116 { False, XK_A, it_toggle_alpha, (arg_t) None },
109117
M image.c View
@@ -56,6 +56,8 @@ void img_init(img_t *img, win_t *win) {
5656 img->zoom = MIN(img->zoom, zoom_max);
5757 img->aa = options->aa;
5858 img->alpha = 1;
59+ img->slideshow = 0;
60+ img->ss_delay = SLIDESHOW_DELAY * 1000;
5961 }
6062
6163 if (win) {
@@ -651,7 +653,7 @@ int img_frame_animate(img_t *img, int restart) {
651653 return 0;
652654
653655 if (img->multi.sel + 1 >= img->multi.cnt) {
654− if (restart || GIF_LOOP) {
656+ if (restart || (GIF_LOOP && !img->slideshow)) {
655657 img_frame_goto(img, 0);
656658 } else {
657659 img->multi.animate = 0;
@@ -660,7 +662,6 @@ int img_frame_animate(img_t *img, int restart) {
660662 } else if (!restart) {
661663 img_frame_goto(img, img->multi.sel + 1);
662664 }
663−
664665 img->multi.animate = 1;
665666
666667 return img->multi.frames[img->multi.sel].delay;
M image.h View
@@ -49,6 +49,9 @@ typedef struct {
4949 unsigned char aa;
5050 unsigned char alpha;
5151
52+ unsigned char slideshow;
53+ int ss_delay; /* in ms */
54+
5255 int x;
5356 int y;
5457 int w;
M main.c View
@@ -53,6 +53,7 @@ typedef struct {
5353 void redraw();
5454 void reset_cursor();
5555 void animate();
56+void slideshow();
5657
5758 appmode_t mode;
5859 img_t img;
@@ -68,7 +69,8 @@ char win_title[TITLE_LEN];
6869 timeout_t timeouts[] = {
6970 { { 0, 0 }, False, redraw },
7071 { { 0, 0 }, False, reset_cursor },
71− { { 0, 0 }, False, animate }
72+ { { 0, 0 }, False, animate },
73+ { { 0, 0 }, False, slideshow },
7274 };
7375
7476 void cleanup() {
@@ -216,8 +218,10 @@ void load_image(int new) {
216218
217219 void update_title() {
218220 int n;
219− float size;
220− const char *unit;
221+ char sshow_info[16];
222+ char frame_info[16];
223+ float size, time;
224+ const char *size_unit, *time_unit;
221225
222226 if (mode == MODE_THUMB) {
223227 n = snprintf(win_title, TITLE_LEN, "sxiv: [%d/%d] %s",
@@ -225,18 +229,27 @@ void update_title() {
225229 tns.cnt ? files[tns.sel].name : "");
226230 } else {
227231 size = filesize;
228− size_readable(&size, &unit);
232+ size_readable(&size, &size_unit);
233+
234+ if (img.slideshow) {
235+ time = img.ss_delay / 1000.0;
236+ time_readable(&time, &time_unit);
237+ snprintf(sshow_info, sizeof(sshow_info), "*%d%s* ",
238+ (int) time, time_unit);
239+ } else {
240+ sshow_info[0] = '\0';
241+ }
229242 if (img.multi.cnt)
230− n = snprintf(win_title, TITLE_LEN,
231− "sxiv: [%d/%d] <%d%%> <%dx%d> (%.2f%s) {%d/%d} %s",
232− fileidx + 1, filecnt, (int) (img.zoom * 100.0), img.w,
233− img.h, size, unit, img.multi.sel + 1, img.multi.cnt,
234− files[fileidx].name);
243+ snprintf(frame_info, sizeof(frame_info), "{%d/%d} ",
244+ img.multi.sel + 1, img.multi.cnt);
235245 else
236− n = snprintf(win_title, TITLE_LEN,
237− "sxiv: [%d/%d] <%d%%> <%dx%d> (%.2f%s) %s",
238− fileidx + 1, filecnt, (int) (img.zoom * 100.0), img.w,
239− img.h, size, unit, files[fileidx].name);
246+ frame_info[0] = '\0';
247+
248+ n = snprintf(win_title, TITLE_LEN,
249+ "sxiv: [%d/%d] <%dx%d:%d%%> (%.2f%s) %s%s%s",
250+ fileidx + 1, filecnt, img.w, img.h,
251+ (int) (img.zoom * 100.0), size, size_unit,
252+ sshow_info, frame_info, files[fileidx].name);
240253 }
241254
242255 if (n >= TITLE_LEN) {
@@ -248,10 +261,17 @@ void update_title() {
248261 }
249262
250263 void redraw() {
251− if (mode == MODE_IMAGE)
264+ if (mode == MODE_IMAGE) {
252265 img_render(&img, &win);
253− else
266+ if (img.slideshow && !img.multi.animate) {
267+ if (fileidx + 1 < filecnt)
268+ set_timeout(slideshow, img.ss_delay, 1);
269+ else
270+ img.slideshow = 0;
271+ }
272+ } else {
254273 tns_render(&tns, &win);
274+ }
255275 update_title();
256276 reset_timeout(redraw);
257277 reset_cursor();
@@ -282,9 +302,19 @@ void animate() {
282302 int delay;
283303
284304 delay = img_frame_animate(&img, 0);
285− if (delay) {
305+ redraw();
306+ if (delay)
286307 set_timeout(animate, delay, 1);
287− redraw();
308+}
309+
310+void slideshow() {
311+ if (mode == MODE_IMAGE && !img.multi.animate) {
312+ if (fileidx + 1 < filecnt) {
313+ load_image(fileidx + 1);
314+ redraw();
315+ } else {
316+ img.slideshow = 0;
317+ }
288318 }
289319 }
290320
M options.c View
@@ -54,23 +54,22 @@ void print_version() {
5454 }
5555
5656 void parse_options(int argc, char **argv) {
57− float z;
58− int n, opt;
57+ int opt, t;
5958
59+ _options.recursive = 0;
6060 _options.startnum = 0;
6161
6262 _options.scalemode = SCALE_MODE;
6363 _options.zoom = 1.0;
6464 _options.aa = 1;
65− _options.thumbnails = 0;
6665
6766 _options.fixed = 0;
6867 _options.fullscreen = 0;
6968 _options.geometry = NULL;
7069
7170 _options.quiet = 0;
71+ _options.thumbnails = 0;
7272 _options.clean_cache = 0;
73− _options.recursive = 0;
7473
7574 while ((opt = getopt(argc, argv, "cdFfg:hn:pqrstvZz:")) != -1) {
7675 switch (opt) {
@@ -96,12 +95,12 @@ void parse_options(int argc, char **argv) {
9695 print_usage();
9796 exit(0);
9897 case 'n':
99− if (!sscanf(optarg, "%d", &n) || n < 1) {
98+ if (!sscanf(optarg, "%d", &t) || t < 1) {
10099 fprintf(stderr, "sxiv: invalid argument for option -n: %s\n",
101100 optarg);
102101 exit(1);
103102 } else {
104− _options.startnum = n - 1;
103+ _options.startnum = t - 1;
105104 }
106105 break;
107106 case 'p':
@@ -128,12 +127,12 @@ void parse_options(int argc, char **argv) {
128127 break;
129128 case 'z':
130129 _options.scalemode = SCALE_ZOOM;
131− if (!sscanf(optarg, "%f", &z) || z < 0) {
130+ if (!sscanf(optarg, "%d", &t) || t <= 0) {
132131 fprintf(stderr, "sxiv: invalid argument for option -z: %s\n",
133132 optarg);
134133 exit(1);
135134 }
136− _options.zoom = z / 100.0;
135+ _options.zoom = (float) t / 100.0;
137136 break;
138137 }
139138 }
M options.h View
@@ -23,23 +23,27 @@
2323 #include "types.h"
2424
2525 typedef struct {
26+ /* file list: */
2627 char **filenames;
2728 unsigned char from_stdin;
29+ unsigned char recursive;
2830 int filecnt;
2931 int startnum;
3032
33+ /* image: */
3134 scalemode_t scalemode;
3235 float zoom;
3336 unsigned char aa;
34− unsigned char thumbnails;
3537
38+ /* window: */
3639 unsigned char fixed;
3740 unsigned char fullscreen;
3841 char *geometry;
3942
43+ /* misc flags: */
4044 unsigned char quiet;
45+ unsigned char thumbnails;
4146 unsigned char clean_cache;
42− unsigned char recursive;
4347 } options_t;
4448
4549 extern const options_t *options;
M util.c View
@@ -127,8 +127,17 @@ void size_readable(float *size, const char **unit) {
127127 const char *units[] = { "", "K", "M", "G" };
128128 int i;
129129
130− for (i = 0; i < ARRLEN(units) && *size > 1024; i++)
131− *size /= 1024;
130+ for (i = 0; i < ARRLEN(units) && *size > 1024.0; i++)
131+ *size /= 1024.0;
132+ *unit = units[MIN(i, ARRLEN(units) - 1)];
133+}
134+
135+void time_readable(float *time, const char **unit) {
136+ const char *units[] = { "s", "m", "h" };
137+ int i;
138+
139+ for (i = 0; i < ARRLEN(units) && *time >= 60.0; i++)
140+ *time /= 60.0;
132141 *unit = units[MIN(i, ARRLEN(units) - 1)];
133142 }
134143
M util.h View
@@ -65,6 +65,7 @@ void die(const char*, ...);
6565 ssize_t get_line(char**, size_t*, FILE*);
6666
6767 void size_readable(float*, const char**);
68+void time_readable(float*, const char**);
6869
6970 char* absolute_path(const char*);
7071