diff options
author | nirav <nirav@teisuu.com> | 2018-08-24 20:29:33 +0530 |
---|---|---|
committer | Dandelion <nirav@teisuu.com> | 2018-08-24 20:29:33 +0530 |
commit | b7b54b5de2a1840d3e37026fd79f5ec9f405cc32 (patch) | |
tree | 2862d9de26df1d8f9be2aa454f5d6294186970bc | |
parent | 28afa457cea6b1b826a04cced3a0306e580820a7 (diff) | |
download | im-b7b54b5de2a1840d3e37026fd79f5ec9f405cc32.tar.gz im-b7b54b5de2a1840d3e37026fd79f5ec9f405cc32.zip |
Added zoom support with keyboard and mouse wheel
-rw-r--r-- | main.c | 73 |
1 files changed, 65 insertions, 8 deletions
@@ -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)); } |