diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 73 |
1 files changed, 46 insertions, 27 deletions
@@ -15,8 +15,10 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include <limits.h> #include <stdio.h> #include <stddef.h> +#include <stdint.h> #include <SDL2/SDL.h> #include <SDL2/SDL_ttf.h> #include <FreeImage.h> @@ -37,7 +39,7 @@ struct { int nearest_neighbour; int solid_bg; int list; - unsigned int delay; + unsigned long delay; unsigned char bg_r; unsigned char bg_g; unsigned char bg_b; @@ -129,7 +131,7 @@ static void parse_args(int argc, char** argv) opterr = 0; const char* name = argv[0]; - char o; + char *argp, o; while((o = getopt(argc, argv, "firaudhln:b:e:t:")) != -1) { switch(o) { @@ -163,7 +165,24 @@ static void parse_args(int argc, char** argv) g_options.font = optarg; break; case 't': - g_options.delay = (unsigned int)atoi(optarg); + g_options.delay = strtoul(optarg, &argp, 10); + g_options.delay *= 1000; + if (*argp == '.') { + char *ep; + long delay = strtoul(++argp, &ep, 10); + for (int i = 3 - (ep - argp); i; i--) { + delay *= 10; + } + if (delay < 1000) { + g_options.delay += delay; + } else { + g_options.delay = ULONG_MAX; + } + } + if (g_options.delay == ULONG_MAX) { + fprintf(stderr, "Wrong slideshow delay '%s'. Aborting.\n", optarg); + exit(1); + } break; case '?': fprintf(stderr, "Unknown argument '%c'. Aborting.\n", optopt); @@ -293,12 +312,14 @@ int main(int argc, char** argv) unsigned int last_time; unsigned int current_time; + /* keep file change polling rate under control */ + static uint8_t poll_countdown = UINT8_MAX; + /* do we need to redraw the window? */ int need_redraw = 1; /* used to calculate when to skip to the next image in slideshow mode */ - unsigned int msecs_passed = 0; - unsigned int delay_seconds_passed = 0; + unsigned long delay_mseconds_passed = 0; int quit = 0; while(!quit) { @@ -319,13 +340,13 @@ int main(int argc, char** argv) case SDLK_LEFT: imv_navigator_select_rel(&nav, -1); /* reset slideshow delay */ - delay_seconds_passed = 0; + delay_mseconds_passed = 0; break; case SDLK_RIGHTBRACKET: case SDLK_RIGHT: imv_navigator_select_rel(&nav, 1); /* reset slideshow delay */ - delay_seconds_passed = 0; + delay_mseconds_passed = 0; break; case SDLK_EQUALS: case SDLK_i: @@ -418,7 +439,7 @@ int main(int argc, char** argv) } /* if the user has changed image, start loading the new one */ - if(imv_navigator_poll_changed(&nav)) { + if(imv_navigator_poll_changed(&nav, poll_countdown--)) { const char *current_path = imv_navigator_selection(&nav); if(!current_path) { fprintf(stderr, "No input files left. Exiting.\n"); @@ -460,19 +481,14 @@ int main(int argc, char** argv) } /* handle slideshow */ - if (g_options.delay) { + if(g_options.delay) { unsigned int dt = current_time - last_time; - msecs_passed = msecs_passed + dt; - /* tick every second */ - if(msecs_passed >= 1000) { - msecs_passed = 0; - delay_seconds_passed++; - need_redraw = 1; - if(delay_seconds_passed >= g_options.delay) { - imv_navigator_select_rel(&nav, 1); - delay_seconds_passed = 0; - } + delay_mseconds_passed += dt; + need_redraw = 1; + if(delay_mseconds_passed >= g_options.delay) { + imv_navigator_select_rel(&nav, 1); + delay_mseconds_passed = 0; } } @@ -488,10 +504,10 @@ int main(int argc, char** argv) /* update window title */ const char *current_path = imv_navigator_selection(&nav); char title[256]; - if(g_options.delay) { - snprintf(&title[0], sizeof(title), "imv - [%i/%i] [%i/%is] [%ix%i] %s", - nav.cur_path + 1, nav.num_paths, delay_seconds_passed + 1, - g_options.delay, tex.width, tex.height, current_path); + if(g_options.delay > 1000) { + snprintf(&title[0], sizeof(title), "imv - [%i/%i] [%lu/%lus] [%ix%i] %s", + nav.cur_path + 1, nav.num_paths, delay_mseconds_passed / 1000 + 1, + g_options.delay / 1000, tex.width, tex.height, current_path); } else { snprintf(&title[0], sizeof(title), "imv - [%i/%i] [%ix%i] %s", nav.cur_path + 1, nav.num_paths, @@ -501,10 +517,10 @@ int main(int argc, char** argv) /* update the overlay */ if(font) { - if(g_options.delay) { - snprintf(&title[0], sizeof(title), "[%i/%i] [%i/%is] %s", - nav.cur_path + 1, nav.num_paths, delay_seconds_passed + 1, - g_options.delay, current_path); + if(g_options.delay > 1000) { + snprintf(&title[0], sizeof(title), "[%i/%i] [%lu/%lus] %s", + nav.cur_path + 1, nav.num_paths, delay_mseconds_passed / 1000 + 1, + g_options.delay / 1000, current_path); } else { snprintf(&title[0], sizeof(title), "[%i/%i] %s", nav.cur_path + 1, nav.num_paths, current_path); @@ -549,6 +565,9 @@ int main(int argc, char** argv) /* redraw complete, unset the flag */ need_redraw = 0; + /* reset poll countdown timer */ + poll_countdown = UINT8_MAX; + /* tell SDL to show the newly drawn frame */ SDL_RenderPresent(renderer); } |