diff options
author | nirav <nirav@teisuu.com> | 2018-09-05 00:35:24 +0530 |
---|---|---|
committer | Dandelion <nirav@teisuu.com> | 2018-09-07 21:16:09 +0530 |
commit | 02f7a54e67260ee7995c6cd9bf40ae784b60203d (patch) | |
tree | d8bb663f273f4adf1d737ea39f19e5154c9ac07c /input.c | |
parent | 28e58ba0dbf30a4a28465f460c67e1c4337bd3a4 (diff) | |
download | im-02f7a54e67260ee7995c6cd9bf40ae784b60203d.tar.gz im-02f7a54e67260ee7995c6cd9bf40ae784b60203d.zip |
Added image panning support, refactoring
Diffstat (limited to 'input.c')
-rw-r--r-- | input.c | 146 |
1 files changed, 146 insertions, 0 deletions
@@ -0,0 +1,146 @@ +#include "input.h" +#include "file.h" +#include "image.h" +#include "window.h" +#include <gtk-3.0/gtk/gtk.h> + +#define TIMEOUT 20 + +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(GdkEventKey key) +{ + switch (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: + case GDK_KEY_j: + case GDK_KEY_Right: + next(); + break; + case GDK_KEY_p: + case GDK_KEY_k: + case GDK_KEY_Left: + 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); +} |