#include "input.h" #include "file.h" #include "image.h" #include "window.h" #include #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(); break; 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; case GDK_KEY_f: toggle_fullscreen(); break; default: break; } } void handle_button_press(GdkEvent *event) { if (event->type == GDK_2BUTTON_PRESS) toggle_fullscreen(); else { 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); }