Introducción al entorno X y Motif

Esta página intenta servir de apoyo, dentro de su humildad, para los usuarios del laboratorio de CAD/CAM en su encuentro inicial con la programación en el entorno X y Motif. Una guía en lengua anglosajona, debida a David Marshall, puedes encontrarla aquí. Una lectura rápida de las primeras páginas de cualquiera de los manuales de O'Reilly disponibles en el laboratorio, nos descubrirá que el X viene a ser el estándar de bibliotecas de rutinas para la generación de interfaces dentro de la filosofía cliente-servidor; facilitando con ello la portabilidad de las aplicaciones a otra arquitectura que se acoja al estándar. Existen tres niveles de rutinas: el Xlib o nivel más básico, el Xtoolkit y el Motif. Al subir de nivel se simplifica la programación a cambio de restringirnos a que la apariencia de la aplicación final sea similar al resto de aplicaciones, es decir, al programar en Motif nuestros botoncitos tendrán siempre el aspecto rectangular en lugar de elíptico por poner otro ejemplo. Subiendo el nivel se encuentra menor homogeneidad entre todas las máquinas.

¿ Qué es X ?

X Window Systems, X Window o simplemente X es un sistema de ventanas orientado a red (network-based window system), independiente del hardware y del sistema operativo y considerado ampliamente como el estandar en este contexto.

X es un sistema extremadamente complejo, lo que en gran parte se debe a que debe correr sobre gran variedad de configuraciones hardware y software, así como de periferia de visualización. Existen implementaciones de X que se ejecutan sobre prácticamente cualquier máquina, desde PC's o Macintosh hasta Cray pasando por una amplia variedad de máquinas intermedias. X es ya hoy día un enlace entre máquinas muy dispares con S.O. muy diferentes.

Origen de X

Nació como un intento de interconexión en red de estaciones de trabajo gráficas muy diversas con diversos S.O. Proyecto Athena (1984) de MIT con DEC e IBM.

Solución: Diseño de un sistema de ventanas, basado en el entorno W de Stanford University, con un entorno gráfico soportado por red e independiente del hardware de las máquinas que lo soportaban.

En marzo de 1988 se liberó la versión 11 actualización 2 (X11 release 2). El mismo año, la actualización 3, en enero de 1990 la actualización 4, que supuso la explosión de su difusión, y en 1992, la actualización 5.

¿ Por qué el éxito de X ?

Componentes lógicos de X

Para que la ejecución de los programas no tenga de efectuarse en la misma máquina en la que se procede a la visualización, X se diseñó, como se ha dicho, como un protocolo de red, es decir, un conjunto de peticiones (request) y réplicas (replies) entre dos procesos. Esos procesos son el cliente (client) y el servidor (server).

Un cliente es un programa de usuario o aplicación. El servidor X actúa como intermediario entre los clientes y los recursos locales como teclado, pantalla o ratón. El servidor aisla a los clientes de las diferencias y especificidades que se presentan entre distinto hardware, manejadores de dispositivos (device drivers) o S.O.

Las tareas asignadas al servidor son:

    1) Gestión del acceso al display por múltiples clientes. 2) Interpretación de los mensajes de red o peticiones (requests) provenientes de los clientes y actuación en consecuencia. Algunos mensajes solictan al servidor la ejecución de tareas como, por ejemplo, mover una ventana. Otros simplemente solicitan información al servidor.

    3) Paso a los clientes de la información de entrada a través de mensajes de red denominados eventos (events) provenientes de presión de teclas, movimientos de ratón, etc. El servidor gestiona el paso adecuado de cada evento al cliente correspondiente.

    4) Mantenimiento de las estructuras de datos, ventanas y fuentes, a los que los clientes se refieren por números de identificación (ID numbers).

Otras Definiciones

Display: es sinónimo de servidor y se suele hablar del display server.

