aboutsummaryrefslogtreecommitdiff
path: root/src/input.c
diff options
context:
space:
mode:
authornirav <nirav@teisuu.com>2018-09-09 12:13:13 +0530
committerDandelion <nirav@teisuu.com>2018-09-09 12:46:57 +0530
commite54d8327819e310b7b148e45c15fca197be845c7 (patch)
tree04e513d52ed2191364e6b9472cd0f3882a60da4a /src/input.c
parent661756c9237a26562cae102f53b12aa0b403fde1 (diff)
downloadim-e54d8327819e310b7b148e45c15fca197be845c7.tar.gz
im-e54d8327819e310b7b148e45c15fca197be845c7.zip
Moved source files to src dir, updated makefile
Diffstat (limited to 'src/input.c')
-rw-r--r--src/input.c206
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);
+}