It might be easier to draw your image in a drawing area by using cairo:
Code:
#include <gtk/gtk.h>
GdkPixbuf *scaled=NULL;
GdkPixbuf *original=NULL;
void on_size(GtkWidget *widget, GdkRectangle *allocation, gpointer data)
{
static gint height_old=-1;
static gint width_old=-1;
if ((width_old==allocation->width) && (height_old==allocation->height))
{
return;
}
if (scaled)
{
g_object_unref(scaled); // not sure if this prevents memory overflow
}
scaled=gdk_pixbuf_scale_simple(original,
allocation->width,allocation->height,
GDK_INTERP_HYPER);
height_old=allocation->height;
width_old=allocation->width;
}
gboolean on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
cairo_t *cr=gdk_cairo_create(gtk_widget_get_window(widget));
gdk_cairo_set_source_pixbuf(cr,scaled,0,0);
cairo_paint(cr);
cairo_destroy(cr);
return TRUE;
}
int main(int argc, char **argv)
{
gtk_init(&argc,&argv);
GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
GtkWidget *drawing_area=gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window),drawing_area);
gtk_widget_set_app_paintable(drawing_area,FALSE);
original=gdk_pixbuf_new_from_file("test.jpg",NULL);
g_signal_connect(G_OBJECT(drawing_area),"size-allocate",
G_CALLBACK(on_size),NULL);
g_signal_connect(G_OBJECT(drawing_area),"expose-event",
G_CALLBACK(on_expose),NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}