Pantalla (screen): es el hardware donde los datos gráficos se vuelcan. No es sinónimo de display. De hecho, un mismo servidor puede controlar múltiples pantallas.

Clientes: conjunto de programas que vuelcan datos en pantallas manejadas por el mismo servidor. Los clientes pueden correr en la misma máquina que el servidor o en otras distintas.

Protocolo X: protocolo de comunicación en red básico del entorno X. Corre encima de protocolos de red de bajo nivel que permiten comunicación bidireccional. Los ejemplos más comunes son TCP/IP y DECnet.

Window Manager: Es un cliente especial que gestiona las principales ventanas de aplicaciones en un display server. Su cometido es mediar en las demandas competitivas de los recursos físicos del display, como son espacio de pantalla, colores o teclado. Este cliente gestiona cosas como, el despazamiento de ventanas en la pantalla (screen), sus cambios de tamaño, el arranque de nuevas aplicaciones, el aspecto visual de las ventanas en cosas como si se permite su solapamiento o ocultamiento, etc.

Jerarquía del Software X

La figura muestra los diferentes niveles en los que es posible programar aplicaciones X. El nivel más bajo de interface con X en lenguaje C es Xlib, que permite el acceso a todas las posibilidades del protocolo X, pero la programación en este nivel no es de lo más amigable posible.

Xt se construye sobre Xlib. Xt es una capa orientada a objetos que soporta la abstracción de interface de usuario denominada widget.

Un widget es un trozo de código configurable y reutilizable que opera independientemente de la aplicación que lo usa, salvo las interacciones predefinidas. widget set es una colección de widgets que se corresponden con conmponentes de la interface de usuario con una apariencia concreta. Los widgets permiten aislar el código de aplicación del de la interface de usuario, y suministran elementos básicos de esta, listos para su uso como pueden ser, botones, barras deslizantes (scrollbars), etc.

En la figura, las zonas más oscuras corresponden a los niveles de X que son estandar del Consorcio X. Los widget sets no están disponibles en las distribuciones libres de X, sino que los suministran directamente, a un precio reducido, los vendedores de equipos.

El primer programa

Programar en X puede resultarnos duro en un principio, y por ello pienso que la mejor manera de irnos acostumbrándonos a él es acudir a ejemplos básicos que encontramos en la bibliografía. En el laboratorio encontrarás los siguientes manuales:

