#include "input.h" #include "file.h" #include "image.h" #include "window.h" #include #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); }