aboutsummaryrefslogtreecommitdiff
path: root/input.c
diff options
context:
space:
mode:
authornirav <nirav@teisuu.com>2018-09-05 00:35:24 +0530
committerDandelion <nirav@teisuu.com>2018-09-07 21:16:09 +0530
commit02f7a54e67260ee7995c6cd9bf40ae784b60203d (patch)
treed8bb663f273f4adf1d737ea39f19e5154c9ac07c /input.c
parent28e58ba0dbf30a4a28465f460c67e1c4337bd3a4 (diff)
downloadim-02f7a54e67260ee7995c6cd9bf40ae784b60203d.tar.gz
im-02f7a54e67260ee7995c6cd9bf40ae784b60203d.zip
Added image panning support, refactoring
Diffstat (limited to 'input.c')
-rw-r--r--input.c146
1 files changed, 146 insertions, 0 deletions
diff --git a/input.c b/input.c
new file mode 100644
index 0000000..1d460d9
--- /dev/null
+++ b/input.c
@@ -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);
+}