From 65c9826bab96fe9925b7bc03caec2298f57a04a0 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Nov 2017 21:33:33 +0000 Subject: Move remaining actions to bindable commands --- src/imv.c | 190 ++++++++++++++++++++++++++++++++++++++------------------ src/navigator.c | 25 +++++++- src/navigator.h | 3 + 3 files changed, 157 insertions(+), 61 deletions(-) (limited to 'src') diff --git a/src/imv.c b/src/imv.c index 260545a..64c9178 100644 --- a/src/imv.c +++ b/src/imv.c @@ -109,6 +109,12 @@ void command_remove(struct list *args, const char *argstr, void *data); void command_fullscreen(struct list *args, const char *argstr, void *data); void command_overlay(struct list *args, const char *argstr, void *data); void command_exec(struct list *args, const char *argstr, void *data); +void command_center(struct list *args, const char *argstr, void *data); +void command_reset(struct list *args, const char *argstr, void *data); +void command_next_frame(struct list *args, const char *argstr, void *data); +void command_toggle_playing(struct list *args, const char *argstr, void *data); +void command_set_scaling_mode(struct list *args, const char *argstr, void *data); +void command_set_slideshow_duration(struct list *args, const char *argstr, void *data); static bool setup_window(struct imv *imv); static void handle_event(struct imv *imv, SDL_Event *event); @@ -166,6 +172,12 @@ struct imv *imv_create(void) imv_command_register(imv->commands, "fullscreen", &command_fullscreen); imv_command_register(imv->commands, "overlay", &command_overlay); imv_command_register(imv->commands, "exec", &command_exec); + imv_command_register(imv->commands, "center", &command_center); + imv_command_register(imv->commands, "reset", &command_reset); + imv_command_register(imv->commands, "next_frame", &command_next_frame); + imv_command_register(imv->commands, "toggle_playing", &command_toggle_playing); + imv_command_register(imv->commands, "scaling_mode", &command_set_scaling_mode); + imv_command_register(imv->commands, "slideshow_duration", &command_set_slideshow_duration); imv_command_alias(imv->commands, "q", "quit"); imv_command_alias(imv->commands, "next", "select_rel 1"); @@ -178,6 +190,8 @@ struct imv *imv_create(void) add_bind(imv, "[", "select_rel -1"); add_bind(imv, "", "select_rel 1"); add_bind(imv, "]", "select_rel 1"); + add_bind(imv, "GG", "select_abs 0"); + add_bind(imv, "", "select_abs -1"); add_bind(imv, "J", "pan 0 -50"); add_bind(imv, "K", "pan 0 50"); add_bind(imv, "H", "pan 50 0"); @@ -185,6 +199,22 @@ struct imv *imv_create(void) add_bind(imv, "X", "remove"); add_bind(imv, "F", "fullscreen"); add_bind(imv, "D", "overlay"); + add_bind(imv, "P", "exec echo $imv_path"); + add_bind(imv, "", "zoom 1"); + add_bind(imv, "", "zoom 1"); + add_bind(imv, "+", "zoom 1"); + add_bind(imv, "I", "zoom 1"); + add_bind(imv, "", "zoom -1"); + add_bind(imv, "-", "zoom -1"); + add_bind(imv, "O", "zoom -1"); + add_bind(imv, "C", "center"); + add_bind(imv, "S", "scaling_mode next"); + add_bind(imv, "A", "zoom actual"); + add_bind(imv, "R", "reset"); + add_bind(imv, ".", "next_frame"); + add_bind(imv, "", "toggle_playing"); + add_bind(imv, "T", "slideshow_duration +1"); + add_bind(imv, "", "slideshow_duration -1"); return imv; } @@ -699,62 +729,6 @@ static void handle_event(struct imv *imv, SDL_Event *event) imv->need_redraw = true; } break; - case SDLK_EQUALS: - case SDLK_PLUS: - case SDLK_i: - case SDLK_UP: - imv_viewport_zoom(imv->view, imv->texture, IMV_ZOOM_KEYBOARD, 1); - break; - case SDLK_MINUS: - case SDLK_o: - case SDLK_DOWN: - imv_viewport_zoom(imv->view, imv->texture, IMV_ZOOM_KEYBOARD, -1); - break; - case SDLK_s: - if(!event->key.repeat) { - imv->scaling_mode++; - imv->scaling_mode %= SCALING_MODE_COUNT; - } - /* FALLTHROUGH */ - case SDLK_r: - if(!event->key.repeat) { - imv->need_rescale = true; - imv->need_redraw = true; - } - break; - case SDLK_a: - if(!event->key.repeat) { - imv_viewport_scale_to_actual(imv->view, imv->texture); - } - break; - case SDLK_c: - if(!event->key.repeat) { - imv_viewport_center(imv->view, imv->texture); - } - break; - case SDLK_PERIOD: - imv_loader_load_next_frame(imv->loader); - break; - case SDLK_SPACE: - if(!event->key.repeat) { - imv_viewport_toggle_playing(imv->view); - } - break; - case SDLK_p: - if(!event->key.repeat) { - puts(imv_navigator_selection(imv->navigator)); - } - break; - case SDLK_t: - if(event->key.keysym.mod & (KMOD_SHIFT|KMOD_CAPS)) { - if(imv->slideshow_image_duration >= 1000) { - imv->slideshow_image_duration -= 1000; - } - } else { - imv->slideshow_image_duration += 1000; - } - imv->need_redraw = true; - break; default: { /* braces to allow const char *cmd definition */ const char *cmd = imv_bind_handle_event(imv->binds, event); if(cmd) { @@ -998,16 +972,31 @@ void command_select_rel(struct list *args, const char *argstr, void *data) void command_select_abs(struct list *args, const char *argstr, void *data) { - (void)args; (void)argstr; - (void)data; + struct imv *imv = data; + if(args->len != 2) { + return; + } + + long int index = strtol(args->items[1], NULL, 10); + imv_navigator_select_abs(imv->navigator, index); + + imv->slideshow_time_elapsed = 0; } void command_zoom(struct list *args, const char *argstr, void *data) { - (void)args; (void)argstr; - (void)data; + struct imv *imv = data; + if(args->len == 2) { + const char *str = args->items[1]; + if(!strcmp(str, "actual")) { + imv_viewport_scale_to_actual(imv->view, imv->texture); + } else { + long int amount = strtol(args->items[1], NULL, 10); + imv_viewport_zoom(imv->view, imv->texture, IMV_ZOOM_KEYBOARD, amount); + } + } } void command_remove(struct list *args, const char *argstr, void *data) @@ -1047,4 +1036,85 @@ void command_exec(struct list *args, const char *argstr, void *data) system(argstr); } +void command_center(struct list *args, const char *argstr, void *data) +{ + (void)args; + (void)argstr; + struct imv *imv = data; + imv_viewport_center(imv->view, imv->texture); +} + +void command_reset(struct list *args, const char *argstr, void *data) +{ + (void)args; + (void)argstr; + struct imv *imv = data; + imv->need_rescale = true; + imv->need_redraw = true; +} + +void command_next_frame(struct list *args, const char *argstr, void *data) +{ + (void)args; + (void)argstr; + struct imv *imv = data; + imv_loader_load_next_frame(imv->loader); +} + +void command_toggle_playing(struct list *args, const char *argstr, void *data) +{ + (void)args; + (void)argstr; + struct imv *imv = data; + imv_viewport_toggle_playing(imv->view); +} + +void command_set_scaling_mode(struct list *args, const char *argstr, void *data) +{ + (void)args; + (void)argstr; + struct imv *imv = data; + + if(args->len != 2) { + return; + } + + const char *mode = args->items[1]; + + if(!strcmp(mode, "next")) { + imv->scaling_mode++; + imv->scaling_mode %= SCALING_MODE_COUNT; + } else if(!strcmp(mode, "none")) { + imv->scaling_mode = SCALING_NONE; + } else if(!strcmp(mode, "shrink")) { + imv->scaling_mode = SCALING_DOWN; + } else if(!strcmp(mode, "full")) { + imv->scaling_mode = SCALING_FULL; + } else { + /* no changes, don't bother to redraw */ + return; + } + + imv->need_rescale = true; + imv->need_redraw = true; +} + +void command_set_slideshow_duration(struct list *args, const char *argstr, void *data) +{ + (void)argstr; + struct imv *imv = data; + if(args->len == 2) { + long int delta = 1000 * strtol(args->items[1], NULL, 10); + + /* Ensure we can't go below 0 */ + if(delta < 0 && (size_t)abs(delta) > imv->slideshow_image_duration) { + imv->slideshow_image_duration = 0; + } else { + imv->slideshow_image_duration += delta; + } + + imv->need_redraw = true; + } +} + /* vim:set ts=2 sts=2 sw=2 et: */ diff --git a/src/navigator.c b/src/navigator.c index 60e98af..9defcbc 100644 --- a/src/navigator.c +++ b/src/navigator.c @@ -130,7 +130,7 @@ const char *imv_navigator_selection(struct imv_navigator *nav) void imv_navigator_select_rel(struct imv_navigator *nav, int direction) { - int prev_path = nav->cur_path; + const int prev_path = nav->cur_path; if(nav->num_paths == 0) { return; } @@ -158,6 +158,29 @@ void imv_navigator_select_rel(struct imv_navigator *nav, int direction) return; } +void imv_navigator_select_abs(struct imv_navigator *nav, int index) +{ + const int prev_path = nav->cur_path; + /* allow -1 to indicate the last image */ + if(index < 0) { + index += nav->num_paths; + + /* but if they go farther back than the first image, stick to first image */ + if(index < 0) { + index = 0; + } + } + + /* stick to last image if we go beyond it */ + if(index >= nav->num_paths) { + index = nav->num_paths - 1; + } + + nav->cur_path = index; + nav->changed = prev_path != nav->cur_path; + nav->last_move_direction = (index >= prev_path) ? 1 : -1; +} + void imv_navigator_remove(struct imv_navigator *nav, const char *path) { int removed = -1; diff --git a/src/navigator.h b/src/navigator.h index 5babf89..5d4f065 100644 --- a/src/navigator.h +++ b/src/navigator.h @@ -55,6 +55,9 @@ const char *imv_navigator_selection(struct imv_navigator *nav); /* Change the currently selected path. dir = -1 for previous, 1 for next. */ void imv_navigator_select_rel(struct imv_navigator *nav, int dir); +/* Change the currently selected path. 0 = first, 1 = second, etc. */ +void imv_navigator_select_abs(struct imv_navigator *nav, int index); + /* Removes the given path. The current selection is updated if necessary, * based on the last direction the selection moved. */ void imv_navigator_remove(struct imv_navigator *nav, const char *path); -- cgit v1.2.3