aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornirav <nirav@teisuu.com>2018-08-24 20:29:33 +0530
committerDandelion <nirav@teisuu.com>2018-08-24 20:29:33 +0530
commitb7b54b5de2a1840d3e37026fd79f5ec9f405cc32 (patch)
tree2862d9de26df1d8f9be2aa454f5d6294186970bc
parent28afa457cea6b1b826a04cced3a0306e580820a7 (diff)
downloadim-b7b54b5de2a1840d3e37026fd79f5ec9f405cc32.tar.gz
im-b7b54b5de2a1840d3e37026fd79f5ec9f405cc32.zip
Added zoom support with keyboard and mouse wheel
-rw-r--r--main.c73
1 files changed, 65 insertions, 8 deletions
diff --git a/main.c b/main.c
index 915d843..e293a07 100644
--- a/main.c
+++ b/main.c
@@ -1,5 +1,6 @@
#include <gtk-3.0/gtk/gtk.h>
#define TIMEOUT 20
+#define ZOOM_FACTOR 0.1
GtkWidget *window;
GtkWidget *image;
@@ -7,16 +8,69 @@ GdkPixbuf *pixbuf;
GdkPixbuf *curr_pixbuf;
int pixbuf_width, pixbuf_height;
double aspect_ratio;
+double curr_zoom = 1.0;
-static gboolean key_press(GtkWindow *window, gpointer data)
+void zoom(int type)
{
- GdkEventKey *event = (GdkEventKey *)data;
- if (event->keyval == GDK_KEY_q) {
+ if (type == 0) {
+ if (curr_zoom == 1.0)
+ return;
+ curr_zoom = (double)1.0;
+ } else if (type < 0) {
+ if (curr_zoom < 0.2)
+ return;
+ curr_zoom -= (double)ZOOM_FACTOR;
+ } else if (type > 0) {
+ if (curr_zoom > 2)
+ return;
+ curr_zoom += (double)ZOOM_FACTOR;
+ }
+ if (curr_pixbuf != NULL)
+ g_object_unref(curr_pixbuf);
+ curr_pixbuf = gdk_pixbuf_scale_simple(
+ GDK_PIXBUF(pixbuf), pixbuf_width * curr_zoom,
+ pixbuf_height * curr_zoom, GDK_INTERP_BILINEAR);
+ gtk_image_set_from_pixbuf(GTK_IMAGE(image), GDK_PIXBUF(curr_pixbuf));
+}
+
+static gboolean key_press(GtkWindow *window, GdkEvent *event, gpointer data)
+{
+ switch (event->key.keyval) {
+ case GDK_KEY_q:
g_application_quit(G_APPLICATION(
gtk_window_get_application(GTK_WINDOW(window))));
return FALSE;
- } else
+ case GDK_KEY_plus:
+ case GDK_KEY_ScrollUp:
+ zoom(1);
+ return FALSE;
+ case GDK_KEY_minus:
+ case GDK_KEY_ScrollDown:
+ zoom(-1);
+ return FALSE;
+ case GDK_KEY_equal:
+ case GDK_KEY_ScrollClick:
+ zoom(0);
+ return FALSE;
+ default:
return TRUE;
+ }
+}
+
+gboolean scroll_callback(GtkWindow *window, GdkEvent *event, gpointer data)
+{
+ GdkModifierType state;
+ gdk_event_get_state(event, &state);
+ if (state & GDK_CONTROL_MASK &&
+ event->scroll.direction == GDK_SCROLL_UP) {
+ zoom(1);
+ return FALSE;
+ } else if (state & GDK_CONTROL_MASK &&
+ event->scroll.direction == GDK_SCROLL_DOWN) {
+ zoom(-1);
+ return FALSE;
+ }
+ return TRUE;
}
gboolean resize_done(gpointer data)
@@ -73,10 +127,13 @@ static void activate(GtkApplication *app, gpointer user_data)
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "qwe");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 300);
- g_signal_connect(G_OBJECT(window), "configure-event",
- G_CALLBACK(configure_callback), NULL);
+ /* g_signal_connect(G_OBJECT(window), "configure-event", */
+ /* G_CALLBACK(configure_callback), NULL); */
g_signal_connect(G_OBJECT(window), "key-press-event",
G_CALLBACK(key_press), NULL);
+ gtk_widget_add_events(GTK_WIDGET(window), GDK_SCROLL_MASK);
+ g_signal_connect(G_OBJECT(window), "scroll-event",
+ G_CALLBACK(scroll_callback), NULL);
pixbuf = gdk_pixbuf_new_from_file(
"/home/nirav/Downloads/Saved Pictures/bash help shortcuts.png",
@@ -91,12 +148,12 @@ static void activate(GtkApplication *app, gpointer user_data)
pixbuf_width = gdk_pixbuf_get_width(GDK_PIXBUF(pixbuf));
pixbuf_height = gdk_pixbuf_get_height(GDK_PIXBUF(pixbuf));
aspect_ratio = (double)pixbuf_width / (double)pixbuf_height;
- GtkWidget *scrolled_window =
- gtk_scrolled_window_new(NULL, NULL);
+ GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(image));
+
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(scrolled_window));
gtk_widget_show_all(GTK_WIDGET(window));
}