aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2017-11-23 21:33:33 +0000
committerHarry Jeffery <harry@exec64.co.uk>2017-11-23 22:18:28 +0000
commit65c9826bab96fe9925b7bc03caec2298f57a04a0 (patch)
tree24e17cf1dbf8e0023084f660aedbfc70d0599c5b /src
parent599a48746a6ff07405dc9abcfb872cca58e4aa47 (diff)
downloadimv-65c9826bab96fe9925b7bc03caec2298f57a04a0.tar.gz
Move remaining actions to bindable commands
Diffstat (limited to 'src')
-rw-r--r--src/imv.c190
-rw-r--r--src/navigator.c25
-rw-r--r--src/navigator.h3
3 files changed, 157 insertions, 61 deletions
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, "<Right>", "select_rel 1");
add_bind(imv, "]", "select_rel 1");
+ add_bind(imv, "GG", "select_abs 0");
+ add_bind(imv, "<Shift+G>", "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, "<Equals>", "zoom 1");
+ add_bind(imv, "<Up>", "zoom 1");
+ add_bind(imv, "+", "zoom 1");
+ add_bind(imv, "I", "zoom 1");
+ add_bind(imv, "<Down>", "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, "<Space>", "toggle_playing");
+ add_bind(imv, "T", "slideshow_duration +1");
+ add_bind(imv, "<Shift+T>", "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);