Número 4 · Julio-Septiembre 1995
NOTA: Pulsando sobre las fotos con borde azul ampliarás la imagen.
| LA LIBRERÍA |
 |
INTUITION |
 |
Comenzamos con este artículo una serie dedicada a profundizar en las entrañas de lo que, sin duda, es el corazón del interfaz gráfico del sistema operativo del Amiga.
Ventanas, pantallas, gadgets. menús, etc. son algunas de los objetos gráficos que podremos crear con ayuda de la librería Intuition y los ejemplos de programación de esta sección. |
¿Qué es Intuition?
Ya en el número cero de Amiga.InFo explicábamos brevemente qué era Intuition, sin embargo, ahora entraremos más en detalle para que podamos comprender más plenamente su funcionamiento.
Los que leyeron aquel artículo sabrán que Intuition es una de las librerías del sistema operativo del Amiga donde se engloban a todas las estructuras de datos, funciones y otros elementos necesarios para crear un Interfaz Gráfico para el usuario o GUI –del inglés Graphical User Interface–.
Este interfaz es capaz de facilitarnos en gran medida la comunicación con el ordenador recogiendo la información que nosotros aportamos a través de dispositivos como el teclado, el ratón, discos duros, disquetes, etc. Pero no sólo es capaz de recibir datos, sino que además controla cómo y cuando recibirlos y dónde enviarlos para su procesamiento. Si es necesario, muestra los datos a través de otro dispositivo, como puede ser el monitor o la impresora.
Actualmente, la mayoría de los sistemas operativos modernos poseen este tipo de interfaz gráfico. Todos intentan, con mayor o menor éxito, aplicar una filosofía que marque las pautas de la comunicación entre humanos y ordenadores. Desafortunadamente, cada fabricante sigue sus propias reglas a la hora de definir esta filosofía y como consecuencia, el usuario encuentra en el mercado diferentes sistemas operativos con GUI incompatibles entre sí.
Podría darse el caso de que alguno de nuestros lectores confunda el sistema operativo (SO) con Intuition, puesto que al formar parte del GUI, es la parte más visible y con la que estamos habituados a trabajar. Es importante saber que Intuition forma parte del So y del GUI, pero no es el SO ni tampoco el GUI.
Aunque maneje ventanas, pantallas, gadgets, menús, etc. existen otros elementos que forman otros elementos que forman el entorno gráfico. En la Tabla 1 mostramos donde encajan Intuition y el resto de elementos que forman el GUI.
Tareas del Intuition
Imaginaos cómo sería un entorno multitarea –el que utiliza el Amiga– si no existiese un control absoluto, consistente y seguro de las ventanas y pantallas que cada programa abre y utiliza al ser ejecutado. Sería un caos total.
Crear un entorno de trabajo utilizando un interfaz gráfico no es una tarea sencilla, pero si encima añadimos que varios programas pueden coexistir en memoria, compartiendo el mismo monitor, teclado, ratón, dispositivo de almacenamiento, etc, el asunto puede complicarse muchísimo.
Intuition existe para que la multitarea pueda ser presentada al usuario y programador de forma transparente. Gracias a él, las aplicaciones pueden coexistir y compartir los recursos del sistema utilizando para mostrar información un entorno gráfico consistente y amistoso.
Para los usuarios, Intuition resuelve los problemas de interactuar con varios programas simultáneamente, dividiendo la imagen presentada en el monitoren varias pantallas y ventanas que pueden solaparse en varios niveles, dando sensación de profundidad al entorno. Cada programa que ejecutamos puede tener su propia área de trabajo, que el usuario ve como una ventana o pantalla.
Para entrar en un área de trabajo de una aplicación determinada, únicamente nos tenemos que situar con el puntero del ratón sobre la ventana o pantalla de la aplicación y activarla pulsando el botón izquierdo. Podemos pasar de un programa a otro simplemente desplazando el puntero con el ratón; también podemos variar el tamaño de las ventanas, solapar una ventana encima de otra, pasar a otra pantalla, etc.
Cada movimiento del ratón, pulsación de una tecla u otro suceso similar, es inmediatamente detectado por Intuition para su procesamiento como suceso de entrada. Como consecuencia de estos sucesos, Intuition está constantemente enviando/recibiendo información a otros módulos del sistema operativo y a las aplicaciones en ejecución que puedan verse afectadas por alguno de esos sucesos.
Componentes de Intuition

Figura 1. |
Como programadores que somos, tendremos siempre en cuenta que si necesitamos usar alguna de las aproximadamente 100 funciones que Intuition pone a nuestro alcance, primero hay que abrir la librería –los pasos para abrir una librería se vieron ya en el número 2 de AInFo, por lo que no volveremos a explicarlo–.
Pero antes de comenzar a abrir la librería y llamar a sus funciones, tenemos que saber con qué nos estamos enfrentando. Intuition utiliza seis tipos de elementos principales para construir el GUI en el Amiga –podéis observarlos en la figura 1 y en la 2–.
1.Pantallas: Áreas de la imagen presentada en la pantalla del monitor que comparten los mismos atributos de vídeo, tales como la resolución y los colores. Tienen como mínimo la misma anchura que el área visible de la pantalla del monitor.
2.Ventanas: Área rectangular de una pantalla que permite introducir o mostrar información. Puede tener, por ejemplo, un tamaño variable y ser arrastrada a coordenadas diferentes dentro de la misma pantalla a la que pertenece.
3.Menús: Listas de opciones en pantalla que pueden ser seleccionadas con el ratón.

