Entrada de texto

Haremos una aplicación con interfaz gráfica en GTK 2.0 Agregamos una caja de entrada de texto y hacemos que al presionar el botón, se imprima el texto ingresado por el usuario por la salida estándar.

Incluimos las bibliotecas de gtk y glib y declaramos algunas funciones que vamos a usar.

/* vim: set et sw=4 sts=4 :
 *
 * Basado en un ejemplo de http://www.gtk.org/tutorial/
 *
 * Se compila con:
 * gcc -o entrada `pkg-config --cflags --libs gtk+-2.0` entrada.c
 *
 */
#include <glib.h>
#include <glib/gprintf.h>
#include <gtk/gtk.h>

/* Función 'callback' para atender la señal "clicked" del botón */
static void on_boton_clicked(GtkWidget *widget, gpointer data);

/* Función 'callback' para atender la señal del evento "delete_event" */
static gboolean on_delete_event(GtkWidget *widget, GdkEvent *event,
 gpointer data);

/* Función 'callback' para atender la señal "destroy" de la ventana. */
static void destruir(GtkWidget *widget, gpointer data);

Escribimos la función main

 /* Programa */
int main(int argc, char *argv[]) {
  /* GtkWidget almacena cualquier tipo de widget */
  GtkWidget* ventana;
  GtkWidget* contenedor;
  GtkWidget* boton;
  GtkWidget* entrada;
  /* configura el idioma del GTK para que se ajuste al idioma del usuario */
  gtk_set_locale();
  /* procesa línea de comandos e inicializa */
  gtk_init(&argc, &argv);
  /********************************* VENTANA *******************************/
  /* creo ventana principal */
  ventana = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  /* conecto la señal "delete_event" de la ventana a la callback
   * on_delete_event() */
  g_signal_connect(G_OBJECT(ventana), "delete_event",
  G_CALLBACK(on_delete_event), NULL);
  /* 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);
  /******************************** CONTENEDOR *****************************/
  /* creo un contenedor que divide horizontalmente para poner mis widgets
   * TRUE es para que todos los elementos sean de igual tamaño
   * 10 es para que deje 10 píxels entre los elementos */
  contenedor = gtk_hbox_new(TRUE, 10);
  /* agrega el contenedor a la ventana (que es un GtkContainer) */
  gtk_container_add(GTK_CONTAINER(ventana), contenedor);
  /**************************** ENTRADA DE TEXTO ***************************/
  /* creo una entrada de texto */
  entrada = gtk_entry_new();
  /* agrega la entrada de texto a la primera celda del contendor */
  gtk_container_add(GTK_CONTAINER(contenedor), entrada);
  /********************************** BOTON ********************************/
  /* creo un botón predefinido con un ícono de "Aceptar" */
  boton = gtk_button_new_from_stock("gtk-ok");
  /* conecto la señal "clicked" del botón a la callback on_boton_clicked()
  * y le envío el widget entrada como dato adicional */
  g_signal_connect(G_OBJECT(boton), "clicked", G_CALLBACK(on_boton_clicked),
  entrada);
  /* agrega el botón a la segunda celda del contendor */
  gtk_container_add(GTK_CONTAINER(contenedor), boton);
  /********************************* PROGRAMA ******************************/
  /* muestro la ventana y todos sus elementos */
  gtk_widget_show_all(ventana);
  /* comienza el loop de eventos */
  gtk_main();
  return 0;
}

Definimos los callbacks

static void on_boton_clicked(GtkWidget *widget, gpointer data) {
  /* convierto el dato adicional a un GtkEntry */
  GtkEntry* entrada = GTK_ENTRY(data);
  g_print("[recibido el evento clicked]\n");
  /* muestro el contenido de la entrada de texto */
  g_printf("Texto ingresado: %s\n", gtk_entry_get_text(entrada));
}

static gboolean on_delete_event(GtkWidget *widget, GdkEvent *event,
  gpointer data) {
  g_print ("[recibido el evento delete_event]\n");
  return FALSE;
}

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();
}