El primer manual que el principiante debe abordar

  • Mastering OSF/Motif Widgets.

    De O'Reilly & Associates, Inc.(reconocidos por la X de la portada)

  • Manual de Referencia de Xlib.

  • Manual de Programación de Xlib.

  • Manual de Referencia de Xtoolkit.

  • Manual de Programación de Xtoolkit.

    De Open Software Foundation

  • Manual de Referencia de OSF/Motif.

  • Manual de Programación de OSF/Motif.

  • Manual de Estilo de OSF/Motif.

    Con todas estas herramientas acudimos a por el primer programita, en los inicios es aconsejable ir identificando las similitudes en las estructuras de los distintos fuentes, en lugar de ir estudiando cada parámetro de cada rutina referenciada que aparece en el listado.

    Todos los fuentes de los ejemplillos los puedes encontrar en /u/home/alumnos /ejem, o bien recuperar desde estas páginas. Ejecutando ej1, cuyo fuente es ej1.c nos aparece una ventanita diminuta, a la que por otro lado podemos ampliar su tamaño como al resto de las del entorno.

    Un detalle importante es la compilación, como no es un comando sencillo de teclear se emplean scriptso ficheros makefile, con lo que se ahorra la tediosa tarea de teclear una y otra vez una larga cadena de comandos y opciones.

    En el listado descubrimos que han sido necesarias cinco llamadas para obtener la ventanita. Debe notarse que no todas comienzan de igual forma, si la llamada comienza por Xm es del nivel de Motif, si es por Xt de Xtoolkit, y po r último si empieza con X pertenece al nivel más básico.

  • Establecer la conexión al servidor.
  • Crear un form, nuestro primer widget.
  • Activamos el mismo.
  • Damos vida a nuestra aplicación.
  • El bucle infinito esperando eventos.

    Quizás el detalle más notorio es que toda aplicación termina entrando en un bucle infinito que espera por eventos o acciones que el usuario produce sobre la interface, es decir, picamos un botón otra ventana pasa por encima de la nuestra, etc.

    Otra novedad son los widgets, son objetos creados por defecto en Motif que probablemente satisfarán muchas de nuestras necesidades para una interface.

    Los atributos o recursos de los widgets (resources)

    Nuestro segundo ejemplo, ej2.c, nos ofrece

    De nuevo hemos creado una ventana, pero tiene algunas diferencias a la anterior, no podremos cambiarle su tamaño, el fondo es negro, aparece con unas dimensiones preestablecidas. Todos esos cambios los hemos provocado alterando los valores de los atributos del widget que existían por defecto, en el listado en contramos las llamadas a XtSetArg, que indican los valores de los atributos. (Para escoger el color se utiliza la rutina GetPixel tomada literalmente de la bibliografía).

    Nuevos widgets

    Los widgets tienen además de una apariencia predefinida un conjunto de atributos para tareas específicas. Por ejemplo las &aaacute;reas de dibujo (DrawingArea) están pensadas para trabajar sobre ellas suponiendo que vamos a pintar sobre ellas, se le atribuyen acciones para ello. El tercer ejemplo ej3.c, crea una de ellas, en color blanco.

    Aparecen las estructuras jerarquizadas y los conceptos de padre e hijo, así como los anclajes (attachment) cuando el padre es un form.

    Una aplicación sencilla

    Nuestro cuarto ejemplo ej4.c,

    supone un salto cualitativo, aparecen nuevos widgets como la barra de menú, el men&u descolgable, los botones, etc. Pero lo más importante es que ahora podemos interactuar con la ventana, escogiendo una opción dentro de la barra, podemos picando en el área de dibujo generar líneas, polígonos, ... A la zona de dibujo se le asocian acciones a llevara cabo ante determinados sucesos que ocurren mientras protagoniza el bucle infinito de espera, los widgets tienen eventos y callbacks asociados, se habilitan para el widget y cuando ocurre se invoca a la rutina especificada, por ejemplo un evento puede ser picar un botón del ratón dentro del área, nos interesan datos del evento, como el pixel donde ocurrió, y por eso lo identificamos como un evento. cuando no ocurre eso sino que lo que importa es solo la acción (picar un botón de menú) utilizamos un callback, aparecen dos en el ejemplo XmNactivateCallback para los botones del menú, y XmNexposeCallback que detecta si otra ventana se superpone a la nuestra, borrando consecuentemente la zona de dibujo.

    El ejemplos final, ej5.c, simplemente reduce código aglutinando rutinas que usamos repetidas veces (nuestro nivel personal por encima del Motif).

    Una altareción a dicho ejemplo es ej6.c, en el mismo se introduce el widget MainWindow que asume una cierta estructura que coincide con la de nuestra aplicación, es decir, barra de menú, zona de dibujo ...

    Podemos elaborar nuestro propio nivel superior

  • Creando botones (varios tipos)
  • Creando etiquetas
  • Creando un submenú de variados tipos.
  • Creando una ventana hija que nos permite movernos en el directorio de ficheros (fileselbox)
  • Creando un campo de Texto.
  • Creando una ventana hija que nos comunica un mensaje (MessageBox)
  • Creando una ventana hija que nos comunica un mensaje (MessageBox), y espera confirmación de acción.
  • Creando una lista con elementos y una acción asociada al caso de seleccionar uno de ellos.

    Comentarios, críticas, sugerencias y demás a modesto@dis.ulpgc.es

    The GIAS Group e-mail: modesto@dis.ulpgc.es