Figura 2. |
Sabías que...
El Amiga es el único ordenador personal del mundo que es capaz de mostrar simultáneamente en el mismo monitor varias pantallas con resoluciones y colores diferentes. No sólo el hardware está preparado para ello, con sus custom chips, sino que el sistema operativo aprovecha al máximo esta características para que las aplicaciones puedan coexistir simultáneamente en una misma pantalla, optimizando así la multitarea y el rendimiento del usuario. |
|
|
4.Gadgets: Imágenes gráficas que aparecen en ventanas, ventanas de petición o pantallas. Pueden ser activadas por el ratón para realizar funciones determinadas. Cada gadget tiene una función específica asignada y es de un tipo concreto dentro de la familia de gadgets.
5.Ventana de Petición (Requesters): Subventanas que aparecen para confirmar acciones, acceder a ficheros u otras opciones especiales.
6.Sucesos de Entrada: Un suceso se produce cuando existe algún tipo de entrada de datos como por ejemplo a través del teclado –pulsando una tecla–, ratón –pulsando sus botones o desplazándolo–, etc.
Ahora ya conocemos los objetos principales que maneja Intuition, podemos aventurarnos a programar un primer ejemplo: Abrir una ventana en la pantalla de nuestro Workbench.
Abriendo una ventana
Vamos a programar un sencillo ejemplo en C que abre una ventana –tal y como se muestra en la figura 3– en la que aparezcan botón de tamaño, profundidad, cierre y barra de arrastre.
El primer paso, por supuesto, es abrir la librería que contiene las funciones que utilizaremos de Intuition. De esta forma, el SO nos retorna un puntero –al que siempre llamaremos IntuitionBase por tratarse de esa misma librería–. En este puntero se almacena la dirección inicial a partir de la cual se encuentran las funciones de la librería.
Una vez abierta la librería, comprobamos si el puntero retornado es Nulo. Si es así, por algún motivo no se ha podido abrir la librería y es necesario abortar el programa. Esto puede ocurrir cuando el sistema tiene poca memoria disponible o cuando la versión de la librería es inferior a la que necesita –v37 en adelante– y por tanto, es incompatible.
En caso contrario, podemos continuar y ahora estaremos preparados para llamar a cualquier función de Intuition, como por ejemplo, "OpenWindowTags()".
Esta función sirve, tal y como su nombre indica, para abrir una ventana con unas características definidas por los "tags" o "etiquetas". Parámetros como tamaño de la ventana, coordenadas donde ha de abrirse, tipos de gadgets que se utilizarán, de qué sucesos tiene que estar pendiente Intuition y muchos más, forman los tags que iremos viendo a medida que los necesitemos.
Los nombres de estos tags no son inventados, si no que corresponde a los que Commodore indica en sus ficheros "include", más concretamente, en el fichero "intuition/intuition.h". En este fichero están definidos todos los nombres de los parámetros que se le pueden pasar a la función OpenWindowsTags() así como a otras funciones. Los parámetros se pasan por pares, es decir, el nombre del tag y su valor, tal y como se puede apreciar en el listado 1.
Inmediatamente después de ejecutarse la llamada, volvemos a comprobar que no se haya producido ningún error al abrir la ventana, y si es así, continuamos con nuestro programa.
En este primer ejemplo y para no complicar el fuente en la primera entrega de esta serie de artículos, nos limitaremos a programar la apertura de una ventana en la pantalla del Workbench, esperar unos segundos y cerrarla.
Podéis comprobar, una vez compiléis el ejemplo 1, que sólo funcionan los botones de tamaño, zoom y profundidad. El botón de cierre no funciona, y por mucho que se pulse, no se cierra la ventana. ¿Por qué? Esta pregunta es muy interesante, puesto que nos permite comentar la forma de trabajar que tiene Intuition a la hora de comunicarse con nuestros programas.
Hemos dicho que Intuition, al fin y al cabo, es una colección de funciones que permiten crear el entorno gráfico del Amiga. Hasta aquí parece como si fuera un módulo inactivo, al cual recurrimos para que nuestras aplicaciones puedan crear objetos gráficos tales como ventanas, pantallas y demás. Sin embargo, y esto es importante, también tenemos que imaginarnos a un Intuition activo y dinámico, que esta constantemente recibiendo información sobre los eventos o sucesos que se producen cuando el usuario interacciona con el interfaz gráfico.
Podéis imaginar a Intuition como un señor que recibe peticiones –crear y manejar ventanas, pantallas, menús, etc.– de sus clientes los programas. Este señor tiene una gran memoria donde va almacenando todas las peticiones que le llegan para poder después servirlas. Hay muchos tipos de peticiones, pero las más comunes son las que se le encargan para que cuando ocurra un determinado hecho, nos avise de alguna forma. En nuestro ejemplo de programación, hemos encargado a Intuition que nos abra una ventana de cierto tamaño y con unos gadgets determinados.
Este señor, siempre obediente y servicial, nos abrirá esa ventana y automáticamente, además, se encargará de actualizarla –es decir, refrescarla– en pantalla en caso de que modifiquemos su tamaño, arrastremos a otro lugar o cambiemos su nivel de profundidad.
Generalmente, este señor mantiene una lista de todos sus encargos, es decir, de las ventanas, pantalla y demás elementos que aparecen en su GUI. Cuando movemos el ratón o pulsamos sus botones, cuando pulsamos una tecla o se produce algún otro suceso interno, este señor comprueba si ese hecho afecta a alguno de sus encargos, y si es así, se lo comunica al cliente, mandándole un mensaje de aviso.

