GTK

GTK es una colección de gráfica de objetos, como botones, barras de desplazamiento, menús y las correspondientes llamadas a las funciones necesarias para implementarlos. Los objetos gráficos son conocidos como widgets, y la colección de objetos que componen a GTK+ es conocida como GTK+ widget set. Las correspondientes llamadas a las funciones crean un toolkit.

GTK es una colección de gráfica de objetos, como botones, barras de desplazamiento, menús y las correspondientes llamadas a las funciones necesarias para implementarlos. Los objetos gráficos son conocidos como widgets, y la colección de objetos que componen a GTK+ es conocida como GTK+ widget set. Las correspondientes llamadas a las funciones crean un toolkit.

GTK fue creado durante el desarrollo de GNU Image Manipulation Program (GIMP). GIMP es un programa muy popular desarrollado por Spencer Kimball y Peter Mattis para ambientes Linux y Unix.

GTK+ versión 1.26 contiene más de 60 widgets que se pueden usar para construir una interface gráfica de usuario (GUI). Varían desde simples botones hasta componentes más complicados, como ventanas con barras de desplazamiento, menús, etc.

Los Widgets tienen métodos asociados, que realizan acciones sobre ellos. Por ejemplo, si un widget es un botón, algunos métodos son llamados cuando el botón es apretado. Algunos métodos forman parte del widget, como el cambio de apariencia cuando el botón es seleccionado. Otros métodos son proporcionados por el programador, los cuales son conocidos como manejadores o handlers.

En GTK+, los tipos de widgets con conocidos como clases. Dichas clases definen la funcionalidad y los atributos de un widget. Por ejemplo, en GTK+ existen muchos tipos de botones, definidos por las widgets clases: GtkButton, GtkToggleButton, GtkCheckButton, GtkRadioButton y GtkSpinButton.

Una clase define los métodos por omisión que están asociados a los widgets que se están usando en una interface. Por ejemplo en un radio button o en un toggle button, podemos ver la apariencia del mismo al hacer click en ellos.

GTK+ es un toolkit orientado a objetos. La herencia en un diseño como éste tiene la idea de un árbol de clases. Las clases widget están definidas como hijos de otros clases widget, heredando las caracteristicas y funcionalidad de sus padres. Esto hace el trabajo de un programador mucho más fácil. Cuando se crea un nuevo widget, sólo se tiene que desarrollar el código para las nuevas características de un widget, permitiéndolo heredar características de las clases de las que hereda. Un ejemplo del árbol de las clases de GTK+ es el siguiente:

La clase GtkObject es la clase más alta en el árbol de GTK+. GtkObject define atributos y métodos disponibles en todas las clases en GTK+. No tiene el fin de ser un componente que tiene que existir en todas las aplicaciones, más bien es una clase base. Los dos hijos de la clase GtkObject son, GtkData y GtkWidget son también clases base. Dichas clases son clases que no representan componentes en una interface de usuario, únicamente son clases que definen funcionalidad, métodos y atributos que van a ser heredados por sus hijos.

GtkData es una clase base para los objetos cuyo fin es pasar información a nuestra aplicación, es decir, a nuestra interface de usuario. Por ejemplo, la clase GtkAdjustment representa el movimiento de barras de desplazamiento, escalas y otros widgets que permiten al programador poner todos los objetos de la interface de usuario juntos. La clase GtkAdjustment provee de todos los métodos que se necesitan para realizar dichas acciones.

Otro objeto de la clase GtkData es GtkTooltips, el cual nos provee de todos los métodos para desplegar mensajes cortos (tips) cuando el usuario se posiciona sobre algún widget en particular.

La última clase que se muestra en el árbol de clases de GTK+ es la clase GtkWidget. Ésta es la clase base para los widgets que hacen la interface de usuario. La clase GtkWidget tiene once hijos y es el padre de los más de 60 widgets previamente mencionados.

La siguiente figura muestra las 11 clases hijo de la clase GtkWidget:

GTK+ posee una característica, llamada temas (themes), lo cual es una manera fácil de cambiar la apariencia de los programas desarrollados en GTK+. Básicamente, un tema define los colores y patrones de los widgets durante sus diferentes estados (como normal, activado, desactivado, etc).

Para compilar un programa en GTK+ se tiene que teclear lo siguiente:

gcc -Wall -o archivo.out archivo.c `pkg-config --libs --cflags gtk+-2.0`

Revisión de las aplicaciones de GTK+

Cada aplicación de GTK+ crea un widget como parte de la interface gráfica de usuario. En el mundo de la programación orientada a objetos, lo anterior es llamado instanciar, o crear la instancia de una clase. Una clase define las capacidades, características y apariencia de un widget. Por ejemplo, la clase GtkButton describe a un objeto (un botón) que el usuario selecciona para realizar alguna acción, como salir de alguna aplicación. Para poder hacer que un botón aparezca en nuestra aplicación, debemos crear una instancia de la clase GtkButton.

