Una ventana que muestra una imagen cargada a través de un PixBuf y reporta errores al cargar la imagen a través de una ventana de diálogo de mensajes
/* vim: set et sw=4 sts=4 :
*
* Se compila con:
* gcc -o imagen `pkg-config --cflags --libs gtk+-2.0` imagen.c
*
* Copyright (2008) Leandro Lucarella, under BOLA license:
* http://auriga.wearlab.de/~alb/bola/
*/
#include <glib.h>
#include <gtk/gtk.h>
/* Función 'callback' para atender la señal "destroy" de la ventana. */
static void destruir(GtkWidget* widget, gpointer data);
/* Programa */
int main(int argc, char* argv[]) {
/* GtkWidget almacena cualquier tipo de widget */
GtkWidget* ventana;
GtkWidget* imagen;
GdkPixbuf* pixbuf;
gtk_init(&argc, &argv);
/* chequeo de parámetros */
if (argc < 2) {
g_printerr("Necesito una imagen! Uso: %s imagen\n", argv[0]);
return 1;
}
/* cargo imagen desde archivo */
pixbuf = gdk_pixbuf_new_from_file(argv[1], /* error */ NULL);
if (!pixbuf) {
gint result;
/* hubo un error, mostramos un mensaje a través de un diálogo */
GtkWidget* dialog = gtk_message_dialog_new(NULL, /* padre */
0, /* flags */
GTK_MESSAGE_ERROR, /* imagen */
GTK_BUTTONS_CLOSE, /* botones */
"No se pudo cargar la imagen %s.\n", argv[1]); /* mensaje */
/* muestra el diálogo bloqueando hasta que apretan un botón
* en "result" queda qué botón fue apretado (por ejemplo
* GTK_RESPONSE_CLOSE) */
result = gtk_dialog_run(GTK_DIALOG(dialog));
/* tenemos que destruir el diálogo nosotros después de usarlo si no
* tiene un padre o no usamos el flag GTK_DIALOG_DESTROY_WITH_PARENT */
gtk_widget_destroy(dialog);
return 1;
}
/********************************* VENTANA *******************************/
/* creo ventana principal */
ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
/* conecto la señal "destroy" de la ventana a la callback destruir()
* esta señal se emite cuando se llama a gtk_widget_destroy() */
g_signal_connect(G_OBJECT(ventana), "destroy", G_CALLBACK(destruir),
NULL);
/* pongo un borde a la ventana (espacio libre al rededor del borde) */
gtk_container_set_border_width(GTK_CONTAINER(ventana), 10);
/********************************** IMAGEN *******************************/
/* creo una imagen a partir del pixbuf */
imagen = gtk_image_new_from_pixbuf(pixbuf);
/*imagen = gtk_image_new_from_file(argv[1]);*/
/* agrega la imagen a la ventana (que es un GtkContainer) */
gtk_container_add(GTK_CONTAINER(ventana), imagen);
/********************************* PROGRAMA ******************************/
/* muestro la ventana y todos sus hijos */
gtk_widget_show_all(ventana);
/* comienza el loop de eventos */
gtk_main();
return 0;
}
static void destruir(GtkWidget* widget, gpointer data) {
g_print ("[recibido el evento destroy]\n");
/* finaliza el loop de gtk_main() y libera memoria */
gtk_main_quit();
}