diff options
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 99 |
1 files changed, 99 insertions, 0 deletions
@@ -0,0 +1,99 @@ +#include <gtk-3.0/gtk/gtk.h> + +GtkWidget *window; +GtkWidget *image; +GdkPixbuf *pixbuf; +GdkPixbuf *curr_pixbuf; +int pixbuf_width, pixbuf_height; +double aspect_ratio; + +static gboolean key_press(GtkWindow *window, gpointer data) +{ + GdkEventKey *event = (GdkEventKey *)data; + if (event->keyval == GDK_KEY_q) { + g_application_quit(G_APPLICATION( + gtk_window_get_application(GTK_WINDOW(window)))); + return FALSE; + } else + return TRUE; +} + +void configure_callback(GtkWindow *window, GdkEvent *event, gpointer data) +{ + gint win_width, win_height; + gint new_pixbuf_width, new_pixbuf_height; + gtk_window_get_size(GTK_WINDOW(window), &win_width, &win_height); + + if (win_width < pixbuf_width && win_height > pixbuf_height) { + new_pixbuf_width = win_width; + new_pixbuf_height = (double)new_pixbuf_width / aspect_ratio; + } else if (win_width > pixbuf_width && win_height < pixbuf_height) { + new_pixbuf_height = win_height; + new_pixbuf_width = (double)new_pixbuf_height * aspect_ratio; + } else if (win_width < pixbuf_width && win_height < pixbuf_height) { + if (((double)win_width / (double)win_height) > aspect_ratio) { + new_pixbuf_height = win_height; + new_pixbuf_width = + ((double)new_pixbuf_height * aspect_ratio); + } else { + new_pixbuf_width = win_width; + new_pixbuf_height = + (double)new_pixbuf_width / aspect_ratio; + } + } else { + new_pixbuf_width = pixbuf_width; + new_pixbuf_height = pixbuf_height; + } + + gtk_container_remove(GTK_CONTAINER(window), GTK_WIDGET(image)); + if (curr_pixbuf != NULL) + g_object_unref(curr_pixbuf); + curr_pixbuf = + gdk_pixbuf_scale_simple(GDK_PIXBUF(pixbuf), new_pixbuf_width, + new_pixbuf_height, GDK_INTERP_BILINEAR); + image = gtk_image_new_from_pixbuf(GDK_PIXBUF(curr_pixbuf)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(image)); + gtk_widget_show_all(GTK_WIDGET(window)); +} + +static void activate(GtkApplication *app, gpointer user_data) +{ + GError *error = NULL; + + window = gtk_application_window_new(app); + 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_window_set_title(GTK_WINDOW(window), "qwe"); + gtk_window_set_default_size(GTK_WINDOW(window), 300, 300); + pixbuf = gdk_pixbuf_new_from_file( + "/home/nirav/Downloads/Saved Pictures/bash help shortcuts.png", + &error); + if (error) { + g_warning("gdk_pixbuf_new_from_file() failed with error: %s\n", + error->message); + g_clear_error(&error); + return; + } + + image = gtk_image_new_from_pixbuf(GDK_PIXBUF(pixbuf)); + 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; + + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(image)); + gtk_widget_show_all(GTK_WIDGET(window)); +} + +int main(int argc, char *argv[]) +{ + GtkApplication *app; + int status; + app = gtk_application_new("org.gtk.qwe", G_APPLICATION_FLAGS_NONE); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + return status; +} |