Cada aplicación desarrollada en GTK puede ser representada por un árbol, el cual describe todos los widgets que fueron instanciados y que forman parte de la interface gráfica de usuario. Se establece una relación padre/hijo entre los widgets instanciados para definir el árbol. El widget padre va a controlar el comportamiento de los hijos en cierto grado. El grado de control va a depender del tipo de la clase del widget padre. Algunos widgets padre (como GtkBox o GtkTable) pueden controlar muchos aspectos del comportamiento de sus hijos, como su tamaño, posición y lo que hacen cuando cambia de tamaño el contenedor. Otros padres tienen un control menor sobre sus hijos, más allá de su visibilidad en la pantalla.

El árbol de instancias de los widgets contiene información jerárquica en relación con los widgets que forman parte de la interface de usuario. Dicho árbol normalmente contiene información del tipo y de los ancestros de los widgets.

Supongamos que creamos un programa con la siguiente interface de usuario, cuyo nombre es gtktest:

Como se puede ver, gtktest utiliza cinco widgets para crear la interface gráfica. Tradicionalmente, el widget que está en la posición más alta del árbol tiene el mismo nombre que el programa ejecutable. El texto "GTK+ is fun" es almacenado en un label widget. El botón de salida es también un widget. Inclusive la línea entre el texto y el botón es un widget. Los tres widgets anteriores son almacenados dentro de una caja vertical (vertical box widget), la cual está contenida dentro del widget gtktest.

Un widget no puede ser visto (desplegado a la pantalla) a menos que él y cualquiera de sus widgets ancestros directos sean declarados como vistos. En el caso de nuestro ejemplo, significa que la etiqueta "GTK+ is fun" no puede ser vista hasta que ambos, gtktest y el vertical box sean mostrados. De esta manera, si nosotros fijamos la visibilidad de gtktest como true, la aplicación completa se mostrará; de manera contraria, si fijamos la visibilidad como false, toda la aplicación "desaparecerá". Esto previene que los widgets hijos estén flotando en la pantalla sin su padre (en una calculadora, los botones no aparecen sin que antes haya aparecido la calculadora en sí).

A continuación entremos más a detalle en el árbol de instancias que compone nuestro programa de prueba.

El diagrama anterior es el mismo árbol que se vió anteriormente, pero con la adición de las clases widget de cada widget instanciado. El widget gtktest es un miembro de la clase GtkWindow. Un widget del tipo GtkWindow es usualmente el primer widget que se instancía en una aplicación y es normalmente conocido como top-level widget. La siguiente figura muestra la rama de GtkWindow del árbol de clases de GTK+:

La función primaria de un widget del tipo GtkWindow es proveer una comunicación entre la aplicación y el administrador de ventanas. Cuando el usuario cambia el tamaño de la ventana principal con el window manager, dicha información es pasada a GtkWindow.

Como se puede ver en la figura anterior, GtkWindow es descendiente de la clase GtkBin. La clase GtkBin restringe el número de hijos de los widgets de este tipo a uno solo. Así, cualquier clase descendiente heredará esta restricción. Por lo tanto, un widget del tipo GtkWindow sólo podrá tener un hijo.

El vertical box widget es descendiente de la clase GtkBox. La rama del árbol de GTK+ al cual pertenece, se muestra a continuación:

La clase GtkBox también es una clase base que define tamaño y atributos de espacio para las clases de cajas horizontales y verticales GtkVbox y GtkHBox. En los programa se necesitará instanciar ya sea un GtkVBox o un GtkHBox, dependiendo de la dirección en que se quieran extender a los widgets hijos.

El label widget pertenece a la clase GtkLabel. Una etiqueta es una clase simple. Ninguna acción está asociada a las etiquetas. Se puede especificar sólamente si el texto se va a desplegar centrado, alineado a la derecha o a la izquierda, además del tamaño y tipo de la letra.

Un separator widget es parte de la clase GtkSeparator. La clase GtkSeparator es también una clase base de las clases de separador horizontal y vertical GtkHSeparator y GtkVSeparator.

El widget exit es parte de la clase GtkButton. La clase GtkButton provee un widget que es capaz de realizar alguna acción definida por el usuario al hacer click en el. Cabe aclarar que GtkButton es descendiente de GtkBin, eso implica que sólo puede manejar un hijo, el cual es una etiqueta (label), es decir, la etiqueta del botón.

Los 7 pasos para la programación básica en GTK+

Una interface gráfica de usuario puede ser muy compleja, además de requerir muchas líneas de código para crearla. La creación de aplicaciónes con GTK+ usualmente puede dividirse en sieta pasos básicos; aunque si bien es cierto, muchos de estos pasos incluyen muchas llamadas a funciones o pueden llegar a ser complejos, después de entender cada uno de los siete pasos, se podrá llegar a tener un buen entendimiento de las aplicaciones desarrolladas en GTK+.

Los siete pasos a seguir son:

  1. Inicializar el ambiente
  2. Crear los widgets y fijar sus atributos
  3. Registrar las llamadas a las funciones
  4. Definir la jerarquía de las instancias del programa
  5. Mostrar los widgets
  6. Procesar las señales y los eventos
  7. Salir de la aplicación