diff options
Diffstat (limited to 'src/input.c')
-rw-r--r-- | src/input.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..1d21ef2 --- /dev/null +++ b/src/input.c @@ -0,0 +1,206 @@ +#include "input.h" +#include "file.h" +#include "image.h" +#include "window.h" +#include <gtk-3.0/gtk/gtk.h> + +#define TIMEOUT 20 +#define SCROLLAMMOUNT 30 + +int grabbed = 0; +gdouble start_x, start_y; + +void next() +{ + char *name; + if ((name = get_next_file()) != NULL) + load_image(name); +} + +void prev() +{ + char *name; + if ((name = get_prev_file()) != NULL) + load_image(name); +} + +void first() +{ + char *name; + if ((name = get_first_file()) != NULL) + load_image(name); +} + +void last() +{ + char *name; + if ((name = get_last_file()) != NULL) + load_image(name); +} + +void handle_key_press(GdkEvent *event) +{ + GdkModifierType state; + gdk_event_get_state(event, &state); + + switch (event->key.keyval) { + case GDK_KEY_q: + quit(); + case GDK_KEY_w: + fit_image(); + break; + case GDK_KEY_plus: + case GDK_KEY_KP_Add: + zoom(1); + break; + case GDK_KEY_minus: + case GDK_KEY_KP_Subtract: + zoom(-1); + break; + case GDK_KEY_equal: + zoom(0); + break; + case GDK_KEY_n: + next(); + break; + case GDK_KEY_p: + prev(); + break; + case GDK_KEY_Up: + if (curr_scale_mod == fit || state & GDK_SHIFT_MASK) + prev(); + else + scroll_window(0, -SCROLLAMMOUNT); + break; + case GDK_KEY_Down: + if (curr_scale_mod == fit || state & GDK_SHIFT_MASK) + next(); + else + scroll_window(0, SCROLLAMMOUNT); + break; + case GDK_KEY_Right: + if (curr_scale_mod == fit || state & GDK_SHIFT_MASK) + next(); + else + scroll_window(SCROLLAMMOUNT, 0); + break; + case GDK_KEY_Left: + if (curr_scale_mod == fit || state & GDK_SHIFT_MASK) + prev(); + else + scroll_window(-SCROLLAMMOUNT, 0); + break; + case GDK_KEY_j: + if (curr_scale_mod == fit) + next(); + else + scroll_window(0, SCROLLAMMOUNT); + break; + case GDK_KEY_J: + next(); + break; + case GDK_KEY_k: + if (curr_scale_mod == fit) + prev(); + else + scroll_window(0, -SCROLLAMMOUNT); + break; + case GDK_KEY_K: + prev(); + break; + case GDK_KEY_l: + if (curr_scale_mod == fit) + next(); + else + scroll_window(SCROLLAMMOUNT, 0); + break; + case GDK_KEY_L: + next(); + break; + case GDK_KEY_h: + if (curr_scale_mod == fit) + prev(); + else + scroll_window(-SCROLLAMMOUNT, 0); + break; + case GDK_KEY_H: + prev(); + break; + case GDK_KEY_g: + case GDK_KEY_Home: + first(); + break; + case GDK_KEY_G: + case GDK_KEY_End: + last(); + break; + default: + break; + } +} + +void handle_button_press(GdkEvent *event) +{ + grabbed = 1; + start_x = event->motion.x; + start_y = event->motion.y; +} + +void handle_button_release() +{ + grabbed = 0; +} + +void handle_mouse_move(gdouble x, gdouble y) +{ + if (grabbed) { + gdouble diff_x = start_x - x; + gdouble diff_y = start_y - y; + start_x = x; + start_y = y; + scroll_window(diff_x, diff_y); + } +} + +void handle_scroll(GdkEvent *event) +{ + GdkModifierType state; + gdk_event_get_state(event, &state); + + switch (event->scroll.direction) { + case GDK_SCROLL_UP: + if (state & GDK_CONTROL_MASK) { + zoom(1); + } else { + prev(); + } + break; + case GDK_SCROLL_DOWN: + if (state & GDK_CONTROL_MASK) { + zoom(-1); + } else { + next(); + } + break; + default: + break; + } +} + +gboolean resize_done(gpointer data) +{ + guint *id = data; + *id = 0; + fit_image(); + return FALSE; +} + +void handle_resize() +{ + if (curr_scale_mod != fit) + return; + static guint id = 0; + if (id) + g_source_remove(id); + id = g_timeout_add(TIMEOUT, resize_done, &id); +} |