Figura 3. Resultado del
programa ejemplo no.1 |
LISTADO EJEMPLO
#include <stdio.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <clib/intuition_protos.h>
struct IntuitionBase *IntuitionBase;
struct Window *mi_ventana=NULL;
VOID main()
{
IntuitionBase = OpenLibrary("intuition.library",37);
if( IntuitionBase == NULL )
{
printf ("Error: No puedo abrir la librería Intuition.");
exit();
}
mi_ventana = OpenWindowTags (
NULL,
WA_Left, 50, /* Coordenada x inicio de la ventana */
WA_Top, 50, /* Coordenada y inicio de la ventana */
WA_Width, 400, /* 400 pixels de ancho */
WA_Height, 200, /* 200 pixels de alto */
WA_MinWidth, 80, /* Mínimo tamaño de anchura permitido */
WA_MinHeight, 80, /* Minimo tamaño de altura permitido */
WA_MaxWidth, -0, /* Máximo tamaño de anchura permitido (-0=sin maximo)*/
WA_MaxHeight, -0, /* Máximo tamaño de altura permitido */
WA_CloseGadget, TRUE, /* Botón de cierre */
WA_SizeGadget, TRUE, /* Botón de tamaño */
WA_DepthGadget, TRUE, /* Botón de profundidad */
WA_DragBar, TRUE, /* Barra de arrastre */
WA_Activate,TRUE, /* Activar al abrirse */
WA_NoCareRefresh, TRUE, /* No necesitamos refresco de la ventana */
WA_IDCMP, IDCMP_CLOSEWINDOW, /* Atiende al evento de cierre de ventana */
WA_Tittle,"AMIGA.InFo Ejemplo Intuition no. 1", /* Título de la ventana */
TAG_DONE);
/* siempre comprobamos el resultado de las llamadas a las funciones
para verificar que no existe error */
if (mi_ventana == NULL)
{
/* hay error */
printf ("Error: No puedo abrir la ventana .");
CloseLibrary( IntuitionBase );
exit();
}
/* no hay error */
/* esperamos unos segundos y cerramos automáticamente la ventana */
Delay( 50 * 30 );
CloseWindow( mi_ventana; /* OJO: es importante el orden de cierre */
CloseLibrary( IntuitionBase );
} |
|
 |
 |
 |
Volviendo a nuestro ejemplo, cuando abrimos la ventana y pulsamos el botón de cierre, Intuition recibe un aviso de este hecho y como buen encargado que es, nos envía un mensaje de aviso... pero, desafortunadamente, nosotros somos unos malos clientes porque le hemos hecho el encargo de abrir una ventana con un botón de cierre para que, cuando sea pulsado, nos avise, y sin embargo, hacemos caso omiso de él.
No, tranquilos, no es que nos hayamos descuidado de comunicarle a Intuition dónde debe dejar el aviso. Afortunadamente, el propio Intuition asigna a cada ventana que se abre una zona denominada puerto (debería llamarse buzón, ¿verdad?) donde se reciben mensajes de aviso. Pues bien, nuestro programa de ejemplo tiene su propia ventana y, por lo tanto, un puerto. A este puerto llegan los avisos de que el usuario está pulsando el botón de cierre que corresponde a la ventana que hemos abierto.
Sólo hace falta que nuestro programa se preocupe de mirar de vez en cuando en el puerto de la ventana, para ver si hay mensajes. Si es así, los podemos leer y actuar en consecuencia y, por ejemplo, cerrar la ventana llamando a la función CloseWIndow().
El método para leer los mensajes del puerto, así como los tipos de mensajes que podemos recibir de Intuition, será el tema principal del próximo artículo. En él añadiremos más código a nuestro ejemplo 1, para que se cierre la ventana al pulsar el correspondiente botón y también veremos cómo mostrar texto en la ventana.
|