#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 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_file(); break; case GDK_KEY_p: prev_file(); break; case GDK_KEY_Up: if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK) prev_file(); else scroll_window(0, -SCROLLAMMOUNT); break; case GDK_KEY_Down: if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK) next_file(); else scroll_window(0, SCROLLAMMOUNT); break; case GDK_KEY_Right: if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK) next_file(); else scroll_window(SCROLLAMMOUNT, 0); break; case GDK_KEY_Left: if (get_current_scale_mode() == fit || state & GDK_SHIFT_MASK) prev_file(); else scroll_window(-SCROLLAMMOUNT, 0); break; case GDK_KEY_j: if (get_current_scale_mode() == fit) next_file(); else scroll_window(0, SCROLLAMMOUNT); break; case GDK_KEY_J: next_file(); break; case GDK_KEY_k: if (get_current_scale_mode() == fit) prev_file(); else scroll_window(0, -SCROLLAMMOUNT); break; case GDK_KEY_K: prev_file(); break; case GDK_KEY_l: if (get_current_scale_mode() == fit) next_file(); else scroll_window(SCROLLAMMOUNT, 0); break; case GDK_KEY_L: next_file(); break; case GDK_KEY_h: if (get_current_scale_mode() == fit) prev_file(); else scroll_window(-SCROLLAMMOUNT, 0); break; case GDK_KEY_H: prev_file(); break; case GDK_KEY_g: case GDK_KEY_Home: first_file(); break; case GDK_KEY_G: case GDK_KEY_End: last_file(); break; case GDK_KEY_f: toggle_fullscreen(); break; case GDK_KEY_i: toggle_infopanel(); 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_file(); } break; case GDK_SCROLL_DOWN: if (state & GDK_CONTROL_MASK) { zoom(-1); } else { next_file(); } break; default: break; } } gboolean resize_done(gpointer data) { guint *id = data; *id = 0; fit_image(); return FALSE; } void handle_resize() { if (get_current_scale_mode() != fit) return; static guint id = 0; if (id) g_source_remove(id); id = g_timeout_add(TIMEOUT, resize_done, &id); }