#include 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; }