Programación en GNOME

Introducción

Qué es un programa GNOME

Un programa GNOME es una aplicación GUI (interfaz gráfico de usuario) para GTK+ que hace uso de las bibliotecas GNOME. Las bibliotecas GNOME hacen posible tener un aspecto similar entre aplicaciones y hacen las cosas más sencillas y fáciles de programar. Además las bibliotecas GNOME añaden una completa gama de widgets que extiende el conjunto de widgets que ofrece GTK+.

Un Programa GNOME sencillo

El siguiente programa crea una ventana GNOME básica y añade una caja horizontal dentro de la cual se incluyen dos botones, los cuales (cuando son presionados) imprimen una cadena hacia la salida estándar del terminal desde el que comenzó la aplicación. La semántica y la estructura de un programa GNOME es muy similar a la programación pura en GTK+.

Necesitará compilar este código, así que debería mirar el capítulo Construyendo Aplicaciones GNOME para obtener mas información sobre como realizar este paso. Aquí tiene un sencillo Makefile que compilará buttons.c para usted. Para compilar otros ejemplos, sólo cambie 'buttons' por el nombre apropiado.

CFLAGS=-g -Wall `gnome-config ––cflags gnome gnomeui`
LDFLAGS=`gnome-config ––libs gnome gnomeui`
all: buttons

Y aquí esta buttons.c:

/*
 * Sencillo programa GNOME, no integrado en el árbol GNOME, sin usar i18n
 * buttons.c
 */
/* La cabecera GNOME más sencilla */
#include <gnome.h>

/* una llamada para los botones */
static void
button_clicked(GtkWidget *button, gpointer data)
{
        /* la cadena que se imprimirá es pasada por el campo 'data'  */

        char *string = data;
        /* imprime una cadena en la salida estándar*/
        g_print(string);
}

/* llamada cuando el usuario cierra la ventana*/
static gint
delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
        /* señal al bucle principal para salir*/
        gtk_main_quit();
        /* devuelve FALSE para continuar cerrando la ventana */
        return FALSE;
}

int main(int argc, char *argv[])
{
        GtkWidget *app;
        GtkWidget *button;
        GtkWidget *hbox;

        /* Inicializa GNOME, esto es muy parecido a gtk_init */
        gnome_init ("buttons-basic-example", "0.1", argc, argv);
        
        /* Crea un widget GNOME, el cual establece una ventana básica
        para su aplicación*/


        app = gnome_app_new ("buttons-basic-example",
                             "Aplicación GNOME Básica");

        /* conecta "delete_event", el cual es el evento que se obtiene
        cuando el usuario cierra la ventana desde el gestor de
        ventanas, con gtk_main_quit (La función que
        provoca que el bucle gtk_main salga, y consecuentemente
        termine la aplicación)*/

        gtk_signal_connect (GTK_OBJECT (app), "delete_event",
                            GTK_SIGNAL_FUNC (delete_event),
                            NULL);

        /* crea una caja horizontal para los botones y la añade dentro
        de la aplicación del widget*/

        hbox = gtk_hbox_new (FALSE,5);
        gnome_app_set_contents (GNOME_APP (app), hbox);

        /* crea un botón y lo añade a la caja horizontal */
        button = gtk_button_new_with_label("Botón 1");
        gtk_box_pack_start (GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (button_clicked),
                            "Botón 1\n");

        /* y otro botón*/
        button = gtk_button_new_with_label("Botón 2");
        gtk_box_pack_start (GTK_BOX(hbox), button, FALSE, FALSE, 0);
        gtk_signal_connect (GTK_OBJECT (button), "clicked",
                            GTK_SIGNAL_FUNC (button_clicked),
                            "Botón 2\n");
        
        /* muestra todo dentro de este widget y el widget mismo */
        gtk_widget_show_all(app);
        
        /* entra en el bucle principal */
        gtk_main ();
        
        return 0;
}

Por favor, observe el uso de gnome_init en lugar de gtk_init, y del widget GnomeApp en lugar del GtkWindow habitual. Entraremos en detalle sobre esto mas tarde.