guía de programación de aixwindows -...

158
AIX 5L Versión 5.1 Guía de programación de AIXwindows IBM

Upload: others

Post on 16-Mar-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

AIX 5L Versión 5.1

Guía de programación de AIXwindows

IBM

Page 2: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo
Page 3: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

AIX 5L Versión 5.1

Guía de programación de AIXwindows

IBM

Page 4: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Tercera edición (Abril 2001)

Antes de utilizar la información incluida en este manual, lea la información general de Avisos.

Esta edición se aplica al programa bajo licencia AIX 5.1 que se ejecuta en plataforma basada en POWER; oPlataforma basada en Itanium y a AIXwindows, así como a todos los releases posteriores de este producto hastaque se indique lo contrario en nuevas ediciones.

Al final de la publicación se proporciona una hoja de comentarios para el lector. Si no aparece el formulario, dirijasus comentarios a IBM S.A., National Language Solutions Center, Avda. Diagonal 571, Edif. L’Illa, 08029 Barcelona,España. Para enviar comentarios electrónicamente, utilice esta dirección comercial de Internet:[email protected]. Cualquier información suministrada a IBM se puede utilizar sin incurrir por ello en ningunaobligación con el remitente.

© Copyright International Business Machines Corporation 1997, 2001. Reservados todos los derechos.

Page 5: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Contenido

Acerca de este manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ixA quién va dirigido este manual . . . . . . . . . . . . . . . . . . . . . . . . . . . ixResaltado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ixISO 9000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ixPublicaciones relacionadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ixMarcas registradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix

Capítulo 1. Visión general de AIXwindows para programadores . . . . . . . . . . . . . . 1

Capítulo 2. Visión general del Gestor de ventanas de AIXwindows . . . . . . . . . . . . . 5Inicio y salida de X y del Gestor de ventanas de AIXwindows. . . . . . . . . . . . . . . . . 5Restauración del comportamiento por omisión . . . . . . . . . . . . . . . . . . . . . . 5

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows . . . . . . . . . 7Visión general de la utilización de la herramienta de personalización de AIXwindows . . . . . . . . 7

Introducción a la utilización de la Herramienta de personalización . . . . . . . . . . . . . . 7Información relacionada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Cómo iniciar la Herramienta de personalización . . . . . . . . . . . . . . . . . . . . . . 7Condiciones previas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Procedimiento básico de inicio . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Procedimiento detallado de inicio . . . . . . . . . . . . . . . . . . . . . . . . . . 8Información relacionada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Utilización de la ventana principal de la Herramienta de personalización. . . . . . . . . . . . . 9Clase de aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Botón Categoría del recurso . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Área de la ventana desplazable . . . . . . . . . . . . . . . . . . . . . . . . . . 9Menú desplegable Archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Menú desplegable Ver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Menú desplegable Opciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Menú desplegable Ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Información relacionada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Utilización de los navegadores . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Navegador de colores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13Navegador de fonts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13Navegador de imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Navegador de cursores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Navegador de opciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Navegador de nombres de archivos. . . . . . . . . . . . . . . . . . . . . . . . . 16Información relacionada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Los archivos app-custom. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17Ubicación de los archivos app-custom . . . . . . . . . . . . . . . . . . . . . . . . 17Formato de los archivos app-custom . . . . . . . . . . . . . . . . . . . . . . . . 17Directrices para escribir archivos app-custom . . . . . . . . . . . . . . . . . . . . . 20Información relacionada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Capítulo 4. Biblioteca Xlib de AIXwindows . . . . . . . . . . . . . . . . . . . . . . 23Introducción a Xlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Cómo compilar programas X con AIXwindows . . . . . . . . . . . . . . . . . . . . . 23Relaciones entre ventanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23Atributos de ventanas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Advertencias sobre las ventanas . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Lecturas recomendadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Utilización de las funciones de pantalla en AIXwindows . . . . . . . . . . . . . . . . . . 25

© Copyright IBM Corp. 1997, 2001 iii

Page 6: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Apertura de una pantalla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Shared Memory Transport (SMT). . . . . . . . . . . . . . . . . . . . . . . . . . 26

Planos de recubrimiento gráfico . . . . . . . . . . . . . . . . . . . . . . . . . . . 28GXT_OVERLAYS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Soporte de idiomas nacionales (NLS) de AIXwindows . . . . . . . . . . . . . . . . . . . 30Visión general. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Capítulo 5. Utilización de las extensiones en AIXwindows . . . . . . . . . . . . . . . . 33Funciones de extensión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

Funciones de extensiones básicas . . . . . . . . . . . . . . . . . . . . . . . . . 33Enlace con la biblioteca Xlib . . . . . . . . . . . . . . . . . . . . . . . . . . . 34Colocación en antememoria de Contexto gráfico (GC) . . . . . . . . . . . . . . . . . . 35Proceso por lotes de gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Bloqueo de estructuras de datos . . . . . . . . . . . . . . . . . . . . . . . . . . 36Definición de respuestas, peticiones y apéndices de extensiones . . . . . . . . . . . . . . 36Definición de formatos de peticiones . . . . . . . . . . . . . . . . . . . . . . . . 37Definición de formatos de respuesta . . . . . . . . . . . . . . . . . . . . . . . . 38Envío de argumentos y peticiones de protocolo . . . . . . . . . . . . . . . . . . . . 39Argumentos de longitud variable . . . . . . . . . . . . . . . . . . . . . . . . . . 40Llamada síncrona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Asignación y desasignación de memoria . . . . . . . . . . . . . . . . . . . . . . . 40Derivación del opcode de extensión correcto . . . . . . . . . . . . . . . . . . . . . 41

Extensiones del servidor X que se pueden cargar dinámicamente . . . . . . . . . . . . . . 41Extensión de forma de ventana no rectangular de AIXwindows. . . . . . . . . . . . . . . . 42

Descripción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Enlaces del lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Extensión de protector de pantalla de AIXwindows . . . . . . . . . . . . . . . . . . . . 45Presupuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Peticiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Sucesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48Tipos comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Peticiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49Sucesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50Convenios de comunicaciones entre clientes . . . . . . . . . . . . . . . . . . . . . 51Enlaces del lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Utilización de las funciones de dispositivo de entrada de AIXwindows . . . . . . . . . . . . . 53Captura del puntero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53Captura del teclado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55Reanudación del proceso de sucesos . . . . . . . . . . . . . . . . . . . . . . . . 55Movimiento del puntero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55Control del enfoque de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . 56Valores de teclado y de puntero . . . . . . . . . . . . . . . . . . . . . . . . . . 56Codificación del teclado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Biblioteca de extensión de entrada de AIXwindows . . . . . . . . . . . . . . . . . . . . 59Finalidad de la extensión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Enfoque del diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Dispositivos de entrada de la imagen de memoria . . . . . . . . . . . . . . . . . . . 59Dispositivos de entrada de extensión . . . . . . . . . . . . . . . . . . . . . . . . 59Clases de dispositivos de entrada . . . . . . . . . . . . . . . . . . . . . . . . . 60Utilización de los dispositivos de entrada de extensión . . . . . . . . . . . . . . . . . . 61Peticiones de extensión de biblioteca . . . . . . . . . . . . . . . . . . . . . . . . 61Funciones del Gestor de ventanas . . . . . . . . . . . . . . . . . . . . . . . . . 61

iv Guía de programación de AIXwindows

Page 7: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Funciones de sucesos y de manejo de sucesos . . . . . . . . . . . . . . . . . . . . 63Lista de dispositivos disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . 69Habilitación e inhabilitación de los dispositivos de extensión. . . . . . . . . . . . . . . . 69Cambio de la modalidad de un dispositivo . . . . . . . . . . . . . . . . . . . . . . 69Inicialización de evaluadores en un dispositivo de entrada . . . . . . . . . . . . . . . . 70Obtención de controles de dispositivos de entrada . . . . . . . . . . . . . . . . . . . 70Cambio de los controles de dispositivos de entrada . . . . . . . . . . . . . . . . . . . 70Selección de sucesos de dispositivos de extensión . . . . . . . . . . . . . . . . . . . 70Determinación de los sucesos de dispositivo seleccionados . . . . . . . . . . . . . . . . 70Control de la propagación de sucesos . . . . . . . . . . . . . . . . . . . . . . . . 70

Especificación del protocolo de extensión de entrada de AIXwindows . . . . . . . . . . . . . 71Enfoque del diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Dispositivos de entrada de la imagen de memoria . . . . . . . . . . . . . . . . . . . 71Dispositivos de entrada de extensión . . . . . . . . . . . . . . . . . . . . . . . . 72Obtención de la versión de la extensión . . . . . . . . . . . . . . . . . . . . . . . 73Lista de dispositivos disponibles . . . . . . . . . . . . . . . . . . . . . . . . . . 73Cambio de la modalidad de un dispositivo . . . . . . . . . . . . . . . . . . . . . . 73Inicialización de evaluadores en un dispositivo de entrada . . . . . . . . . . . . . . . . 73Obtención de controles de dispositivos de entrada . . . . . . . . . . . . . . . . . . . 74Sucesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Especificación de extensión de doble almacenamiento intermedio de AIXwindows . . . . . . . . 78Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Conceptos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79Peticiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82Codificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Enlaces del lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Extensión XTest de AIXwindows . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Visión general. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Descripción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Enlace Xlib del lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

Capítulo 6. Biblioteca de captura de pantalla de AIXwindows . . . . . . . . . . . . . . . 93Funciones de captura de pantalla . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Tipos de capturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Formatos de los datos devueltos . . . . . . . . . . . . . . . . . . . . . . . . . . 93Estructuras de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Funciones de E/S de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94Interfaz de programación en C . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Estructura de datos de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . 94Formatos de datos de salida . . . . . . . . . . . . . . . . . . . . . . . . . . . 94Asignación de almacenamiento para los formatos de datos devueltos . . . . . . . . . . . . 94Liberación de estructuras de datos asignadas . . . . . . . . . . . . . . . . . . . . . 95Normas básicas del almacenamiento de datos. . . . . . . . . . . . . . . . . . . . . 95

Rutinas de captura de pantalla . . . . . . . . . . . . . . . . . . . . . . . . . . . 95kgetwindow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95kgetregion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95kgetwindow_pseudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95kgetregion_pseudo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96kgetwindow_bestdepth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96kgetregion_bestdepth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97kgetwindow_8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97kgetregion_8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

Rutinas de E/S de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98Formatos de archivos de salida definidos en interface.h . . . . . . . . . . . . . . . . . 98

Contenido v

Page 8: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

kread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98kwrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Rutinas de programas de utilidad . . . . . . . . . . . . . . . . . . . . . . . . . . 99init_true_color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99rubberband . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99select_window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Archivos suministrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Capítulo 7. Mejoras de fonts de AIXwindows . . . . . . . . . . . . . . . . . . . . . 101Fonts de bitmap que cumplen el estándar ISO9241 . . . . . . . . . . . . . . . . . . . 101Dispositivo de barrido TrueType. . . . . . . . . . . . . . . . . . . . . . . . . . . 101

Codificaciones de fonts soportadas por el dispositivo de barrido TrueType . . . . . . . . . . 101

Apéndice A. Soporte bidireccional en la biblioteca Xm (Motif 1.2) . . . . . . . . . . . . . 103Nombre de biblioteca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Finalidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Recursos bidireccionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104El widget de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105El widget de campo de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105El widget de etiqueta y gadget . . . . . . . . . . . . . . . . . . . . . . . . . . . 105El widget de lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105Efecto de la dirección de diseño en los widgets y gadgets Motif . . . . . . . . . . . . . . . 105Ejemplo de cómo localizar una aplicación Motif para el soporte bidireccional . . . . . . . . . . 106

Definición del entorno nacional y cambio de la geometría . . . . . . . . . . . . . . . . 107Conversión de series codificadas de latino a hebreo o árabe . . . . . . . . . . . . . . . 107Conversión de archivos externos para texto BIDI . . . . . . . . . . . . . . . . . . . 108

Apéndice B. Programa de utilidad de fonts . . . . . . . . . . . . . . . . . . . . . 111Introducción al programa de utilidad de fonts . . . . . . . . . . . . . . . . . . . . . . 111Limitaciones del programa de utilidad de fonts . . . . . . . . . . . . . . . . . . . . . 112Cómo utilizar el programa de utilidad de fonts . . . . . . . . . . . . . . . . . . . . . 112

Condiciones previas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112Procedimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

Utilización de la ventana Font Utility . . . . . . . . . . . . . . . . . . . . . . . . . 114Barra de menús . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115Panel de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116Área de visualización de fonts . . . . . . . . . . . . . . . . . . . . . . . . . . 118Área de mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

Utilización de la ventana Reference Font . . . . . . . . . . . . . . . . . . . . . . . 119Utilización de la ventana Raster Editor . . . . . . . . . . . . . . . . . . . . . . . . 119

Barra de menús . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120Panel de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Área de edición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Área de mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Utilización de la ventana Vector Editor . . . . . . . . . . . . . . . . . . . . . . . . 124Barra de menús . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124Panel de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125Área de edición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127Área de mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

Apéndice C. Gestión de alimentación de la pantalla . . . . . . . . . . . . . . . . . . 129

Apéndice D. Puesta a punto de los dispositivos de entrada de gráficos X11 (teclas LPF, diales,tablero, Spaceball) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

vi Guía de programación de AIXwindows

Page 9: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Tablero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Diales y teclas LPF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Spaceball . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Apéndice E. El almacenamiento intermedio de tramas virtual X . . . . . . . . . . . . . 133Visión general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133Instalación de XVFB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

AIX 4.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133AIX 4.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134AIX 4.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134AIX 4.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134AIX 5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Inicio de XVFB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134Prueba de XVFB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Verificación del uso de XVFB . . . . . . . . . . . . . . . . . . . . . . . . . . 135Verificación del funcionamiento de XVFB . . . . . . . . . . . . . . . . . . . . . . 135

Implementación de XVFB en el código de aplicación . . . . . . . . . . . . . . . . . . . 136Trabajo con XVFB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137DirectSoft OpenGL y XVFB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137CATweb y XVFB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

Apéndice F. Avisos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

Contenido vii

Page 10: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

viii Guía de programación de AIXwindows

Page 11: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Acerca de este manual

Este manual contiene información acerca de las interfaces de usuarios desde el punto de vista de laprogramación.

A quién va dirigido este manualEste manual va dirigido a los usuarios que tengan experiencia en programación y estén interesados enpersonalizar su entorno personal de AIXwindows, así como a los programadores con experiencia en Cque diseñen interfaces de usuario para comunidades de usuarios.

ResaltadoEn este manual se utilizan los siguientes convenios de resaltado:

Negrita Identifica mandatos, subrutinas, palabras clave, archivos, estructuras, directorios y otros elementoscuyos nombres predefine el sistema. También identifica objetos gráficos como botones, etiquetas eiconos que selecciona el usuario.

Cursiva Identifica parámetros cuyos nombres o valores reales debe suministrar el usuario.Monoespaciado Identifica ejemplos de determinados valores de datos, ejemplos de texto parecido al que aparece,

ejemplos de partes de código de programa parecidas a las que escribiría un programador,mensajes del sistema o información que debe escribir el usuario.

ISO 9000En el desarrollo y la fabricación de este producto se han utilizado sistemas de calidad registrados quecumplen la norma ISO 9000.

Publicaciones relacionadasEl siguiente manual contiene información acerca de la programación de interfaces de usuario oinformación relacionada:

v The graPHIGS Programming Interface: Understanding Concepts (POWER-based System Only)

Marcas registradasLos siguientes términos son marcas registradas de International Business Machines Corporation enEstados Unidos y/o en otros países:

v AIX

v AIXwindows

v Common User Access

v CUA

v IBM

v Presentation Manager

v RS/6000

UNIX es una marca registrada de The Open Group en los Estados Unidos y/o en otros países.

Java y todas las marcas comerciales y logotipos basados en Java son marcas registradas de SunMicrosystems, Inc. en los Estados Unidos y/o en otros países.

© Copyright IBM Corp. 1997, 2001 ix

Page 12: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Otros nombres de empresas, productos o servicios pueden ser marcas registradas o marcas de serviciosde otras empresas.

x Guía de programación de AIXwindows

Page 13: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Capítulo 1. Visión general de AIXwindows paraprogramadores

Este manual describe AIXwindows, las mejoras de IBM a X-Windows y Motif.

El entorno AIXwindows es un entorno avanzado de interfaz gráfica de usuario que pueden utilizar unaamplia gama de usuarios finales y programadores de aplicaciones para crear interfaces gráficas deusuario, tanto en un sistema como en una red. El entorno ofrece un escritorio gráfico que oculta lascomplejidades a bajo nivel del sistema operativo. El entorno también da soporte a productos 2-D base y3-D.

Los productos 2-D básicos son X-Windows y Motif. Las interfaces de programación de aplicaciones (API)que dan soporte a 3-D son la Biblioteca de gráficos y API graPHIGS. Además, AIX Common DesktopEnvironment le permite organizar el trabajo en línea de un modo similar a como lo organizaría en elescritorio de su oficina.

Esta visión general es un resumen de las características de entorno AIXwindows, que abarcan:

v X-Windows (antes denominado Enhanced X-Windows), un sistema transparente de ventanas para lared que sirve para crear y gestionar ventanas en pantallas de bitmaps. Estas ventanas le permitenmostrar varios elementos de trabajo simultáneamente (le permiten trabajar de forma parecida a como lohace en el escritorio de una oficina). Gracias a su portabilidad y transparencia en la red, lasaplicaciones que se ejecutan en AIXwindows tienen el mismo aspecto para el usuario y el programadorno tiene que volver a escribirlas.

v Entorno Motif (antes denominado AIXwindows), un grupo de reglas generales y herramientas queespecifican el aspecto y funcionamiento general de las interfaces de usuario para sistemas gráficos.Estas especificaciones se centran en el diseño de los objetos que forman la interfaz de usuario: menús,botones, recuadros de diálogo, entradas de texto y áreas de visualización.

X-Windows consta de tres componentes: el servidor, los programas cliente y el canal de comunicaciones,tal como se muestra en la figura siguiente.

El servidor distribuye la entrada del usuario a los programas cliente y acepta peticiones de salidaprocedentes de estos (aplicaciones) situados en la misma máquina o en otro punto de la red. Estas

Figura 1. Componentes de X-Windows

© Copyright IBM Corp. 1997, 2001 1

Page 14: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

aplicaciones utilizan la biblioteca Xlib de lenguaje C de bajo nivel como interfaz con el sistema deventanas a través del canal de comunicaciones. Aunque el cliente suele funcionar en la misma máquinaque el servidor X con el que establece comunicación, es posible que en ciertas ocasiones no sea así.

La biblioteca Xlib es una capa en el servidor X y consiste en un conjunto de funciones que lasaplicaciones pueden llamar. Estas funciones manejan tareas como, por ejemplo, añadir un sistemaprincipal, abrir una pantalla, manipular ventanas, dibujar y manejar sucesos. Las llamadas Xlib seconvierten en peticiones de protocolo que se pasan al servidor local o a otro servidor a través de la red.

La aplicaciones son una capa de Xlib . Tanto los usuarios finales como los programadores de aplicacionespueden utilizar las aplicaciones que se ejecutan en Xlib . Estas aplicaciones pueden ser propiedad delusuario o puede proporcionarse con X-Windows. Los usuarios finales, tanto los principiantes como losexpertos, pueden utilizar los programas cliente que se suministran para ejecutar varios terminales, utilizaraccesorios del escritorio, definir preferencias de pantalla y de teclado, utilizar programas de utilidad defonts y de gráficos, imprimir aplicaciones y obtener información sobre ventanas y pantallas. Losprogramadores de aplicaciones pueden utilizar el kit de herramientas Motif que se proporciona para creary controlar interfaces de usuario.

Una aplicación Motif consiste en la biblioteca de intrínsecos de X y el grupo de widgets de Motif. Losintrínsecos de X son un conjunto básico de funciones que sirven para definir, crear, gestionar y destruircomponentes de la interfaz de usuario. Estos componentes de la interfaz de usuario se denominan″widgets″, y forman el conjunto de widgets. El grupo de widgets de Motif es una capa de los intrínsecosde X. Los distintos conjuntos de widgets pueden proporcionar distintas interfaces, pero todos ellos utilizanlos intrínsecos de X.

Mientras el kit de herramientas Motif proporciona las piezas necesarias para crear una interfaz, el gestorde ventanas le permite controlar la interfaz. El gestor de ventanas actúa como un programa de aplicación.Con el gestor de ventanas puede ejecutar otros programas de aplicación, moverlos en la pantalla, cambiarsu tamaño, etc.

X-Windows tiene estándares y convenios que se aplican a todos los sistemas con terminales de pantallade bitmaps. Esto permite a los programadores de aplicaciones dedicar más tiempo a mejorar susprogramas y menos a transportarlas a nuevas plataformas de interfaz de usuario. Se proporcionanestándares y convenios para el protocolo X, átomos, manual de convenios de comunicaciones entreclientes (ICCCM), protocolo de control del gestor de pantallas (XDMCP), descripciones lógicas de fonts(XLFD) y codificación de texto compuesto.

La Biblioteca de gráficos es un grupo de funciones de gráficos y programas de utilidad que proporcionansoporte de gráficos a alto y bajo nivel. La Biblioteca de gráficos se ha convertido en estándar de laindustria para el desarrollo de aplicaciones 3-D.

La interfaz de programación de aplicaciones de API graPHIGS (API), una implementación del estándarPHIGS y del estándar propuesto PHIGS PLUS, proporciona un conjunto de herramientas deprogramación, independientes de dispositivos, que permiten la portabilidad a través de numerosasplataformas de hardware. API graPHIGS ofrece más de 500 subrutinas de alto nivel que sirven paradefinir, modificar y consultar datos gráficos organizados jerárquicamente. Se incluyen posibilidadesavanzadas de representación, como líneas ocultas o resaltadas y eliminación de superficie oculta.

AIX Common Desktop Environment le da la capacidad de ejecutar varias aplicaciones al mismo tiempo enla pantalla. Tanto si es un usuario principiante o experto, el sistema visual de AIXwindows le ayudará agestionar su trabajo y a utilizar el sistema operativo para realizar diversas tareas.

El producto que elija debe depender de sus necesidades. Si desea enviar gráficos en 2-D por la red, debeutilizar X-Windows. Sin embargo, si desea enviar gráficos en 3-D por una red, debe utilizar la capacidadde proceso de aplicaciones distribuidas de la API graPHIGS.

2 Guía de programación de AIXwindows

Page 15: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Si trabaja en un sistema y no tiene que enviar información a través de una red, el método más rápidoconsiste en utilizar la Biblioteca de gráficos o API graPHIGS. Con estos productos, no tiene que pasar porel servidor y puede acceder directamente al adaptador. Aunque las aplicaciones de la Biblioteca degráficos suelen funcionar en modalidad inmediata y las aplicaciones que utilizan API graPHIGS hanutilizado tradicionalmente almacenamiento de estructura, ambos productos ofrecen la posibilidad devisualizar gráficos en modalidad retenida y no retenida, así como características avanzadas derepresentación.

Capítulo 1. Visión general de AIXwindows para programadores 3

Page 16: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

4 Guía de programación de AIXwindows

Page 17: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Capítulo 2. Visión general del Gestor de ventanas deAIXwindows

Inicio y salida d e X y del Gestor de ventanas de AIXwindowsDado que distintos sistemas informáticos tienen diferentes maneras de iniciar X y AIXwindows, debeconsultar con el administrador de sistemas para averiguar cómo debe iniciarlos. Normalmente, X y MWMse inician desde un script de shell que se ejecuta de forma automática cuando inicia una sesión. Sinembargo, es posible que tenga que iniciar X o MWM, o ambos.

Si inicia una sesión y encuentra que la pantalla funciona como una única terminal, y no aparecenventanas, puede iniciar X emitiendo el siguiente mandato:% xinit

Si este mandato no inicia X, consulte al administrador del sistema para asegurarse de que el directorioX11 que contiene programas ejecutables se encuentra en la vía de acceso de búsqueda. La vía deacceso correcta puede diferir entre un sistema y otro.

Si inicia una sesión y aparecen una o más ventanas sin marcos, puede iniciar MWM con el siguientemandato:% mwm &

Antes de especificar este mandato, asegúrese de que el puntero se encuentra en una ventana quecontiene un indicador del sistema.

Pulse la secuencia de teclas Control-Alt-Retroceso para salir de AIXwindows.

Nota: Antes de salir de AIXwindows, el procedimiento recomendado consiste en salir de losprogramas de aplicación y en detener los mandatos que se estén ejecutando en las ventanas determinal. De este modo se evita que se pierdan datos por detener incorrectamente un programa.

Cuando sale de un programa, el indicador de línea de mandatos vuelve a la ventana de terminal. Sinembargo, si inició el programa de forma automática o desde un menú, al salir también desaparece laventana de terminal. Si selecciona la opción Cerrar del menú de la ventana, se detiene de formainmediata cualquier programa que se esté ejecutando en la ventana. Si se interrumpe un programa deeste modo se pueden perder datos. Sin embargo, puede cerrar el reloj, el histograma de carga o unaventana de terminal ″desocupada″ (una que muestre un indicador de línea de mandatos) sin que sepierdan datos.

Restauración del comportamiento por omisiónDado que AIXwindows permite que los programadores que escriben aplicaciones de AIXwindows y losusuarios lo personalicen en gran medida, tal vez descubra que los botones del ratón u otras funciones nooperan como cabría esperar después de leer esta documentación. Puede restaurar el comportamiento poromisión del entorno AIXwindows pulsando las siguientes cuatro teclas simultáneamente:

Alt-Control-Despl-!

Puede volver a utilizar el comportamiento personalizado volviendo a pulsar dicha secuencia de teclas. Siel sistema no admite esta combinación de pulsaciones, puede restaurar el comportamiento por omisióndesde el menú raíz por omisión.

© Copyright IBM Corp. 1997, 2001 5

Page 18: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

6 Guía de programación de AIXwindows

Page 19: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Capítulo 3. Utilización de la Herramienta de personalizaciónde AIXwindows

La herramienta de personalización de AIXwindows ayuda a cambiar el aspecto de una aplicación. Ofreceun método simplificado para que pueda definir los valores de los recursos. Los recursos son elementosdiversos, como colores, fonts y otros atributos, que se pueden personalizar.

Visión general de la utilización de la herramienta de personalizaciónde AIXwindows

Para obtener más información sobre la herramienta de personalización, consulte:

v Introducción a la utilización de la Herramienta de personalización

v Cómo iniciar la Herramienta de personalización

v Utilización de la ventana principal de la Herramienta de personalización

v Utilización de los navegadores

v Qué son los archivos app-custom

Introducción a la utilización de la Herramienta de personalizaciónLa herramienta de personalización le ayuda a cambiar el aspecto de una aplicación. Ofrece un métodosencillo de definir valores de recursos. Los recursos le permiten personalizar una aplicación cliente. Cadaaplicación tiene su grupo de recursos exclusivo. Se han creado los archivos denominados app-custompara un grupo de aplicaciones muy utilizadas. Estos archivos contienen información en un formatoespecial que describe los recursos disponibles para la modificación de una aplicación y, en algunos casos,los posibles valores del recurso que puede seleccionar.

La herramienta de personalización tiene navegadores que le ayudan a escoger valores válidos para losrecursos. A menudo puede aplicar dichos valores a la aplicación, de modo que el usuario puede ver loscambios de forma inmediata, en lugar de tener que volver a iniciar la aplicación. Una vez termine demodificar el aspecto de la aplicación, puede guardar los cambios de forma permanente.

Información relacionadaVisión general de AIXwindows contiene información general sobre el entorno.

Utilización del Gestor de ventanas de AIXwindows le permite mover ventanas, cambiar su tamaño,convertirlas en iconos y crear ventanas nuevas.

Soporte bidireccional en la biblioteca Xm (Motif) proporciona una manera sencilla de crear interfacesgráficas de usuario en árabe/hebreo.

Cómo iniciar la Herramienta de personalización

Condiciones previasLa herramienta de personalización debe estar instalada para que la pueda iniciar. El mandato customestá instalado en el directorio /usr/bin/X11 .

Procedimiento básico de inicioPara iniciar la herramienta de personalización sin opciones, especifique lo siguiente:custom

© Copyright IBM Corp. 1997, 2001 7

Page 20: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

No se necesita ninguna opción de línea de mandatos. Si no se especifica ningún nombre de aplicación enla línea de mandatos, se le solicitará uno. Una vez que se visualice la ventana de inicio de la herramientade personalización, podrá utilizar uno de los tres métodos siguientes para elegir una aplicación:

v Pulse sobre la aplicación con el botón del ratón.

v Seleccione la aplicación en la lista de aplicaciones.

v Escriba el nombre de la aplicación en el campo de texto.

Una vez elegida una aplicación, aparece la ventana principal de la herramienta de personalización con losrecursos válidos para dicha aplicación.

Procedimiento detallado de inicioPara iniciar la herramienta de personalización utilizando una opción de línea de mandatos, utilice lasiguiente sintaxis:custom [-h | -e Navegador | [-s ArchivoRecurso] [Aplicación]]

Puede obtener ayuda desde la línea de mandatos mediante la opción -h.

La opción -e permite llamar a uno de los navegadores autónomos. Los valores válidos para el parámetroNavegador son color , font , cursor y picture .

Utilice la opción -s para especificar el archivo de recursos desde el que se cargarán y donde seguardarán los valores del recurso. Si no se especifica la opción -s, el valor por omisión consiste en cargarlos valores desde la base de datos de recursos almacenada en la propiedad RESOURCE_MANAGER delservidor X. Si esta base de datos no existe, se carga $HOME/.Xdefaults . Consulte el mandato customen el manual in AIX 5L Version 5.1 Commands Reference para obtener más información.

El mandato custom entiende la mayoría de opciones estándar de línea de mandatos de X Toolkit.Consulte la tabla del mandato custom que lista las opciones estándar de línea de mandatos.

Se puede especificar un nombre de aplicación en la línea de mandatos. Si no se especifica ningúnnombre de aplicación en la línea de mandatos, se le solicitará uno.

Cuando se ejecuta más de una instancia de una aplicación, todas ellas se actualizan inmediatamentecuando se modifica el valor de un recurso. Se produce el mismo comportamiento si guarda los cambios yvuelve a iniciar la aplicación.

La herramienta de personalización busca un archivo app-custom que describa los recursos que puedendefinirse para la aplicación que ha elegido. Si no hay ningún archivo app-custom correspondiente a laaplicación que está personalizando, se utiliza el archivo DEFAULTapp-custom . El archivo DEFAULTapp-custom proporciona un conjunto de recursos que se aplican a la mayoría de aplicaciones. Apareceun mensaje de error si no se encuentra el archivo DEFAULTapp-custom o si hay un error en el archivoapp-custom en sí.

Información relacionadaVisión general de la utilización de la herramienta de personalización de AIXwindows

Utilización de la ventana principal de la Herramienta de personalización

Utilización de los navegadores

Qué son los archivos app-custom

8 Guía de programación de AIXwindows

Page 21: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Utilización de la ventana principal de la Herramienta depersonalización

Esta herramienta de personalización, que se muestra en la siguiente ilustración, tiene una interfaz gráficade usuario que describe los recursos disponibles para la modificación de una aplicación determinada ysus posibles valores. Se suministran herramientas que le ayudarán a definir dichos valores. Cuandotermine de efectuar modificaciones, puede guardar los cambios, restaurar los valores por omisión, iniciaruna nueva sesión de personalización o salir de la herramienta de personalización.

Para obtener más información sobre la ventana principal de la herramienta de personalización, consulte:

v Clase de aplicación

v Botón Categoría del recurso

v Área desplazable de la ventana

v Menú desplegable Archivo

v Menú desplegable Ver

v Menú desplegable Opciones

v Menú desplegable Ayuda

Clase de aplicación

La clase de la aplicación que está personalizando (por ejemplo, XCalc) aparece en el área a la derechaque hay bajo la etiqueta ″Personalización″. La clase de aplicación está codificada dentro de la mismaaplicación y suele ser distinta del mandato que inicia la aplicación. Por convenio, la clase suele empezarpor una mayúscula.

Botón Categoría del recurso

Si pulsa y mantiene pulsado el botón izquierdo del ratón sobre el botón Categoría de recurso se muestrauna lista de categorías de recursos. Puede seleccionar una categoría arrastrando el ratón sobre la lista ysoltando el botón del ratón sobre la opción que desee. El panel que hay en el área de la ventanadesplazable cambia para presentar un nuevo grupo de recursos para personalizar.

Área de la ventana desplazable

La ventana desplazable contiene recursos que se pueden personalizar. Cada línea contiene unadescripción del recurso, un campo en el que puede especificar un valor para el recurso y, en algunoscasos, un botón que inicia una herramienta, denominada navegador, que le ayuda a seleccionar un valorválido.

A la izquierda del área de la ventana desplazable hay una descripción de cada recurso que puedepersonalizar. Para ver las series reales de recursos, seleccione la opción Recursos del menú desplegableVer.

A la derecha de las descripciones de recursos hay campos en los que puede especificar valores dedeterminados recursos. Para escribir en este campo, pulse el botón izquierdo del ratón sobre el campopara dirigir el enfoque del teclado sobre el mismo; luego, especifique el texto que desea.

Puede escribir directamente un valor en el campo de texto o, si aparece un botón a la derecha, puedepulsarlo para acceder al navegador que le ayudará a seleccionar un valor válido. El botón se resaltacuando se llama al navegador y dicho resaltado desaparece cuando se sale del navegador.

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows 9

Page 22: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Al modificar un recurso relacionado con un cursor, debe utilizar el navegador de cursores para elegir unvalor para un cursor, ya que no puede escribir directamente en el campo Valor elegido correspondiente alos cursores.

Cuando la etiqueta <-Número aparezca a la derecha del campo texto, sólo se pueden especificar númeroscomo valores válidos.

Para seleccionar un valor cuando exista la etiqueta <-Opción, pulse el botón situado a la izquierda yseleccione un valor de la lista que se muestra. El primer elemento de este menú es siempre <valor poromisión>, que permite que se utilice el valor por omisión de ese recurso y especifica que no se grabeningún valor en el archivo de recursos al guardar.

Menú desplegable Archivo

El elemento Archivo de la barra de menús tiene cuatro opciones:

Abrir Inicia la sesión de personalización correspondiente a una nueva aplicación. Aparece el diálogoinicial de la Herramienta de personalización. Puede seleccionar una aplicación y pulsar elbotón OK. Si decide no iniciar una nueva sesión, pulse el botón Cancelar .

Guardar Guarda los cambios efectuados en la base de datos actual de recursos. Suele ser el mismolugar desde el que se cargaron inicialmente los recursos para mostrar los valores actuales. Labase de datos de recursos actual se puede modificar utilizando la opción Guardar como. . . ,pero la mayoría de usuarios no necesitan modificarla.

La base de datos de recursos por omisión utilizada inicialmente para cargar y guardarrecursos es la primera de las siguientes:

1. El archivo especificado por la opción de línea de mandatos -s ResourceFile, si lo hay.

2. El archivo especificado por el recurso Custom*resourceFile , si lo hay.

3. La base de datos de recursos del servidor X, si existe.

4. De lo contrario, el archivo $HOME/.Xdefaults .

La base de datos de recursos del servidor X suele crearse mediante el mandato xrdb y sealmacena en la propiedad RESOURCE_MANAGER de la ventana raíz, en la pantalla inicial.

Al modificar una base de datos de recursos existente, sólo se sustituyen o se suprimen lasespecificaciones de recursos que coinciden exactamente con las definidas en el archivoapp-custom correspondiente a la aplicación. Los comentarios y otros valores se dejan sinmodificar.

Guardar como... Le permite guardar los cambios en la ubicación que especifique.

Cuando se ha utilizado la opción Guardar como. . . , la opción Guardar seguirá guardando enla nueva ubicación. Para la mayoría de usuarios no es necesario especificar una base dedatos de recursos distinta, por lo que utilizar la opción Guardar es suficiente.

Puede especificar que los valores se guarden en la base de datos de recursos almacenada enel servidor X o en un archivo. La base de datos de recursos del servidor X suele crearsemediante el mandato xrdb y está almacenada en la propiedad RESOURCE_MANAGER de laventana raíz en la pantalla inicial.

Restaurar valores Borra todos los valores seleccionados y utiliza los valores leídos de la base de datos derecursos al principio de la sesión de personalización. Puede cancelar esta operación. Si ya haguardado los valores anteriores, debe guardar de nuevo después de restaurar para borrardichos valores y aceptar los valores de la operación restaurar.

Salir Sale del editor de la herramienta de personalización. Si ha hecho modificaciones pero no lasha guardado, se le solicita que las guarde y le permite cancelar la operación de salida o salir.

10 Guía de programación de AIXwindows

Page 23: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Menú desplegable Ver

El elemento Ver de la barra de menús contiene dos opciones: Recursos y Cambios inmediatos .Siselecciona la opción Recursos , se modifican las etiquetas de atributos a fin de mostrar los nombresreales de los recursos. Para volver a las series descriptivas, seleccione de nuevo la opción Recursos .

El botón de conmutación Cambios inmediatos controla la actualización inmediata de los recursos de lasaplicaciones. Anteriormente, las aplicaciones en ejecución se tenían que volver a iniciar para que seaplicaran los cambios en los valores de sus recursos. Con la herramienta de personalización, se puedenactualizar muchos recursos de forma inmediata cuando se modifica un valor. Si escribe un valordirectamente en el campo de texto del recurso, debe pulsar la tecla Intro para actualizar la aplicacióncliente .

El botón Cambios inmediatos está desactivado (inhibido) hasta que la herramienta de personalizaciónpuede comunicarse con la aplicación. Cuando se establece la comunicación, puede utilizar el botónCambios inmediatos como botón de conmutación para activar o desactivar la actualización inmediata. Elestado por omisión de este botón es activado. Si en cualquier momento sale de todas las instancias de laaplicación después del arranque, el botón se vuelve a desactivar.

La opción Cambios inmediatos está concebida como una herramienta para ver los posibles cambios.Puesto que es posible dañar la interfaz de una aplicación (por ejemplo, definiendo un font que no sepuede leer), es mejor utilizar esta opción únicamente cuando la aplicación no se encuentra en un estadocrítico. Hay algunas limitaciones, como las siguientes, al actualizar aplicaciones de forma inmediata:

v El botón Cambios inmediatos está desactivado hasta que se establece la comunicación con laaplicación. El recurso Custom*timeout controla la cantidad de tiempo a esperar antes de que laaplicación contacte con la herramienta de personalización.

v Pueden producirse resultados imprevistos si intenta personalizar una aplicación mientras se estáiniciando. Es mejor esperar a que la aplicación esté completamente iniciada para personalizarla.

v Para ver la actualización inmediata, el cliente que usted está personalizando se debe estar ejecutandoen una máquina que tenga instalada la herramienta de personalización. Esto se debe a que labiblioteca compartida libXt.a contiene una mejora de la herramienta de personalización.

v Algunas aplicaciones utilizan llamadas libX11.a de bajo nivel que la herramienta de personalización nopuede actualizar inmediatamente (por ejemplo, los mandatos aixterm y mwm ).

v Además, algunas aplicaciones pueden tener valores en su código que hagan que la actualizacióninmediata no entre en vigor cuando se vuelva a iniciar la aplicación. También puede saltarse laprotección que definió el programador de la aplicación, con lo que podría dañar involuntariamente lainterfaz.

v Es posible que un objeto de la interfaz no adquiera un tamaño correcto después de aplicarse loscambios inmediatos. Esto puede suceder especialmente con los fonts.

v La herramienta de personalización prologa el recurso con la clase de aplicación. Puede que el valor delrecurso no entre en vigor porque se haya definido un recurso más específico en la herramienta depersonalización, en el archivo .Xdefaults , en la base de datos de recursos del servidor X o en elarchivo app-defaults de la aplicación. Si elimina estos recursos o los define de forma menosespecífica, se pueden aplicar los cambios de la herramienta de personalización.

El botón Cambios inmediatos se desactiva si la herramienta de personalización no puede actualizar laaplicación. Si no puede actualizar una aplicación de forma inmediata, siempre puede guardar los cambiosen el archivo de recursos y volver a iniciar la aplicación para que los cambios entren en vigor.

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows 11

Page 24: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Menú desplegable Opciones

El elemento Opciones de la barra de menús tiene la siguiente opción.

Readquirir cambiosinmediatos

La opción Readquirir cambios inmediatos le permite volver a establecercomunicación con una aplicación a fin de actualizarla de forma inmediata. Esto leresultará útil si no se estaba ejecutando la aplicación cuando inició la herramienta depersonalización o si volvió a iniciar la aplicación.

Menú desplegable Ayuda

El elemento Ayuda de la barra de menús tiene las tres opciones siguientes.

Recurso de ayuda Muestra el recurso de ayuda a nivel de introducción.

El recurso de ayuda contiene una ventana Mensaje de ayuda para ver los mensajes deayuda y un índice para poder navegar por el recurso. El índice es jerárquico. Si seleccionaun elemento del índice, aparece el mensaje de ayuda correspondiente en la ventana deAyuda. Si el elemento de índice tiene mensajes de ayuda adicionales, al seleccionar dichoelemento el índice desciende al siguiente nivel. Para volver al nivel anterior, pulse el botónRetroceder .

El botón En contexto proporciona acceso a la ayuda según el contexto. Consulte lasiguiente descripción de la opción En contexto .

El recurso de ayuda puede permanecer activo durante toda la sesión de personalización.Para salir del recurso de ayuda, pulse el botón Cancelar .

En contexto El cursor del ratón pasa a ser un signo de interrogación, que le solicita que pulse sobre unobjeto que le interese. Se muestran el índice y los mensajes de ayuda correspondientes adicho objeto en el recurso de ayuda.

En ayuda Abre el recurso de ayuda y muestra el mensaje de ayuda que describe cómo utilizar elrecurso.

Información relacionadaVisión general de la utilización de la Herramienta de personalización de AIXwindows

Utilización de los navegadores

Qué son los archivos app-custom

Cómo iniciar la Herramienta de personalización

Utilización de los navegadores

La herramienta de personalización ofrece útiles navegadores que le ayudarán a cambiar los valores de losrecursos. Los navegadores más útiles también pueden iniciarse como aplicaciones autónomas. Esto leresultará útil si, por ejemplo, desea localizar un color determinado pero no desea realmente personalizaruna aplicación.

Los siguientes navegadores se pueden iniciar como navegadores autónomos:

v Navegador de colores

v Navegador de fonts

v Navegador de imágenes

v Navegador de cursores

12 Guía de programación de AIXwindows

Page 25: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

El resto de las herramientas no están disponibles en modalidad autónoma:

v Navegador de opciones

v Navegador de nombres de archivos

Navegador de colores

El Navegador de colores le ayuda a seleccionar valores de colores válidos. La lista de colores delNavegador de colores permite seleccionar nombres de colores del archivo /usr/lib/X11/rgb.txt . Si elservidor X no utiliza el archivo /usr/lib/X11/rgb.txt , es preciso definir el recurso Custom*rgbtxtPath conla vía de acceso del archivo rgb.txt alternativo. De lo contrario, se producirá el siguiente error siselecciona un color no contenido en el archivo rgb.txt que utiliza el servidor X:El nombre del color no existe en /usr/lib/X11/rgb.txt

Cuando se selecciona un color válido de la lista, la ventana situada justo debajo de la lista muestra elcolor elegido, los graduadores RGB se definen con el valor RGB del color elegido y el campo de textoColor elegido se define con el nombre de color.

También se pueden definir colores utilizando los graduadores RGB (Red, Green, Blue), lo que le permitedefinir de forma más precisa la selección del color. Si mueve una barra de los graduadores, la ventanaque hay sobre los graduadores refleja el color definido por los valores de los graduadores RGB. El campoColor elegido se define con la representación RGB del color, que empieza con un signo # y va seguidode la representación hexadecimal de los valores de rojo, verde y azul, respectivamente (por ejemplo,#8456c8).

Después de colocar los graduadores RGB en el color que desee, puede pulsar el botón Hacer coincidirRGB con Nombre de color más aproximado . Busca el nombre de color más parecido al valor RGB dela lista de colores, resalta el nombre del color en la lista y vuelve a colocar los graduadores RGB enconsecuencia. El campo Color elegido se define en el valor de dicho color.

Cuando se pulsa el botón Seleccionar color en pantalla con el ratón , el cursor del ratón cambia deforma, solicitándose que seleccione cualquier color que se visualice pulsando el botón izquierdo del ratón.El Navegador de colores busca los valores RGB correspondientes a dicho color, vuelve a colocar lasbarras de los graduadores y resalta el nombre del color en la lista de colores en el caso de que coincidacon un nombre de color válido.

Puede pulsar el botón OK cuando haya terminado y desee guardar sus elecciones de color, o puedepulsar el botón Cancelar si desea salir del Navegador de colores sin guardar. Puede llamar al recurso deayuda del Navegador de colores pulsando el botón Ayuda . Para salir del recurso de ayuda, pulse el botónCancelar .

Navegador de fonts

El Navegador de fonts le ayuda a seleccionar valores de fonts. Los fonts de la lista describen los fontsdisponibles en el servidor X del sistema. Hay seis filtros que reducen las opciones de fonts de la lista. Sepuede determinar una familia, peso, inclinación, estilo, espaciado o tamaño determinados. Todos estosfiltros ofrecen la opción Todos , que lista todos los elementos de dicha categoría.

Algunos de los valores que aparecen en estos filtros no se pueden aplicar a los fonts disponibles en susistema X. Si selecciona un valor de una de estas listas de filtros que no se aplica a ninguno de los fontsdisponibles, el navegador muestra una lista vacía de fonts y el siguiente mensaje:0 fonts coinciden con los filtros especificados.

Esto puede suceder si la vía de acceso a fonts del servidor X no incluye las vías de acceso a los fontsadicionales instalados en el sistema. Puede añadir vías de acceso a fonts con el siguiente mandato:

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows 13

Page 26: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

xset +fp

Al seleccionar valores para los filtros, la lista se renueva para mostrar sólo los fonts que cumplen con losvalores seleccionados.

Cuando se selecciona un font de la lista de fonts, se muestra en el campo Font elegido. La seleccióntambién queda reflejada en el campo Ejemplo.

El filtro de tamaño le permite especificar el tamaño en puntos de un font, seleccionando un tamaño de lalista o escribiendo un tamaño en el campo texto debajo de la lista y pulsando la tecla Intro. La listacontiene todos los tamaños de fonts de mapas de bits que se hayan instalado en su servidor X. Además,es posible que el servidor X tenga fonts escalables. Son fonts especialmente diseñados para que sepuedan representar en cualquier tamaño que especifique. Para ver una lista de los fonts escalablesdisponibles, escriba un tamaño en el campo de texto situado bajo el filtro Tamaño que no aparezca en lalista y pulse la tecla Intro. Aparece una lista de fonts escalables, escalados al tamaño especificado. Siselecciona un tamaño en la lista de tamaños o si especifica un tamaño que también aparece en la lista,los fonts escalables se incluyen con los fonts de mapas de bits en la lista de fonts.

El botón de conmutación que hay justo encima del campo Font elegido le permite especificar que lacodificación del juego de caracteres que se debe utilizar está determinada por el entorno nacional en vigorcuando se ejecute la aplicación que se está personalizando. Este campo no constituye un filtro. Controlasi el font elegido está escrito en un modo independiente del idioma con la notación *: sustituyendo aljuego de caracteres. La notación *: resulta de gran importancia si su idioma necesita varios fonts. Notodas las aplicaciones dan soporte a la notación *:, pero todas las aplicaciones AIXwindows sí lo hacen.Consulte la ilustración del Navegador de fonts para ver un ejemplo.

Pulse el botón OK para guardar el valor en el campo de texto del recurso. Pulse el botón Cancelar parasalir del navegador sin guardar el valor. Se proporciona ayuda para el Navegador de fonts. Para salir delrecurso de ayuda, pulse el botón OK.

Fonts ISO 9241.3Puede utilizar el Navegador de fonts como ayuda para elegir fonts que cumplan con los requisitos delestándar ISO 9241, parte 3. Este estándar define líneas generales en cuanto a ergonomía relacionadascon los fonts para que resulten fáciles de leer.

Para que esta característica del Navegador de fonts funcione correctamente, primero debe informar alservidor X de las dimensiones físicas de la pantalla. Sólo tiene que seguir este paso del procedimiento deconfiguración una vez. Para definir el tamaño físico de la pantalla, utilice una regla para medir la anchuray la altura del área de imagen de la pantalla en milímetros (mm). Mida sólo el área de la pantalla querealmente se utiliza. Luego inicie una sesión como usuario con privilegios de superusuario y especifique elsiguiente mandato:

smit chdispsz

Seleccione el nombre de la pantalla que utiliza en la lista que aparece. Especifique la anchura y la alturaen los campos que aparecen y pulse la tecla Intro para efectuar los cambios. Finalmente, salga de todaslas aplicaciones que se estén ejecutando en el sistema y cierre y vuelva a iniciar el sistema utilizando elsiguiente mandato:

shutdown -Fr

Cuando se vuelve a iniciar el sistema, la pantalla está configurada con el nuevo tamaño que hayadefinido.

Elección de los fonts ISO 9241.3Los fonts que se han diseñado especialmente para cumplir el estándar ISO 9241.3 tienen iso9241 comocampo ADD_STYLE_NAME de sus nombres XLFD. Puede listar dichos fonts utilizando el Navegador de fontsde la herramienta de personalización, seleccionando el filtro de estilo ISO 9241.3.

14 Guía de programación de AIXwindows

Page 27: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Sin embargo, puede que un font que cumpla con el estándar en una pantalla no resulte adecuado en otrapantalla. Por ejemplo, un font que se ve perfectamente en una pantalla puede resultar demasiadopequeño para leer en una pantalla que tenga una resolución más alta.

Después de seleccionar un font de la lista, examine el mensaje que aparece bajo el ejemplo. Si loscaracteres del font son lo suficientemente grandes como para que se puedan ver correctamente en lapantalla que está utilizando, aparece el siguiente mensaje:Cuando se utiliza en esta pantalla,este font cumple conlos requisitos del estándar ISO 9241.3.

Nota: El estándar ISO 9241.3 define líneas generales sobre tecnología de pantalla de hardware, asícomo sobre el diseño de los fonts. La Herramienta de personalización no puede detectar si lapantalla que se utiliza cumple con las características necesarias. Consulte la documentación queviene con la pantalla para ver si cumple con los requisitos del estándar ISO 9241.3.

Navegador de imágenes

El navegador de imágenes le permite seleccionar y ver bitmaps y pixmaps. Para examinar las imágenesse proporciona el recuadro de selección Filtro, en el que el nombre de vía de acceso se define como/usr/lpp/X11/bitmaps/* . Utilice el Navegador de imágenes para cambiar directorios, ver archivos yseleccionar un archivo que contenga un bitmap o pixmap válido. Puede ver el bitmap o pixmap pulsandoel botón Ver imágen de la ventana del Navegador de imágenes.

Puede editar el bitmap o pixmap pulsando el botón Editar imagen de la ventana Navegador de imágenes.El editor constituye una aplicación separada instalada en el sistema. Se le llama en su nombre. El recursoCustom*pictureEditor*editor determina entre qué mandatos de editor puede escoger. Este recursoacepta una lista de mandatos separados por \n (barra inclinada invertida y n). Se utiliza el primer mandatoque identifica un programa existente sobre el que el usuario tiene permiso de ejecución. El nombre dearchivo del campo de texto Imagen elegida se pasa como parámetro al editor, cuando éste se invoca. Elvalor por omisión de este recurso es:Custom*pictureEditor*editor:/usr/dt/bin/dticon -f \n\/usr/lib/X11/bitmap

Nota: El editor por omisión, /usr/dt/bin/dticon , sólo existe si está instalado Common DesktopEnvironment (CDE). Puede editar tanto bitmaps (imágenes monocromas) como pixmaps (imágenesa color). El mandato dticon acepta bitmaps almacenados en formato X Pixmap Versión 2 Enhanced(XPM2), utilizado por la aplicación X Desktop (xdt ) enviada con AIXwindows Versión 1.2.5, o XPixmap Versión 3 (XPM3), un nuevo formato que cumple XPG3 y utilizado por CDE. Sin embargo,las imágenes pixmap tienen que almacenarse en formato XPM3. CDE tiene herramientasdocumentadas que pueden utilizarse para convertir pixmaps del formato XPM2 al formato XPM3.

El mandato /usr/bin/X11/bitmap es un programa de ejemplo no soportado que acepta bitmaps en losformatos XPM2 o XPM3. No da soporte a la edición de pixmap. Asegúrese de que el archivo app-defaultsde bitmaps se ha instalado en el directorio /usr/lib/X11/app-defaults antes de invocar el mandato bitmap .Si no es así, emita los siguientes mandatos del directorio /usr/lpp/X11/Xamples/clients/bitmap :

xmkmf;

make install

Aparecen mensajes de error sobre el campo de texto Imagen elegida. Suele aparecer un mensajeinformativo que indica el tipo de imagen (pixmap o bitmap) y su tamaño.

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows 15

Page 28: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Pulse el botón OK para guardar el valor en el campo de texto del recurso. Pulse el botón Filtro paraconmutar el sistema de archivos. Pulse el botón Cancelar si desea salir sin guardar los cambios. Disponede ayuda para este editor.

Navegador de cursores

El Navegador de cursores muestra una lista gráfica de cursores en la que puede efectuar una selección.Las aplicaciones utilizan el font de cursor para la imagen que aparece sobre el cursor del ratón. Losnombres de fonts de cursores y los índices se encuentran en el archivo /usr/include/X11/cursorfont.h .Puede seleccionar un cursor de la lista con el botón del ratón para que aparezca en el campo Cursorelegido. Puede pulsar el botón OK para grabar el valor en el campo de texto del recurso. Pulse el botónCancelar para salir del editor sin guardar el valor. Se proporciona ayuda para el editor de cursores.

Navegador de opcionesPuede seleccionar varios elementos de la lista del Navegador de opciones. Luego estos elementos seunen y aparecen en el campo Elementos elegidos tal como aparecen cuando se guardan en la base dedatos de recursos. Por ejemplo, si los elementos de la lista están traducidos al francés, el valor queaparece en la parte inferior sigue mostrando la especificación en inglés. Pulse el botón OK para guardarel valor en el campo de texto del recurso. Pulse el botón Cancelar para salir del navegador sin guardar elvalor. Dispone de ayuda para el Navegador de opciones.

Navegador de nombres de archivos

El Navegador de nombres de archivos sirve para cambiar directorios, ver archivos y seleccionar archivos.

El campo de texto Filtro permite visualizar y editar un filtro de directorios que se utiliza para seleccionarlos archivos que se van a visualizar. El filtro de directorios debe ser una serie que especifique el directoriobase que se va a examinar y un patrón de búsqueda.

El campo Directorios muestra los subdirectorios del directorio base, el propio directorio base y sudirectorio padre. Para cambiar directorios, efectúe una doble pulsación sobre un elemento de la lista.

El campo Archivos muestra todos los archivos del directorio base que coinciden con el patrón debúsqueda.

El campo Nombre de archivo elegido contiene la selección actual de nombre de archivo. Se actualizacada vez que el usuario selecciona un nombre de archivo en la lista del campo Archivos

Si pulsa el botón Filtro , se filtra la lista del campo Archivos para mostrar todos los archivos ysubdirectorios del directorio base que coinciden con el patrón de búsqueda.

Pulse el botón OK para guardar el valor en el campo de texto del recurso. Pulse el botón Cancelar parasalir del editor sin guardar el valor. Se proporciona ayuda para el Navegador de nombres de archivos.

Información relacionadaVisión general de la utilización de la Herramienta de personalización de AIXwindows

Utilización de la ventana principal de la Herramienta de personalización

Qué son los archivos app-custom

Cómo iniciar la Herramienta de personalización

16 Guía de programación de AIXwindows

Page 29: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Los archivos app-custom

Los recursos que es importante personalizar se deben listar en un archivo app-custom . El archivoapp-custom contiene toda la información necesaria para generar una interfaz de la herramienta depersonalización exclusiva para cada aplicación. Para obtener más información, consulte:

v Ubicación de los archivos app-custom

v Formato de los archivos app-custom

v Directrices para escribir archivos app-custom

Ubicación de los archivos app-custom

La herramienta de personalización utiliza la clase de aplicación para nombrar los archivos app-custom .Las aplicaciones tienen dos nombres: su nombre de aplicación, que suele ser el nombre que se utilizapara iniciar la aplicación, y su clase de aplicación, que está codificada de forma permanente en laaplicación.

Por omisión, la herramienta de personalización busca el archivo app-custom en los siguientes lugares, enel orden indicado en la lista. Se utiliza el primer archivo que se encuentra. ($HOME es el directorio inicialdel usuario. Entorno es el entorno en el que se ejecuta custom . Clase es la clase de la aplicación que seva a personalizar.)

1. $HOME/Entorno/app-custom/ Clase

2. $HOME/app-custom/ Clase

3. /usr/lib/X11/ Entorno/app-custom/ Clase

4. /usr/lib/X11/app-custom/ Clase

5. $HOME/Entorno /app-custom/DEFAULT

6. $HOME/app-custom/DEFAULT

7. /usr/lib/X11/ Entorno /app-custom/DEFAULT

8. /usr/lib/X11/app-custom/DEFAULT

El lugar en el que la herramienta de personalización busca el archivo app-custom puede modificarseespecificando el recurso Custom.appCustomPath .

Formato de los archivos app-custom

Cada línea del archivo de descripción de paneles de recursos tiene el siguiente formato:Grupo Tipo RecursoDescripción [Valores];

A continuación se explican estos parámetros:

Grupo Se utilizan grupos para organizar recursos parecidos. Por ejemplo, el color de la barra dedesplazamiento, la activación/desactivación de la barra de desplazamiento y el número delíneas desplazadas a guardar son tres tipos de recursos, pero todos ellos están relacionados.El parámetro Grupo puede ser cualquier serie de caracteres en el idioma que desee. Si utilizamás de una palabra para el grupo o si contiene alguna serie de caracteres de doble byte, debeir entre comillas. Existe una limitación máxima de 20 grupos. Los grupos aparecen listados enel botón Categoría del recurso de la ventana principal de la Herramienta de personalización.

Tipo El parámetro Tipo especifica si los valores posibles de un recurso deben estar limitados acolores, fonts o a otros tipos. La herramienta de personalización ofrece herramientas gráficasque le ayudan a definir un valor válido para el tipo de recurso. El tipo de un recurso debe seruno de los tipos predefinidos de la herramienta de personalización.

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows 17

Page 30: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Recurso Es la serie real del recurso (por ejemplo, *background ). La serie completa del recurso debeaparecer listada igual que lo estaría en una base de datos de recursos; no puede ir precedidadel nombre o la clase de la aplicación y debe empezar con un * (asterisco) o un . (punto). Estoes necesario porque la herramienta de personalización adjunta la clase de la aplicación alprincipio de cada serie de recurso antes de grabar la serie en la base de datos de recursos.

El mandato custom también acepta la siguiente sintaxis, destinada a recursos específicos declientes del Gestor de ventanas:

$MWM%%Recurso

donde cada % es un * (asterisco) o un . (punto).

La herramienta de personalización intenta determinar si se está ejecutando un gestor deventanas compatible con el gestor de ventanas mwm. Si es así, sustituye el nombre o clasedel gestor de ventanas por $MWM e inserta el nombre de clase de la aplicación entre los **(asteriscos), .. (puntos), *. (asterisco, punto) o .* (punto, asterisco), representados por %% enel ejemplo anterior.

Si la herramienta de personalización no detecta que se está ejecutando un gestor de ventanasque esté definido como compatible con mwm, todas las sentencias de descripción de recursosque contienen $MWM.

Por ejemplo, si aparece $MWM**clientDecoration en el archivo app-custom para XClock y elgestor de ventanas dtwm se está ejecutando, la herramienta de personalización ampliará estasintaxis a:

Dtwm*XClock*clientDecoration

Si el gestor de ventanas mwm se está ejecutando, esta sintaxis se ampliará a:

mwm*XClock*clientDecoration

Si no se está ejecutando ningún gestor de ventanas compatible con mwm , se pasa por alto lasentencia entera (desde el nombre de Grupo hasta el signo ; (punto y coma)), y este recursono se mostrará en la interfaz de usuario.

Descripción Es una explicación descriptiva de cada recurso que puede personalizar. Esta serie se elige demodo que represente el recurso en el panel. Puede ser cualquier texto descriptivo, pero debeser breve porque en la interfaz personalizada el espacio está limitado.

Aunque la serie del recurso debe estar en inglés, la descripción puede estar en cualquieridioma, lo que implica que los archivos app-custom específicos del idioma son archivostraducidos que están codificados en el entorno nacional actual durante la ejecución. Tambiénhay que poner entre comillas las series de caracteres de doble byte.

Los caracteres \n se reconocen en las series de descripción como caracteres de línea nueva ypueden utilizarse para dividir la descripción en varias líneas.

Valores Algunos tipos de datos necesitan datos adicionales a partir de los cuales crear la interfaz.

A continuación se proporciona una descripción más detallada de la sintaxis de archivo app-custom detipos de datos individuales:

v Los tipos de datos de color, font, cursor, nombre de archivo, número y serie utilizan la siguientesintaxis:Grupo Tipo Recurso Descripción;

A continuación hay un ejemplo de la sintaxis del archivo app-custom de un recurso de color:"Barra de menús" Color *menubar*background "fondo de la barra de menús";

v Se puede especificar un tipo de datos de imagen en el archivo app-custom siguiendo la siguientesintaxis:Grupo Recurso imagen Descripción TipoImagen;

18 Guía de programación de AIXwindows

Page 31: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

A continuación hay un ejemplo de sintaxis del archivo app-custom :Icon Picture *appIcon "icono de la aplicación" bitmap;

El valor TipoImagen puede ser uno de los siguientes: bitmap , pixmap o all . Si se define bitmap , sólose pueden examinar bitmaps; pixmap funciona de forma similar. Sin embargo, si se define todos , sepueden examinar tanto bitmaps como pixmaps.

Los bitmaps son imágenes en blanco y negro en que los nombres de archivo terminan en .bm or .xbm ;los pixmaps son imágenes en colores cuyas extensiones de archivo son .pm o .px .

v El tipo de datos selectmany permite seleccionar muchos valores de una lista de opciones. Está limitadoa 20 elementos. Puede especificar un grupo de datos selectmany en el archivo app-custom siguiendoesta sintaxis:Grupo SelectMany Recurso Descripción

"Separador" Elem1 [= Serie] Elem2 [= Serie]... ;

El parámetro Separador especifica uno o más caracteres que se utilizan para separar cada uno de loselementos que el usuario ha seleccionado cuando la definición del recurso se graba en el archivo.Xdefaults . A continuación hay un ejemplo de sintaxis del archivo app-custom :Foods SelectMany *iceCream "Selección de helado"

" " vanilla chocolate strawberry ;

Si desea ver más nombres descriptivos para las opciones, puede enlazar una serie a cada valor con un= (signo igual). Esto resulta especialmente útil cuando se traducen los valores a otros idiomas:

A continuación se muestra un ejemplo:Foods SelectMany *iceCream "Selección de helado"

", "vanilla = "Sabor vainilla"chocolate = Fudgestrawberry ;

v El tipo selectone es un tipo de datos genérico para seleccionar un valor de una lista de opciones. Estálimitado a 20 elementos. Puede especificar un tipo de datos selectone en el archivo app-customsiguiendo la siguiente sintaxis:Grupo SelectOne Recurso Descripción

Elem1 [= Serie] Elem2 [= Serie]... ;

A continuación hay un ejemplo de sintaxis del archivo app-custom :Foods SelectOne iceCream "Selección de helado"

vanilla chocolate strawberry ;

El tipo de datos selectone está representado por un botón de menú Opción para conmutar entre losvalores. La primera opción siempre es <valor por omisión>. Esto resulta coherente con los otros tiposde datos puesto que no se graba ningún valor en la base de datos de recursos a no ser que elija unode forma específica.

Puede seleccionar un elemento pulsando el botón Opción , arrastrando el ratón sobre la lista y soltandoel botón sobre la opción que elija.

Si desea ver más nombres descriptivos para las opciones, puede enlazar una serie a cada valor con un= (signo igual). Esto resulta especialmente útil cuando se traducen los valores a otros idiomas.

A continuación se muestra un ejemplo:Foods SelectOne *iceCream "Selección de helado"

vanilla = "Sabor vainilla"chocolate = Fudgestrawberry ;

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows 19

Page 32: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

v Los comentarios deben comenzar con un signo ! (exclamación) como primer carácter de la línea.

A continuación se muestra un ejemplo breve de un archivo app-custom :! Archivo app-custom de XClockSize Number *width "anchura de reloj";Size Number *height "altura de reloj";Color Color *foreground "primer plano";Color Color *hands "manecillas analógicas";Color Color *highlight "resaltar en las manecillas analógicas";Color SelectOne *reverseVideo "contraste invertido"

true false;Font Font *font "font de reloj digital";Behavior Number *update "intervalo de actualizaciones/n (seg)";Behavior SelectOne *analog "tipo de reloj"

true = analog false = digital;Behavior SelectOne *chime "sonar cada media hora"

true false;Behavior Number *padding "relleno interno (pixels)";

Directrices para escribir archivos app-custom

Éstas son las directrices para escribir archivos app-custom :

v Creación de archivos app-custom

v Organización de categorías de recursos

v Elección de recursos

Creación de archivos app-custom

Si ya tiene recursos en el archivo .Xdefaults para una aplicación, puede cargar los valores de recurso enla interfaz de la herramienta de personalización, eliminar los recursos antiguos del archivo .Xdefaults yutilizar la herramienta de personalización para personalizar la aplicación en el futuro.

Si el archivo app-custom no contiene todas las series de recursos que necesita, puede crear unsubdirectorio con el nombre app-custom en el directorio $HOME, copiar en él el archivo app-custom deldirectorio /usr/lib/X11/app-custom y añadir a este archivo las series de recursos que necesita. Para crearun nuevo archivo app-custom , copie el archivo DEFAULT app-custom y utilícelo como modelo.

Si desea crear un archivo app-custom nuevo, debe añadir el archivo app-custom y el nombre deaplicación al recurso Custom.listOfApps . Este recurso sirve para ver los nombres de aplicaciones en eldiálogo de inicio. El nombre de la aplicación y el archivo app-custom correspondiente deben estarlistados por parejas con la siguiente sintaxis:Aplicación:app-custom,

Por ejemplo:Custom.listOfApps:xclock:XClock,custom:Custom,msmit:Msmit

Puede especificar un máximo de 100 aplicaciones.

Organización de categorías de recursos

Agrupe los recursos en las siguientes categorías recomendadas:

v Colores

v Fonts

v Tamaño y ubicación

v Icono

20 Guía de programación de AIXwindows

Page 33: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

v Gráficos

v Comportamientos

Si los recursos de la aplicación no pertenecen a ninguna de estas categorías, puede crear categoríasadicionales. Las nuevas categorías pueden añadir después de las otras. Puede crear una nueva categoríasi alguna de las categorías estándar contiene demasiados recursos (más de 15 ó 20). La nueva categoríase tiene que añadir después de aquella cuyo límite se ha excedido.

Elección de recursos

A continuación se presentan algunas directrices generales para seleccionar los recursos que se listaránen los archivos app-custom :

v Los recursos de cada categoría deben ser los recursos que el programador de la aplicación hayadecidido que se utilizan con frecuencia o aquellos que resulta importante personalizar.

v No liste el mismo recurso más de una vez en un determinado archivo app-custom . Ello podría producirresultados inesperados.

v Aunque se pueden definir colores y fonts en cada objeto o grupo de objetos, intente definirlos unavez.Por ejemplo, *background define un color para el fondo de la aplicación.

v Debe añadir un * (asterisco) al nombre de los recursos cliente del gestor de ventanas. Este convenioindica al usuario que se tiene que volver a iniciar el gestor de ventanas para que los cambiosefectuados en dichos recursos entren en vigor. Por ejemplo,

$MWM**clientDecoration "decoración cliente *"

v Las series de recursos no se deben prefijar con el nombre o clase de la aplicación, puesto que laherramienta de personalización ya añade el nombre de clase a la serie del recurso cuando la guardaen el archivo de recursos.

v Las descripciones de los recursos no deben tener más de entre 20 y 30 caracteres de longitud. Si senecesitan descripciones más largas, se puede utilizar el carácter \n (nueva línea) para dividir ladescripción en varias líneas.

v El número máximo de bytes de cualquier serie entre comillas es de 500.

Una vez creado el archivo app-custom , puede comprobar la sintaxis ejecutando la herramienta depersonalización.

Información relacionadaVisión general de la utilización de la Herramienta de personalización de AIXwindows

Utilización de la ventana principal de la Herramienta de personalización

Utilización de los navegadores

Cómo iniciar la Herramienta de personalización

El mandato xset

Capítulo 3. Utilización de la Herramienta de personalización de AIXwindows 21

Page 34: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

22 Guía de programación de AIXwindows

Page 35: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Capítulo 4. Biblioteca Xlib de AIXwindows

Las siguientes secciones principales describen la biblioteca Xlib y sus funciones:

v Introducción a Xlib de AIXwindows

v Utilización de pantallas

v Planos de recubrimiento gráfico

v Visión general del Soporte de idiomas nacionales (NLS)

Introducción a XlibCuando los usuarios especifican entradas en un terminal, un servidor X distribuye dichas entradas a losprogramas cliente que se encuentran en el mismo sistema o en otra parte de la red. El servidor Xdevuelve a continuación las acciones solicitadas, como por ejemplo renovar la pantalla o iniciar unaaplicación. La interfaz de ventanas es coherente en las distintas plataformas y permanece así porque labiblioteca Xlib controla las llamadas al sistema. La biblioteca Xlib es una biblioteca con funciones delenguaje C que los programas cliente utilizan para comunicarse con el sistema de ventanas. Las llamadasal cliente se envían a través de la biblioteca Xlib y la información devuelta vuelve a pasar por la bibliotecaXlib , la cual convierte la información a un lenguaje X-Window estándar.

Como programador, el programa de aplicación que cree actúa como cliente en una relacióncliente-servidor; el usuario escribe el programa y el servidor X le otorga independencia de hardware. Hayun servidor X para cada terminal virtual que ejecute AIXwindows.

Una ventana es un área rectangular de la pantalla que muestra salida gráfica. Las aplicaciones clientepueden mostrar ventanas solapadas o anidadas en una o más pantallas dirigidas por los servidores X enuno o más sistemas. Puede haber una o más pantallas físicas, cada una de las cuales contenga variasventanas. (El término pantalla se refiere al monitor físico, que puede ser en color o en blanco y negro, y alhardware asociado.)

Cómo compilar programas X con AIXwindowsSe puede utilizar el siguiente mandato del compilador para crear un programa:cc {Opciones del compilador} -oEjemplo Ejemplo.c -lX11

En este ejemplo, Ejemplo.c es el nombre del programa fuente en lenguaje C, Ejemplo es el nombre delprograma C ejecutable y -lX11 indica la biblioteca de funciones /usr/lib/libX11.a ). -l es el distintivo y X11indica la biblioteca.

Las definiciones del compilador de estructuras, parámetros, códigos de errores y tipos de datos seencuentran en los archivos /usr/include/X11/Xlib.h y /usr/include/X11/X.h .Debe incluir estos archivos encualquier programa que utilice estas funciones. Para incluir estos archivos, especifique la siguientesentencia al principio del programa:#include <X11/Xlib.h> /* también incluye X11/X.h */

Relaciones entre ventanasLas ventanas del servidor X están organizadas según una estricta jerarquía. Al principio de la jerarquía seencuentra la ventana raíz, que cubre por completo la pantalla. La ventana raíz está parcial ocompletamente cubierta por ventanas hijo de nivel inferior. La ventana raíz es padre de las ventanas hijo,y todas las ventanas, excepto la raíz, tienen padres. Las ventanas hijo pueden, a su vez, tener suspropios hijos, lo que permite que un programa de aplicación cree un árbol organizativo en la pantalla.Suele haber al menos una ventana por aplicación.

© Copyright IBM Corp. 1997, 2001 23

Page 36: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Una ventana hijo puede ser mayor que su padre, y parte de la ventana hijo, o toda ella, se puedeextender más allá de los límites del padre. Sin embargo, si se mueve la ventana hijo fuera del padre,aquella se recorta; la única parte visible de la ventana es la que está dentro de los límites del padre.

Si varias ventanas hijo de una ventana están solapadas, se considera que una de las ventanas hijo estáen la parte superior (o elevada) con respecto a las demás, y las oscurece. No aparece la salida de lasáreas cubiertas por otras ventanas; el sistema de ventanas la suprime.

Atributos de ventanasUna ventana tiene un borde que puede ser cualquier trama o color uniforme. Una ventana suele tener unatrama de fondo que el sistema de ventanas vuelve a pintar cuando la ventana no está cubierta. (Parallevar un seguimiento de los objetos contenidos, cada ventana tiene su propio sistema de coordinación.)Las ventanas hijo oscurecen a sus padres, a no ser que no tengan color de fondo. Las operacionesgráficas en la ventana padre suelen quedar ocultas por las ventanas hijo.

Las entradas toman el formato de sucesos. Los sucesos pueden ser efectos secundarios de un mandato(por ejemplo, al volver a apilar ventanas se generan sucesos de exposición) o pueden ser completamenteasíncronos (entradas de teclado). AIXwindows no envía nunca sucesos que una aplicación cliente no hayasolicitado; la aplicación cliente debe solicitar que se le informe de los sucesos.

AIXwindows no admite ninguna responsabilidad sobre el contenido de las ventanas. Cuando parte de unaventana (o toda ella) se oculta y luego se vuelve a mostrar en pantalla, es posible que se haya perdido sucontenido. Se notifica al programa cliente, mediante un suceso de exposición, que se tiene que volver apintar parte de la ventana, o toda ella. Los programas deben estar preparados para volver a generar elcontenido de ventanas cuando se les solicite.

AIXwindows ofrece almacenamiento fuera de la pantalla de objetos gráficos, denominados pixmaps. Almantener los gráficos fuera de la pantalla, el sistema puede volver a dibujar ventanas con más rapidez,puesto que la información de las mismas sigue en memoria. Los pixmaps de un solo plano (profundidad1) reciben a veces el nombre de bitmaps. Se puede utilizar bitmaps en la mayoría de funciones gráficasque se intercambien entre ventanas y se utilicen en varias operaciones gráficas para definir tramas,también denominadas mosaicos. (A la combinación de ventanas y pixmaps se le denomina drawables.)

Advertencias sobre las ventanasLa mayoría de las funciones de la biblioteca Xlib sólo añaden peticiones a un almacenamiento intermediode salida. Estas peticiones se ejecutan más tarde (y de forma asíncrona) en el servidor X. Las funcionesque intentan devolver valores almacenados en el servidor X no vuelven; quedan bloqueadas hasta que elservidor X envía una respuesta explícita o hasta que se produce un error. Si una llamada de no bloqueoda error, el manejador opcional de errores no suele informar sobre el error hasta que se efectúa unallamada de bloqueo posterior.

Si AIXwindows no procesa una petición de forma asíncrona, un cliente puede seguir la petición con unallamada a la función XSync . La función XSync se bloquea hasta que se envían o se efectúa una acciónsobre todos los sucesos asíncronos anteriormente colocados en el almacenamiento intermedio. Unallamada a cualquier función que devuelve un valor o que espera una entrada (por ejemplo, las funcionesXPending , XNextEvent , XWindowEvent , XFlush o XSynchronize ) siempre borra el almacenamientointermedio de salida.

Muchas funciones Xlib devuelven un ID entero de recurso que le permite hacer referencia a objetosalmacenados en el servidor X . Estos objetos pueden ser del tipo Window , Font , Pixmap , Bitmap ,Cursor y GContext , según como estén definidos en el archivo <X11/X.h>. (La sentencia #include delcompilador C define < >, que es un archivo relativo a un directorio conocido. En el sistema operativo AIX,este directorio es /usr/include .)

24 Guía de programación de AIXwindows

Page 37: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Algunas funciones devuelven un Estado, que es una indicación entera de error. Si la función falla, elEstado es 0 (cero). Un estado de 0 indica que la función no ha actualizado los parámetros devueltos.Puesto que el lenguaje C no ofrece valores de retorno múltiples, muchas funciones tienen que devolversus resultados grabándolos en el almacenamiento que pasa el cliente. Un puntero que se utiliza paradevolver un valor se designa con el sufijo Return como parte de su nombre. Todos los demás punterosque se pasen a estas funciones se utilizan como sólo lectura. Por omisión, los errores se manejanmediante una función estándar de biblioteca o mediante una función de biblioteca que suministre elusuario. Las funciones que devuelven punteros a series devuelven punteros NULOS si la serie no existe.

Los sucesos de entrada (por ejemplo, los sucesos de pulsación de teclas o los sucesos de actividad delratón) llegan de forma asíncrona procedentes del servidor y se colocan en cola hasta que una llamada alas funciones XNextEvent o XWindowEvent los solicite. Además, algunas funciones de biblioteca (comolas funciones XResizeWindow y XRaiseWindow ) generan sucesos de exposición o solicitan que sevuelvan a pintar partes de ventanas que no tienen un contenido válido. Estos sucesos también llegan deforma asíncrona, pero el cliente los espera efectuando una llamada explícita a la función XSync despuésde llamar a una función que genera sucesos de exposición.

Lecturas recomendadasVisión general de AIXwindows proporciona una introducción conceptual al uso de las funciones, macros,protocolos, extensiones y sucesos de AIXwindows. El programa AIXwindows es una herramienta diseñadapara ayudar a mejorar la utilización general del entorno de proceso de aplicaciones.

Utilización de las funciones de pantalla en AIXwindowsAntes de que un programa pueda utilizar una pantalla, debe establecer una conexión con el servidor Xque gestiona la pantalla. Cuando se establece una conexión, se pueden utilizar las macros y funciones deXlib para devolver información sobre esta pantalla como, por ejemplo, el tamaño y la profundidad delformato de imagen.

A continuación se describe el modo de abrir ventanas. Las dos secciones principales son las siguientes:

v Apertura de una pantalla

v Shared Memory Transport (SMT)

Apertura de una pantalla

Para abrir una conexión con el servidor X que controla una pantalla determinada, utilice la funciónXOpenDisplay . Esta función devuelve una estructura de pantalla que sirve como conexión con elservidor X. Esta estructura de pantalla contiene información sobre el servidor X y conecta la pantalla dehardware especificada al servidor a través de zócalos Transmission Control Protocol (TCP) o de zócalosde dominio UNIX. Si el nombre de sistema principal es un nombre de un sistema principal y un signo dedos puntos (:) separa el nombre del sistema principal y el número de pantalla, la función XOpenDisplayconecta el sistema principal y la pantalla mediante zócalos TCP. Si el nombre de sistema principal noexiste o si unix y un signo : (dos puntos) lo separa del número de pantalla, la función XOpenDisplayconecta el sistema principal y la pantalla mediante zócalos de dominio UNIX.

Un solo servidor puede dar soporte a cualquiera de estos mecanismos de transporte, o a todos ellossimultáneamente.

El nombre de pantalla o la variable de entorno DISPLAY es una serie con el siguiente formato:NombreSistpral:Número.Pantalla

NombreSistpral Especifica el nombre del sistema principal al que la pantalla está físicamente conectada. El nombrede sistema principal debe ir seguido de un signo : (dos puntos).

Capítulo 4. Biblioteca Xlib de AIXwindows 25

Page 38: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Número Especifica el número de ID del servidor de pantalla en dicho sistema principal. El número de pantallapuede ir seguido de un . (punto).

Pantalla Especifica el número de la pantalla en dicho servidor de sistema principal. Se pueden conectar ocontrolar varias pantallas desde un solo servidor X. La pantalla define una variable interna a la quese puede acceder con la macro DefaultScreen o con la función XDefaultScreen .

Por ejemplo, puede utilizar el siguiente formato para especificar la pantalla 0 visualización 2 en el sistemadenominado Dave:

Dave:2.0

Las aplicaciones no deben modificar directamente ninguna parte de las estructuras de datos Display yScreen . Estas estructuras deben ser consideradas como datos de sólo lectura por el usuario, pero sepueden modificar mediante funciones específicas o macros de pantalla.

Nota: La comunicación entre la Xlib y el servidor X se maneja de uno de los siguientes modos:

v Zócalos de dominio UNIX

v Zócalos de dominio TCP

v Zócalos Shared Memory Transport

Consulte Shared Memory Transport (SMT) para obtener más información.

Shared Memory Transport (SMT)La comunicación entre Xlib y el servidor de ventanas X se gestiona mediante zócalos de dominio UNIX,zócalos de dominio TCP y zócalos Shared Memory Transport. Los zócalos de dominio UNIX constituyenun mecanismo derivado de la transferencia de protocolo. Los zócalos TCP se utilizan en un sistema si laaplicación (cliente) que se ejecuta se encuentra en una máquina remota. Los zócalos Shared MemoryTransport constituyen un mecanismo recientemente desarrollado que está especialmente diseñado para elservidor X.

El mecanismo de zócalos Shared Memory Transport se ha desarrollado para aumentar el rendimiento delos datos de transferencia desde la aplicación (a través de Xlib ) al servidor X. Tal como se muestra en lasiguiente ilustración, se pasan datos de ida y vuelta al servidor X a través de uno de estos tresmecanismos de transporte:

v Zócalos de dominio UNIX.

v Zócalos de dominio TCP.

v Zócalos Shared Memory Transport.

26 Guía de programación de AIXwindows

Page 39: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

El método de transporte de protocolo por omisión es un convenio derivado del Massachusetts Institute ofTechnology (MIT) y constituye el método de transporte más rápido disponible.

Los datos indican que el coste global de comunicaciones correspondiente a aplicaciones X locales puedeser muy alto y se puede mejorar de forma significativa utilizando zócalos SMT en lugar de utilizar zócalosUNIX o TCP como mecanismo de transporte. El mecanismo estándar de comunicaciones para los clientesX locales son los zócalos de dominio UNIX. Este diseño proporciona una serie de servicios que facilita eluso de la memoria compartida como mecanismo de transporte para clientes locales.

Objetivos del diseño de Shared Memory TransportEl diseño de Shared Memory Transport (SMT) ayuda a eliminar el movimiento innecesario de datos.Cuando se utilizan zócalos de dominio UNIX para la comunicación, los datos se tienen que copiar dosveces para moverlos entre los procesos. Estos datos se copian en el kernel en ″envíos″ y se copian delkernel en ″recepciones″. Al utilizar un segmento de memoria compartida para los datos, los procesostanto del cliente como del servidor pueden acceder a los mismos datos. De este modo se ahorra una omás copias de los datos.

Cuando se ejecutan varias aplicaciones en un solo servidor, los datos de pequeño tamaño se puedentransferir al cliente, y de éste al servidor, antes de que otro cliente solicite el servicio. En este tipo deentorno, el servidor emplea gran parte de su tiempo en la llamada al sistema [select] para conmutar a otroproceso.

La llamada de selección de sistema genera mucha actividad general que el servidor X no necesita. Eldiseño de SMT implanta una función de selección especial denominada smselect. Esta llamada al sistemade SMT elimina gran cantidad de la actividad general innecesaria, lo que minimiza el tiempo deconmutación de procesos entre las aplicaciones y mejora el rendimiento.

Variables de entorno y Shared Memory TransportEl servidor X utiliza por omisión SMT, lo que resulta transparente para el usuario (excepto en cuanto a lasdiferencias en el rendimiento). Sin embargo, el usuario puede utilizar dos variables de entorno que sirvenpara cambiar el modo en que funciona la capa de transporte. Estas variables de entorno son: DISPLAY yX_SHM_SIZE.

DISPLAY es una variable de entorno existente que suelen manipular los usuarios del servidor X.Estavariable sirve para especificar la conexión con un determinado servidor X. Puede especificar cualquiernúmero de servidores X tanto locales como remotos. Por omisión, la variable de entorno DISPLAY tieneel valor :screen# . Este convenio especifica que el usuario desea conectarse al servidor X especificadopor screen# y utilizar el método de transporte más rápido disponible. Si la variable de entorno DISPLAY

Figura 2. Flujo de datos de Xlib

Capítulo 4. Biblioteca Xlib de AIXwindows 27

Page 40: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

tiene el valor unix:screen#, se utilizan zócalos de dominio UNIX. Si la variable tiene el valorhostname:screen#, se utilizan zócalos TCP para transportar los datos al servidor X remoto.

X_SHM_SIZE es una variable de entorno de X11R5 1.2.3 (Release 3.2.4). Esta variable sirve paracambiar los tamaños de los almacenamientos intermedios cliente-a-servidor y servidor-a-cliente. Eltamaño del almacenamiento intermedio por omisión es de 64 Kbytes, el tamaño mínimo es de 16 Kbytesy el tamaño máximo es de 252 Kbytes. Es posible que el usuario desee cambiar el tamaño delalmacenamiento intermedio según las necesidades específicas de las aplicaciones. Por ejemplo, grandesalmacenamientos intermedios para grandes archivos y pequeños almacenamientos intermedios parapequeños archivos.

Otros mecanismos de memoria compartidaEs importante recalcar que el mecanismo de Shared Memory Transport no es igual al Shared MemoryExtension que suministra MIT. Este funciona sólo con pixmaps e imágenes y necesita que la aplicacióncliente tenga un conocimiento detallado del mecanismo de transporte. En este entorno, el cliente efectúallamadas específicas a la extensión del lado del servidor para poder acceder a un segmento de memoriacompartida simultáneamente con el servidor.

Por otro lado, Shared Memory Transport utiliza el segmento de memoria compartida para transportartodos los datos (no solo pixmaps e imágenes) al servidor X y del servidor X. El cliente no tiene que llevara cabo ningún proceso especial. El programa Xlib maneja el mecanismo de transporte para la aplicacióncliente.

Planos de recubrimiento gráfico

Los planos de recubrimiento gráfico constan de memoria adicional colocada lógicamente en la partesuperior del almacenamiento intermedio de tramas (por eso se le llama recubrimiento). Normalmente, lasaplicaciones gráficas utilizan este hardware adicional para crear ventanas que no afecten al contenido delas ventanas existentes en el almacenamiento intermedio de tramas.

Los principales objetivos al implementar esta característica son:

v Reducir la necesidad de tener que volver a dibujar complejas imágenes subyacentes cuando el usuarioestá navegando por la interfaz de usuario.

v Permitir que se graben imágenes sencillas, como son las anotaciones, sobre la imagen subyacente singrabar encima de las imágenes.

En el momento del arranque o restauración del servidor X , se crea la siguiente propiedad en la ventanaraíz de cualquier pantalla que tenga capacidad de recubrimiento:property_name: SERVER_OVERLAY_VISUALSproperty_type: SERVER_OVERLAY_VISUALSformat: 32

El contenido de esta propiedad es una lista de cada visual que reside en los recubrimientos. Cadaelemento de la lista contiene información en el siguiente formato:SERVER_OVERLAY_VISUALS {

overlay_visual: VISUALIDtransparent_type: {None, TransparentPixel,

TransparentMask}value: CARD32layer: CARD32

}

Los visuales de la capa 0 (cero) son visuales de no recubrimiento, y no aparecen en la lista. Los visualesde recubrimiento empiezan en la capa 1 (uno). (Consulte el distintivo -layer del mandato X para obtenerinformación relativa a la forma de especificar el visual por omisión.)

28 Guía de programación de AIXwindows

Page 41: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Cuando se dibuja una ventana creada con un visual de recubrimiento (una ventana de recubrimiento), ellono afecta al contenido de las ventanas de capas distintas de la capa que contiene la ventana derecubrimiento. Además, hay un grupo (que puede estar vacío) de valores de pixel transparente quefuncionan de modo que cuando se graban en una ventana de recubrimiento, se muestran los pixels de lasventanas de la capa inmediatamente inferior. Si estos valores de pixel también son transparentes, elproceso se aplica hasta que se encuentra una ventana que contiene un valor de pixel no transparente.Puesto que los visuales de la capa 0 no aparecen en la lista, no pueden tener ningún valor de pixeltransparente. Los campos transparent_type y value especifican el grupo de valores de pixeltransparentes del siguiente modo:

transparent_type Significado del campo Valor

0 - Ninguno Pasar por alto el campo valor; no hay ningún pixeltransparente.

1 - TransparentPixel El campo de valor nombra de forma explícita un pixeltransparente.

2 - TransparentMask Cualquier valor de pixel que tenga al menos los mismosbits que el campo valor es transparente. Un pixel estransparente si y sólo si (valor & pixel) == valor.

El mismo elemento overlay_visual puede aparecer más de una vez en la lista. Si es así:

v La unión de los valores de pixel descritos en los campos transparent_type y value debe sertransparente.

v El valor del campo layer es igual en todas las instancias de un elemento overlay_visual determinado.(Un elemento overlay_visual determinado existe en una capa y sólo en una.)

Nota: No hay ninguna restricción en la relación padre-hijo de las ventanas en cuanto al visual conel que se crearon las ventanas. Una ventana puede tener combinaciones de hijos en cualquiercapa que esté en, bajo o sobre su propia capa.

GXT_OVERLAYSEn las familias de adaptadores gráficos GXT150 y GXT155 (salvo el GXT150M), la variable de entornoGXT_OVERLAYS debe definirse con el valor TRUE para permitir recubrimientos de 4 bits.

v Si la variable de entorno GXT_OVERLAYS tiene el valor TRUE :

– En los monitores de baja resolución (1024x768) se habilitan los recubrimientos y mapas de coloresde hardware múltiples.

– En monitores de alta resolución, sólo se habilitan los recubrimientos. Los recubrimientos de 4 bitstoman el control de la memoria de vídeo que se utiliza para habilitar múltiples mapas de colores dehardware.

– El argumento de la línea de mandatos -layer 1 o -d 4 hace que el servidor X coloque la ventanaraíz y el visual por omisión en los planos de recubrimiento de 4 bits.

v Si la variable de entorno GXT_OVERLAYS no está definida con el valor TRUE:

– En los monitores tanto de alta como de baja resolución sólo se habilitan mapas de colores dehardware múltiples. Los recubrimientos de 4 bits no están disponibles.

– El servidor X pasa por alto el argumento de la línea de mandatos -layer1.

– El servidor X considera no válido el argumento de la línea de mandatos -d 4.

Capítulo 4. Biblioteca Xlib de AIXwindows 29

Page 42: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Soporte de idiomas nacionales (NLS) de AIXwindows

Visión generalLa internacionalización es un método de desarrollo de aplicaciones que permite que se utilice unaaplicación en diversos entornos nacionales. El concepto de entorno nacional se utiliza para englobar lascaracterísticas y requisitos de un idioma determinado. Una aplicación internacionalizada necesita que lainformación que depende del idioma o que esté personalizada se almacene de forma externa al programade aplicación. Un entorno nacional puede caracterizarse por diversos componentes. Por ejemplo, seutilizan juegos de caracteres, orden de clasificación, dirección del texto y formato de datos (como la fechao la moneda) para describir las características exclusivas de un entorno nacional. Para los distintosentornos nacionales, se define información (como elementos de menús, información de ayuda ysolicitudes al usuario) que se almacena por separado. La información está adaptada al entorno nacional,lo que significa que ha sido adaptada a un idioma y país determinados.

Una aplicación diseñada para funcionar en distintos entornos nacionales examina ciertos recursos yvariables de entorno a fin de determinar qué idioma utilizar cuando se ejecuta. Una aplicación establecevías de acceso de búsqueda de archivos para los archivos de recursos y para la información quedepende del idioma. Hay una amplia gama de información que se puede adaptar al entorno nacional. Lainformación que depende del entorno nacional se almacena en archivos que residen en distintosdirectorios. AIXwindows utiliza un mecanismo intrínseco Xt subyacente (XtResolvePathname ) paraseleccionar y adaptar al entorno nacional los archivos adecuados, en función del entorno nacional.

Una aplicación internacionalizada puede definir el entorno en el momento de la ejecución, normalmenteutilizando un procedimiento interno denominado procedimiento de idioma. El procedimiento de idiomaprocesa los datos del entorno del usuario y define el entorno nacional de la aplicación. Esta característicale permite modificar el entorno del usuario y volver a ejecutar una aplicación en otro entorno nacional.Una aplicación puede utilizar un procedimiento de idioma por omisión o puede suministrar su propioprocedimiento. Por lo tanto, dos aplicaciones pueden procesar los mismos datos de entorno de usuariocon distintos resultados. Consulte la documentación de usuario de la aplicación que vaya a utilizar paraobtener instrucciones detalladas.

Un método de entrada es el mecanismo subyacente que toma la entrada del teclado y muestra en lapantalla los caracteres correspondientes del entorno nacional. Un método de entrada interpreta laspulsaciones del usuario en función de los convenios suministrados por el método de entrada. El métodode entrada que utiliza una aplicación en función de un idioma alfabético suele resultar invisible. Sinembargo, los idiomas ideográficos, como el chino o el japonés, pueden utilizar un método de entrada quecomponga las pulsaciones en distintas ventanas denominadas ventanas pre-edición. Por ejemplo, puedeescribir una representación fonética de una palabra hablada y el método de entrada determina el carácterideográfico que se pronuncia de ese modo. Si hay más de un carácter que cumple con ese criterio, elmétodo de entrada muestra una lista de caracteres en la que puede seleccionar uno. Una vez confirmadala selección en el área de pre-edición, se pasa la información a la aplicación.

Los métodos de entrada pueden venir definidos por el proveedor de una plataforma, por una aplicación opor un usuario. Encontrará información sobre los métodos de entrada disponibles y sus características enla documentación del sistema o aplicación que esté utilizando.

Una aplicación internacionalizada puede definir de forma dinámica su entorno de idioma cuando seejecuta. El diseño de la aplicación define la información que se espera y el modo que se utiliza paradefinir el entorno de idioma. Normalmente, puede modificar el entorno de idioma que utiliza una aplicaciónespecificando un recurso de idioma o una variable de entorno de idioma. El método exacto a utilizar paradefinir el entorno de idioma de una aplicación lo determina la aplicación. Consulte la documentación de laaplicación para encontrar información específica.

30 Guía de programación de AIXwindows

Page 43: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

ExcepcionesEl sistema AIXwindows da soporte al estándar X11R6 con las siguientes excepciones:

Valores de método de entradav El argumento XNVisiblePosition indica si están disponibles las máscaras de posición visibles de

XIMFeedback en XIMText .

v XNR6PreeditCallbackBehavior es obsoleto y se recomienda no utilizarlo.Originalmente, el argumentoindicaba si el comportamiento de las llamadas de pre-edición devueltas con respecto a los valores deXIMPreeditDrawCallbackStruct seguían la semántica del Release 5 o del Release 6.

Valores de contexto de entradav El argumento String Conversion Callback especifica una devolución de llamada de conversión de

serie. No se necesita esta devolución de llamada para que funcionen correctamente el método deentrada o el cliente.

v El argumento String Conversion especifica la serie que un método de entrada va a convertir. No senecesita este argumento para que funcionen correctamente el método de entrada o el cliente.

Capítulo 4. Biblioteca Xlib de AIXwindows 31

Page 44: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

32 Guía de programación de AIXwindows

Page 45: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Capítulo 5. Utilización de las extensiones en AIXwindows

Dado que AIXwindows puede evolucionar mediante las extensiones al protocolo de núcleo, es importanteque no se subestimen las extensiones.

Para evitar la inicialización explícita de extensiones en programas de aplicación, es importante que lasextensiones realicen ″evaluaciones lentas″ y se inicialicen a sí mismas cuando son llamadas por primeravez.

Las siguientes secciones describen técnicas para escribir extensiones a la biblioteca Xlib que tengan lamisma tasa de rendimiento que las peticiones de protocolo de núcleo.

v Funciones de extensión

v Extensiones del servidor X que se pueden cargar dinámicamente

Nota: Dado que se espera que una extensión de AIXwindows conste de varias peticiones, no serecomienda definir 10 nuevas características como 10 extensiones distintas. En su lugar,empaquete las nuevas características en una sola extensión y utilice opcodes menores paradistinguir las características.

En este capítulo se incluyen los siguientes protocolos de extensiones:

v Extensión de forma de ventana no rectangular de AIXwindows

v Extensión de protector de pantalla de AIXwindows

v Funciones de dispositivo de entrada de AIXwindows

v Biblioteca de extensión de entrada de AIXwindows

v Protocolo de extensión de entrada de AIXwindows

v Extensión de doble almacenamiento intermedio de AIXwindows

v Extensión XTest de AIXwindows

Funciones de extensiónLos siguientes temas están relacionados con funciones de extensión:

v Funciones de extensiones básicas

v Enlace con la biblioteca Xlib

v Colocación en antememoria de Contexto gráfico (GC)

v Proceso por lotes de gráficos

v Bloqueo de estructuras de datos

v Definición de respuestas, peticiones y apéndices de extensiones

v Definición de formatos de peticiones

v Definición de formatos de respuesta

v Envío de peticiones de protocolo y de argumentos

v Argumentos de longitud variable

v Llamada síncrona

v Asignación y desasignación de memoria

v Derivación del opcode de extensión correcto

Funciones de extensiones básicas

Las peticiones de protocolo básicas para las extensiones son las funciones de extensiónXQueryExtension , XListExtensions y XFreeExtensionList .

© Copyright IBM Corp. 1997, 2001 33

Page 46: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Enlace con la biblioteca Xlib

Las rutinas de enlace establecen un enlace con la biblioteca. Los programadores de aplicaciones nosuelen utilizar estas rutinas; las utilizan los programadores que tengan que ampliar el protocolo deAIXwindows de núcleo y la interfaz de biblioteca de AIXwindows. Las rutinas de enlace, que generanpeticiones de protocolo para AIXwindows, se denominan apéndices.

En las extensiones, los apéndices primero efectúan una comprobación para ver si se han inicializado a símismos en una conexión. Si los apéndices no se han inicializado, deben llamar a la funciónXInitExtension .

La estructura con formato de alambre XEvent está en el archivo de cabecera <X11/Xproto.h> y laestructura con formato de sistema principal XEvent está en el archivo de cabecera <X11/Xlib.h> .

La estructura de datos XExtCodes devuelve la información de la función de extensión XQueryExtensiony está definida en el archivo de cabecera <X11/Xlib.h> .

La función XInitExtension llama a la función XQueryExtension para ver si existe la extensión. Luego,asigna almacenamiento para mantener la información sobre la extensión en la conexión. Lo agrega a lalista de extensiones correspondiente a la conexión y devuelve la información que necesita el implantadordel apéndice para acceder a la extensión. Si la extensión no existe, la función XInitExtension devuelveun valor NULO.

El número de extensión devuelto en la estructura de datos XExtCodes se utiliza en las llamadasposteriores. Este número de extensión es exclusivo de una sola conexión.XExtCodes *XAddExtension(DisplayPtr)

Display *DisplayPtr;

Para las extensiones de la biblioteca Xlib local, la función XAddExtension asigna la estructura de datosXExtCodes , aumenta el número de extensión y agrega la extensión a la lista de extensiones.(Estopermite a las extensiones acceder a la biblioteca Xlib sin que se necesiten extensiones del servidor.)

Los tipos de funciones y las funciones asociadas que se enlazan a la biblioteca de AIXwindows incluyenlo siguiente:

v Creación de un nuevo contexto de gráficos para una conexión (la función de extensiónXESetCloseDisplay y la función de extensión XESetCreateGC ).

v Copia de un contexto de gráficos (la función de extensión XESetCopyGC ).

v Liberación de un contexto de gráficos (la función de extensión XESetFreeGC ).

v Creación y liberación de fonts (la función de extensión XESetCreateFont y la función de extensiónXESetFreeFont ).

v Conversión de sucesos definidos por las extensiones a formato de alambre y de formato de alambre (lafunción XESetWireToEvent y la función de extensión XESetEventToWire ).

v Manejo de errores (la función de extensión XESetError y la función de extensión XESetErrorString .

Utilice estas rutinas para definir procedimientos a los que se llamará bajo determinadas circunstancias.Todas estas rutinas devuelven la rutina anterior definida para esta extensión.

Varias estructuras de datos de la biblioteca Xlib tienen disposiciones para que las funciones de extensiónenlacen a una lista los datos suministrados por las extensiones. Dado que el puntero de la lista siemprees el primer miembro de la estructura, se puede utilizar un solo grupo de funciones para manipular losdatos de estas listas.

En estas funciones se utiliza la estructura de datos XExtData , que está definida en el archivo de cabecera<X11/Xlib.h> .

34 Guía de programación de AIXwindows

Page 47: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Colocación en antememoria de Contexto gráfico (GC)

La biblioteca coloca en antememoria los GC de modo que las peticiones de cambios independientes sepuedan fusionar en una sola petición de protocolo. Esta antememoria recibe el nombre de antememoriade grabación diferida. Cualquier función de extensión cuyo comportamiento dependa del contenido de unGC debe borrar la antememoria de GC para asegurarse de que el servidor tiene actualizado el contenidode su GC.

Si amplía el GC para añadir componentes de ID de recursos adicionales, debe asegurarse de que elapéndice de la biblioteca envía de inmediato la petición de cambio. Puesto que un cliente puede liberar unrecurso inmediatamente después de utilizarlo, almacenar el valor en la antememoria sin forzar unapetición de protocolo puede destruir el recurso antes de que se defina en el GC.

El procedimiento _XFlushGCCache fuerza el borrado de la antememoria.

Proceso por lotes de gráficos

Si amplía AIXwindows para añadir más primitivas de poligráficos, tal vez pueda aprovechar los recursosde la biblioteca para que las llamadas sencillas back-to-back se trasformen en peticiones poli. Laestructura de pantalla tiene un puntero a una petición xReq llamada last_req, que es la última peticiónque se procesa. Al comprobar que el tipo de la última petición, drawable, GC y otras opciones son igualesque el de la nueva, y que hay suficiente espacio libre en el almacenamiento intermedio, es posible quepueda ampliar la petición de gráficos anterior ampliando el campo de longitud de la petición y agregandolos datos al almacenamiento intermedio.

Por ejemplo, a continuación se muestra el fuente del apéndice XDrawPoint :#include <X11/Xlibint.h>/* se permite precalcular el tamaño máximo de la petición de proceso por lotes */

static int size = sizeof(xPolyPointReq) + EPERBATCH* sizeof(xPoint);

XDrawPoint(dpy, d, gc, x, y)register Display *dpy;Drawable d;GC gc;int x, y; /* INT16 */

{xPoint *point;LockDisplay(dpy);FlushGC(dpy, gc);{register xPolyPointReq *req = (xPolyPointReq *)dpy->last_req;/* if same as previous request, with same drawable,batch requests */if (

(req->reqType == X_PolyPoint)&& (req->drawable == d)&& (req->gc == gc->gid)&& (req->coordMode == CoordModeOrigin)&& ((dpy->bufptr + sizeof (xPoint)) <=dpy->bufmax)&& (((char *)dpy->bufptr - (char *)req) < size)) {point = (xPoint *) dpy->bufptr;req->length += sizeof (xPoint) >> 2;dpy->bufptr += sizeof (xPoint);}

else {GetReqExtra(PolyPoint, 4, req ); /* 1 punto = 4 bytes */req->drawable = d;req->gc = gc->gid;req->coordMode = CoordModeOrigin;point = (xPoint *) (req + 1);

Capítulo 5. Utilización de las extensiones en AIXwindows 35

Page 48: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

}point->x = x;point->y = y;}UnlockDisplay(dpy:);SyncHandle();

}

Para evitar que los clientes generen peticiones largas que podrían monopolizar el servidor, existe un límiteal número de peticiones de proceso por lotes de EPERBATCH que está definido en <X11/Xlib.h> . Tengaen cuenta que se llama a la macro FlushGC antes de obtener el valor del campo last_req, puesto queésta puede modificar este campo.

Bloqueo de estructuras de datos

Para bloquear la estructura de pantalla para sistemas que deseen dar soporte al acceso en varios pasosa una sola conexión de pantalla o para dar soporte a entradas asíncronas, cada apéndice tiene quebloquear su sección crítica. Normalmente, esta sección es el punto inmediatamente anterior a la llamadaGetReq adecuada cuando todos los argumentos de la llamada se han almacenado en la petición. Dosllamadas que se suelen implantar como macros son las siguientes:LockDisplay(Display)

Display *Display;UnlockDisplay(Display)

Display *Display;

El parámetro Display especifica un puntero a la estructura de pantalla de la pantalla que se va a bloquearo desbloquear.

Definición de respuestas, peticiones y apéndices de extensiones

El archivo de cabecera <X11/Xproto.h> contiene los tres conjuntos de definiciones siguientes:

v Nombres de peticiones

v Estructuras de peticiones

v Estructuras de respuestas

Las peticiones del servidor X contienen la longitud, expresada como una cantidad en 16 bits de 32 bits,de la petición. Por lo tanto, una petición no puede tener una longitud superior a 256 k. Es posible quealgunos servidores no den soporte a peticiones de dicha longitud. El valor de display->max_request_sizecontiene la longitud máxima, definida por la implementación del servidor.

Una rutina de apéndice de la biblioteca Xlib debe comenzar de la manera siguiente:#include <X11/Xlibint.h>

XDoSomething (argumentos,...) /declaraciones argumento */{

/* declaraciones de variable, si hay */

Si la petición de protocolo tiene una respuesta, las declaraciones de variables deben incluir la estructurade respuesta correspondiente a la petición. A continuación se muestra un ejemplo:xDoSomethingReply rep;

Genere un archivo equivalente al archivo de cabecera <X11/Xproto.h> para la extensión e inclúyalo en larutina de apéndice. Cada rutina de apéndice debe incluir también el archivo de cabecera <X11/Xlibint.h> .

36 Guía de programación de AIXwindows

Page 49: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Los identificadores se eligen deliberadamente de tal manera que, si la petición se denominaX_DoSomething, su estructura de petición es xDoSomethingReq y su respuesta es xDoSomethingReply. Lafamilia de macros GetReq , definida en el archivo de cabecera <X11/Xlibint.h> , aprovecha este esquemade denominación.

Para cada petición X, hay una definición en <X11/Xproto.h> con un aspecto similar al siguiente:#define X_DoSomething 42

En el archivo de cabecera de extensión, este es un opcode menor en lugar de ser un opcode mayor.

Definición de formatos de peticiones

Cada petición contiene un opcode mayor de 8 bits y un campo de longitud de 16 bits expresado enunidades de 4 bytes. Cada petición consta de una cabecera de 4 bytes (que contiene el opcode mayor, elcampo de longitud y un byte de datos) seguida de un 0 (cero) o de bytes adicionales de datos. El campode longitud define la longitud total de la petición, incluida la cabecera. El campo de longitud de unapetición debe ser igual a la longitud mínima necesaria para albergar la petición. Si el campo de longitudespecificado es menor o mayor que la longitud necesaria, la extensión genera un error BadLength . Losbytes no utilizados de una petición no necesitan tener un valor de 0.

La función de extensión XMaxRequestSize devuelve el tamaño máximo de petición (unidades de 4 bytes)soportado por el servidor.

Los opcodes mayores comprendidos entre el 128 y el 255 están reservados para las extensiones. Lasextensiones sirven para albergar varias peticiones, puesto que las peticiones suelen tener un opcodemenor adicional en un byte de datos de reserva en la cabecera de la petición. Pero la colocación y lainterpretación de este opcode menor, así como otros campos de las peticiones de extensión, no estándefinidos por el protocolo de núcleo (Core). A cada petición se le asigna de forma implícita un número desecuencia (empezando por uno) que se utiliza en las respuestas, los errores y los sucesos. Las macrosB16 y B32 se han definido de modo que pueden pasar a ser especificaciones de campos de bits enalgunas máquinas.

La mayoría de las peticiones de protocolo tienen una estructura correspondiente typedef en el archivo decabecera <X11/Xproto.h> . A continuación se muestra un ejemplo de la estructura typedef xResourceReq :typedef struct _ResourceReq{

CARD8 reqType; /* el tipo solicitado, X_DoSomething */BYTE pad; /* no utilizado */CARD16 length; /*2(=número total de bytes en

petición, dividido por 4)*/CARD32 id; /*ventana, drawable, font o

gcontext, por ejemplo */} xResourceReq;

reqType Identifica el tipo de petición, como el valor X_MapWindow o el valor X_CreatePixmap .length Identifica la longitud (en unidades de 4 bytes) de la petición. Incluye la estructura de la petición y los

datos de longitud variable, como las series o listas, que siguen a la estructura de la petición. Lasestructuras de petición vienen en distintos tamaños, pero todas las peticiones tienen una longitud quees un múltiplo de 4 bytes.

Si el protocolo de núcleo (Core) solicita un solo argumento de 32 bits, no necesita declarar una estructurade petición en el archivo de cabecera de extensión. En cambio, estas peticiones utilizan la estructura dedatos xResourceReq en el archivo de cabecera <X11/Xproto.h> . Esta estructura se utiliza para cualquierpetición cuyo único argumento sea Window, Pixmap, Drawable, GContext, Font, Cursor, Colormap, Atomo VisualID.

Capítulo 5. Utilización de las extensiones en AIXwindows 37

Page 50: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

typedef struct _DoSomethingReq{CARD8 reqType; /* X_DoSomething */CARD8 someDatum; /*usado de forma diferente en las distintas peticiones*/CARD16 length; /* número total de bytes en petición,

dividido por 4*/.... /*datos específicos de la petición*/...

} xDoSomethingReq;

reqType Identifica el tipo de petición, como el valor X_MapWindow o el valor X_CreatePixmap .length Identifica la longitud (en unidades de 4 bytes) de la petición. Incluye la estructura de la petición y los

datos de longitud variable, como las series o listas, que siguen a la estructura de la petición. Lasestructuras de petición vienen en distintos tamaños, pero todas las peticiones tienen una longitud quees un múltiplo de 4 bytes.

Puede hacer algo parecido en el archivo de cabecera de extensión.

Algunas peticiones de protocolo no utilizan ningún argumento. En cambio, utilizan la estructura de datosxReq , que sólo contiene un tipo de petición y una longitud (y un byte de relleno) en el archivo decabecera <X11/Xproto.h> .

Definición de formatos de respuesta

Si la petición de protocolo requiere una respuesta, el archivo de cabecera <Xproto.h> también contendráuna estructura de respuesta typedef.typedef struct _DoSomethingReply {

BYTE type; /* siempre X_Reply */BYTE someDatum /* usado de forma diferente en las distintas

peticiones*/CARD16 sequenceNumber; /*número de peticiones enviadas hasta el momento*/CARD32 length; /*número de bytes adicionales,

dividido por 4*/........ /*datos específicos de la petición*/....

} xDoSomethingReply;

La mayoría de estas estructuras de respuesta tienen una longitud de 32 bytes. Si el valor de respuestatiene menos de 32 bytes, la estructura de respuesta contiene un número suficiente de campos de rellenopara que el valor tenga 32 bytes.

El valor length es el número total de bytes de la petición menos 32 y dividido por 4. Este campo no esigual a 0 si:

v La estructura de respuesta va seguida de datos de longitud variable, como por ejemplo una lista o unaserie.

v La estructura de respuesta tiene más de 32 bytes.

Las únicas excepciones de protocolo de núcleo (Core) que tienen estructuras de respuesta de más de 32bytes son las siguientes:

v Petición de protocolo GetWindowAttributes

v Petición de protocolo QueryFont

v Petición de protocolo QueryKeymap

v Petición de protocolo GetKeyboardControl

Unas pocas peticiones de protocolo devuelven respuestas que no contienen datos. El archivo de cabecera<X11/Xproto.h> no define estructuras de respuesta para ellas. En su lugar, estas peticiones de protocolo

38 Guía de programación de AIXwindows

Page 51: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

utilizan la estructura xGenericReply , que contiene sólo un tipo, longitud y número de secuencia (ysuficiente relleno para convertir la longitud a 32 bytes).

Envío de argumentos y peticiones de protocolo

Después de las declaraciones de variables, una rutina de apéndice debe llamar a una de las cuatromacros siguientes, definidas en el archivo Xlibint.h :

v GetReq

v GetReqExtra

v GetResReq

v GetEmptyReq

Estas macros toman el nombre de la petición de protocolo declarada en el archivo de cabecera<X11/Xproto.h> sin X_ como primer argumento. Cada macro declara un puntero de estructura Display ,denominado dpy, y un puntero a una estructura de petición, denominado req, que tiene el tipo adecuado.Luego, la macro agrega la estructura de petición al almacenamiento intermedio de salida, rellena loscampos type y length y define la variable req para que apunte al mismo.

Si la petición de protocolo, como GrabServer , no tiene ningún argumento, utilice la petición de protocoloGetEmptyReq como en el siguiente ejemplo:GetEmptyReq (DoSomething, req);

Si la petición de protocolo tiene un único argumento de 32 bits (como Pixmap, Window, Drawable oAtom), utilice la macro GetResReq .

El segundo argumento de esta macro es el objeto de 32 bits. El tipo de petición X_MapWindow es unbuen ejemplo de la macro GetResReq :GetResReq (DoSomething, rid, req);

El argumento rid es el valor Pixmap o Window , u otro ID de recurso.

Si la petición de protocolo toma cualquier otra lista de argumentos, llame a la macro GetReq . Después dela macro GetReq , defina los demás campos de la estructura de la petición (normalmente a partir de losargumentos de la rutina de apéndice).GetReq (DoSomething, req);/* rellenar aquí los argumentos */req->arg1 = arg1;req->arg2 = arg2;

Algunas rutinas de apéndice, como las funciones XCreateGC y XCreatePixmap , devuelven un ID derecurso al que efectúa la llamada, pero pasan un ID de recurso como argumento a la petición deprotocolo. Estas rutinas de apéndice utilizan la macro XAllocID para asignar un ID de recursocomprendido en el rango de ID que se asignaron a este cliente cuando se abrió la conexión. Acontinuación se muestra un ejemplo de la macro XAllocID :rid = req->rid = XAllocID();return (rid);

Finalmente, algunas rutinas de apéndice transmiten una cantidad fija de datos de longitud variabledespués de la petición. Normalmente, estas rutinas, como las funciones XMoveWindow yXSetBackground , son casos especiales de rutinas más generales, como las funcionesXMoveResizeWindow y XChangeGC . En estos casos, se utiliza la macro GetReqExtra , que es como lamacro GetReq con un argumento adicional. El argumento adicional es el número de bytes extra (unmúltiplo de 4) que se asignan en el almacenamiento intermedio de salida después de la estructura de lapetición.

Capítulo 5. Utilización de las extensiones en AIXwindows 39

Page 52: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Argumentos de longitud variable

Algunas peticiones de protocolo toman datos de longitud variable adicionales que siguen la estructuraxDoSomethingReq . El formato de estos datos varía entre una petición y otra. Algunas necesitan unasecuencia de bytes de 8 bits, otras una secuencia de entidades de 16 o de 32 bits, e incluso otras unasecuencia de estructuras.

La longitud de cualquier dato de longitud variable debe añadirse al campo length de la estructura depetición. El campo length se especifica en unidades de palabras de 32 bits de longitud. Si los datos sonuna serie u otra secuencia de bytes de 8 bits, debe redondearlos y desplazarlos antes de añadirlos. Porejemplo:req->length += (nbytes+3)>>2;

Para transmitir los datos de longitud variable, utilice las macros Data. Si los datos caben en elalmacenamiento intermedio de salida, esta macro los copia en el almacenamiento intermedio. Si nocaben, la macro Data llama a _XSend , que primero transmite el contenido del almacenamiento intermedioy luego transmite los datos. La macro Data toma tres argumentos: la pantalla, un puntero al principio delos datos, y el número de bytes a enviar.

v Data (display, (char*) data, nbytes);

v Data16 (display, (short*) data, nbytes);

v Data32 (display, (long*) data,nbytes);

Data, Data16 y Data32 son macros que pueden utilizar su último argumento más de una vez, de modoque dicho argumento debe ser una variable en lugar de una expresión como nitems*sizeof(item). Deberealizar este tipo de cálculo en una sentencia aparte antes de llamarlas. Utilice la macro adecuada cuandoenvíe datos de bytes, cortos o largos.

Si la petición de protocolo requiere una respuesta, llame al procedimiento _XSend en lugar de a la macroData. _XSend toma los mismos argumentos, pero puesto que envía los datos inmediatamente en lugar decopiarlos en el almacenamiento intermedio de salida (que luego se borra de todas formas con la siguientellamada de _XReply ), es más rápido.

A continuación se muestra un ejemplo de la macro Data:Data(display, (char *) data, nbytes);

Si la petición de protocolo tiene respuesta, utilice la función _XReply después de indicar todos losargumentos de longitud fija y variable.

Llamada síncrona

Para facilitar el proceso de depuración, cada rutina debe tener una llamada a una rutina inmediatamenteantes de devolver la salida al usuario. Esta rutina se denomina SyncHandle() y suele implementarsecomo una macro. Si la modalidad síncrona está habilitada con la función XSynchronize , la petición seenvía de inmediato. Sin embargo, la biblioteca espera hasta que se haya manejado cualquier errorgenerado.

Asignación y desasignación de memoria

Para dar soporte a las posibles re-entradas de estas rutinas, se deben tener en cuenta ciertos convenioscuando se asigne y desasigne memoria. Esto resulta especialmente importante cuando el usuario no sabela longitud de los datos que se devuelven. (Las rutinas estándar de la biblioteca en lenguaje C de muchossistemas no están protegidas contra señales u otra utilización de varios pasos.) Las analogías con lasrutinas estándar de la biblioteca de E/S son las siguientes:

40 Guía de programación de AIXwindows

Page 53: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Xmalloc() Sustituye a la rutina malloc() .Xfree() Sustituye a la rutina free() .Xcalloc() Sustituye a la rutina calloc() .

Se deben utilizar estas rutinas en lugar de las llamadas que se efectúan a las rutinas normales de labiblioteca en lenguaje C. Por ejemplo, si necesita un solo almacenamiento intermedio de trabajo dentro deuna sección crítica para empaquetar y desempaquetar datos de un protocolo de cableado, losasignadores generales de memoria pueden resultar demasiado caros (en concreto en las rutinas desalida, que resultan críticas con relación al rendimiento). Utilice la función _XAllocScratch para devolverun almacenamiento intermedio de trabajo. Este almacenamiento sólo se tiene que utilizar en la seccióncrítica del apéndice.

Derivación del opcode de extensión correcto

Cuando escriba un mapa de rutinas de apéndice de extensión a partir de la llamada a los opcodesmayores o menores adecuados, puede utilizar la siguiente estrategia:

1. Declare una matriz de punteros. La longitud de esta matriz, de longitud _NFILE (que normalmente seencuentra en el archivo de cabecera <stdio.h> ), es el número de descriptores de archivo soportadosen el sistema del tipo XExtCodes . Estos descriptores se tienen que inicializar con un valor NULO.

2. Cuando se especifica el apéndice, la prueba de inicialización debe utilizar el puntero de pantalla paraacceder al descriptor del archivo y a un índice de la matriz. Si la entrada tiene el valor NULO, significaque es la primera vez que especifica la rutina para esta pantalla. Llame a la rutina de inicialización ypase el puntero de pantalla.

3. Ya en la rutina de inicialización, llame a la función XInitExtension . Si es satisfactoria, almacene elpuntero devuelto en esta matriz. Establezca un manejador de cierre de pantalla para poder definir encero la entrada. Realice cualquier otra inicialización que necesite la extensión. (Por ejemplo, instalemanejadores de sucesos.) La rutina de inicialización suele devolver un puntero a la estructura dedatos XExtCodes correspondiente a esta extensión, que se suele encontrar en la matriz de punteros.

4. Después de la rutina de inicialización, la rutina del apéndice puede continuar con normalidad, puestoque su opcode mayor está a salvo en la estructura de datos XExtCodes .

Extensiones del servidor X que se pueden cargar dinámicamente

Algunas extensiones del servidor las puede cargar el servidor X durante la ejecución cuando se inicializael servidor. Este método se puede llevar a cabo de dos formas:

1. Si el usuario desea cargar la extensión cada vez que se inicia el servidor, el apodo de la extensión yel nombre de la vía de acceso de su módulo cargable deben aparecer en el archivo/usr/bin/X11/static_ext .

2. Si el usuario desea cargar de forma selectiva la extensión cada vez que invoca al servidor X, sepuede utilizar el distintivo de línea de mandatos -x y el apodo de la extensión. Para poder utilizar estemétodo, el apodo de la extensión y el nombre de la vía de acceso del módulo cargable debenaparecer en el archivo /usr/bin/X11/dynamic_ext . A continuación se muestra la utilización deldistintivo de línea de mandatos:

X -x mbx

Esto carga la Extensión de multialmacenamiento intermedio en el servidor. Se permiten variasinstancias del distintivo -x.

El formato de los archivos static_ext y dynamic_ext es el mismo y contiene dos campos separados porespacios en blanco. El primer campo es el apodo de la extensión que se utiliza para identificar el móduloque se va a cargar y no puede contener más de 27 caracteres; el segundo campo es el nombre de la vía

Capítulo 5. Utilización de las extensiones en AIXwindows 41

Page 54: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

de acceso del módulo cargable de la extensión. La longitud total de una entrada, es decir, los dos camposy los espacios en blanco, no puede superar los 160 caracteres. A continuación se muestra un ejemplo delformato:

mbx /usr/lpp/X11/bin/loadMbx

El servidor efectúa un seguimiento de las extensiones cargadas; por consiguiente, una misma extensiónsólo se carga una vez, aunque tenga varias entradas en los archivos static_ext y dynamic_ext y en eldistintivo de línea de mandatos -x.

Si el servidor X no encuentra o no puede cargar el módulo de extensión especificado, se produce un errorcrítico. El servidor X utiliza la subrutina loadquery para consultar los mensajes de error cuando falla lallamada al sistema de carga. Luego ejecuta execerror para mostrar estos mensajes de error, y sale delproceso.

Extensión de forma de ventana no rectangular de AIXwindowsEsta extensión ofrece formas de bordes y ventanas arbitrarias dentro del protocolo X11.

La restricción de ventanas rectangulares dentro del protocolo X puede resultar una limitación significativa.Por ejemplo, muchas ventanas de rutinas transitorias necesitarían mostrar una sombra para dar laimpresión de 3 dimensiones. Además, algunas guías de estilo de interfaces de usuario llaman a botonesque tienen bordes redondeados; la simulación completa de una forma no rectangular, en concreto conrespecto a la distribución de sucesos y a la forma del cursor, no es posible dentro del protocolo X denúcleo (Core). Finalmente, se pueden añadir al escritorio elementos agradables tales como relojesredondos e iconos no rectangulares.

Esta extensión ofrece los mecanismos necesarios para cambiar la forma visible de una ventana por unaforma arbitraria no rectangular. Esta extensión complementa la semántica existente, no la sustituye. Enconcreto, los clientes que no conozcan esta extensión deben ser capaces de manejar ventanas conformas irregulares. Por ejemplo, los gestores de ventanas deben seguir pudiendo manejar pantallas enestado real en partes rectangulares. Para este fin, cualquier forma que se especifique para una ventanase ve recortada por el rectángulo límite tal como especifica la geometría de la ventana en el protocolo denúcleo. Un convenio esperado sería que los programas cliente amplíen su forma para rellenar el área queofrece el gestor de ventanas.

Para obtener información adicional, consulte los temas siguientes:

v Descripción

v Tipos

v Enlaces del lenguaje C

DescripciónCada ventana (aunque no tenga especificada ninguna forma) está definida en dos regiones: la región delborde (bounding) y la región de recorte (clip). La región del borde es el área de la ventana padre queocupará la ventana (incluido el borde). La región de recorte es el subconjunto de la región del bordedisponible para subventanas y gráficos. El área que se encuentra entre la región de borde y la región derecorte se define como el borde de la ventana.

Una ventana sin forma tendrá una región de borde que es un rectángulo que abarca la ventana (incluidoel borde); la región de recorte será un rectángulo que rellena las dimensiones internas (sin incluir elborde). En este documento, estás áreas reciben el nombre de región de borde por omisión y región derecorte por omisión. Para una ventana que tenga un tamaño interno de width por height y un borde dewidth , las regiones de borde y de recorte por omisión son los rectángulos (con respecto al origen de laventana):

42 Guía de programación de AIXwindows

Page 55: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

bounding.x = -width

bounding.y = -width

bounding.width = width + 2 * width

bounding.height = height + 2 * width

clip.x = 0

clip.y = 0

clip.width = width

clip.height = height

Esta extensión permite a un cliente modificar la región de borde o de recorte, o ambas, especificandonuevas regiones que se combinen con las regiones por omisión. Estas nuevas regiones se denominanregión de borde del cliente y región de recorte del cliente. Se especifican con relación al origen de laventana y siempre se definen mediante desplazamientos con relación al origen de la ventana (es decir, nose necesitan ajustes de regiones cuando la ventana se mueve). Se ofrecen tres mecanismos paraespecificar regiones: una lista de rectángulos, un bitmap y una región de borde o de recorte existente deuna ventana. A partir de aquí, se modela según la especificación de regiones en contextos gráficos delprotocolo de núcleo (Core) y permite varios usos de la extensión.

Si se utiliza una forma de ventana existente como operando al especificar una nueva forma, se utiliza laregión del cliente, a no ser que no se haya definido ninguna, en cuyo caso se utiliza la región por omisión.

La región de borde efectiva de una ventana está definida como la intersección de la región de borde delcliente y la región de borde por omisión. Cualquier parte de la región de borde del cliente que no seincluya en la región de borde por omisión no se incluye en la región de borde efectiva en la ventana. Estosignifica que los gestores de ventanas (u otros gestores de geometría) acostumbrados a manejarventanas de clientes rectangulares pueden imponer la limitación al cliente de un área rectangular de laventana.

La construcción de la región de borde efectiva es dinámica; no se transforma la región de borde delcliente para obtener la región de borde efectiva. Si se especifica una región de borde de cliente quesupera la región de borde por omisión actual, y luego se aumenta la ventana, la región de borde efectivase aumentará a fin de incluir mayor parte de la región de borde del cliente.

La región de recorte efectiva de una ventana está definida como la intersección de la región de recortedel cliente con la región de recorte por omisión y con la región de borde del cliente. Cualquier parte de laregión de recorte del cliente que no se incluya en la región de recorte por omisión y en la región de bordedel cliente no se incluirá en la región de recorte efectiva en la pantalla.

La construcción de la región de recorte efectiva es dinámica; no se transforma la región de recorte delcliente para obtener la región de recorte efectiva. Si se especifica una región de recorte del cliente que vamás allá de la región de recorte por omisión actual, y luego se aumenta la ventana o su región de borde,la región de recorte efectiva se aumentará para incluir mayor parte de la región de recorte del cliente siesta se incluye en la región de borde efectiva.

El borde de una ventana se define como la diferencia entre la región de borde efectiva y la región derecorte efectiva. Si esta región está vacía, no se muestra ningún borde. Si esta región no está vacía, elborde se rellena utilizando el mosaico de borde o el pixel de borde de la ventana, tal como estéespecificado en el protocolo de núcleo (Core). Tenga en cuenta que una ventana con una anchura deborde distinta de cero nunca podrá mostrarse más allá de la región de recorte por omisión de la ventana.

Capítulo 5. Utilización de las extensiones en AIXwindows 43

Page 56: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Tenga también en cuenta que una anchura de borde de cero no evita que una ventana tenga borde,puesto que la forma del recorte se puede hacer más pequeña que la forma del borde.

Toda la salida en la ventana y las regiones visibles de cualquier subventana se colocarán en la región derecorte efectiva. El servidor no debe retener el contenido de una ventana más allá de la región de bordeefectiva con almacenamiento de reserva. El origen de la ventana (en operaciones gráficas, colocación enmosaico del fondo y colocación de subventanas) no se ve afectado por la existencia de una región deborde o una región de recorte.

Las áreas que quedan dentro de la región de borde por omisión pero fuera de la región de borde efectivano forman parte de la ventana; estas áreas de la pantalla serán ocupadas por otras ventanas. Lossucesos de entrada que se produzcan dentro de la región de borde por omisión pero fuera de la región deborde efectiva se suministrarán como si la ventana no estuvieran ocluyendo la posición de los sucesos.Los sucesos que se producen en un borde no rectangular de una ventana se suministrará a dichaventana, como los sucesos que se producen en un borde rectangular normal.

Una ventana InputOnly puede tener definida su región de bordes, pero se producirá un error Match alintentar definir una región de recorte en una ventana InputOnly o al especificar su región de recorte comoorigen de una petición en esta extensión.

El servidor debe aceptar cambios en la región de recorte de una ventana raíz, pero el servidor puedepasar por alto cambios solicitados en la región de borde de una ventana raíz. Si el servidor aceptacambios en la región de borde, el contenido de la pantalla exterior a la región de borde depende de laimplementación.

TiposSe utilizan los siguientes tipos en las definiciones de peticiones y de sucesos en las siguientes secciones:SHAPE_KIND:

{Bounding,Clip}

SHAPE_OP:{Set,Union,Intersect,Subtract,Invert}

Set Indica que la región especificada como origen explícito en la petición se almacena sin modificarcomo la nueva región de cliente de destino.

Union Indica que las regiones de origen y de destino están conectadas para generar la nueva región decliente de destino.

Intersect Indica que las regiones de origen y de destino se interseccionan para generar la nueva región decliente de destino.

Subtract Indica que la región de origen se resta de la región de destino para generar la nueva región dedestino.

Invert Indica que la región de destino se resta de la región de origen para generar la nueva región dedestino.

Enlaces del lenguaje CLas rutinas del Lenguaje C proporcionan acceso directo al protocolo y no añaden semántica adicional.

Todos los procedimientos y las funciones de extensión XShape y todas las macros y constantesmanifiestas empiezan con la serie ″XShape″. Todas las rutinas que tienen el tipo de retorno Statusdevolverán valores distintos de cero para indicar una función satisfactoria y el valor cero para indicar unafunción anómala. Aunque se soporte la Extensión XShape , puede que el servidor retire estos recursos deforma arbitraria; en dicho caso devolverán a partir de este momento el valor cero.

44 Guía de programación de AIXwindows

Page 57: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

La Extensión XShape incluye las rutinas de Lenguaje C siguientes:

v XShapeQueryExtension

v XShapeQueryVersion

v XShapeCombineRegion

v XShapeCombineRectangles

v XShapeCombineMask

v XShapeCombineShape

v XShapeOffsetShape

v XShapeQueryExtents

v XShapeSelectInput

v XShapeInputSelected

v XShapeGetRectangles

Extensión de protector de pantalla de AIXwindows

AIXwindows ofrece soporte para cambiar la imagen de una pantalla una vez pasado el periodo deinactividad definido por el usuario a fin de evitar que se quemen los fósforos del tubo de rayoscatódicos.Sin embargo, no se ofrece ninguna interfaz para que el usuario controle la imagen que aparece.Esta extensión permite que un cliente ’’protector de pantalla’’ externo detecte el momento en que se debemostrar la imagen alternativa y que suministre gráficos.

Las implementaciones actuales de servidor X suelen ofrecer al menos un formato de imagen de ’’protectorde pantalla’’. Tradicionalmente, esta imagen es una copia del dibujo del logo de X sobre la trama de fondooriginal. Sin embargo, muchos usuarios han solicitado mecanismos que les permitan escribir programasde protector de pantalla a fin de disponer de una capacidad similar a la que ofrecen otros sistemas deventanas. En particular, estos usuarios normalmente desean poder mostrar los logos de sus empresas,instrucciones sobre cómo reactivar la pantalla y programas de utilidad de bloqueo automático de pantalla.Esta extensión ofrece los medios para escribir estas aplicaciones.

Se puede utilizar la petición de protocolo nuclear SetScreenSaver para definir el período de tiempo sinactividad en cualquier dispositivo de entrada, tras el cual el protector de pantalla se debe ’’activar’’ yalterar la imagen en la pantalla. Esta imagen se emite en ’’ciclos’’ periódicos a fin de reducir el intervalode tiempo en que está iluminado cualquier determinado pixel. Finalmente, el protector de pantalla se’’desactiva’’ como respuesta a actividad en cualquiera de los dispositivos de entrada o peticiones Xdeterminadas.

La protección de pantalla se suele realizar inhabilitando la salida de vídeo al tubo de pantalla o dibujandouna trama cambiante en la pantalla. Si el servidor selecciona este último método, se crea una ventanacon un identificador especial y se correlaciona al principio del orden de pila, lugar en el que permanecehasta que se desactiva el protector de pantalla. En este momento, la ventana se descorrelaciona y nopuede acceder a la misma ninguna petición de cliente.

El mecanismo por omisión del servidor recibe el nombre de protector de pantalla interno. Un cliente deprotector de pantalla externo necesita los medios para determinar el identificador de pantallacorrespondiente a la ventana protectora de pantalla y para definir los atributos (es decir, el tamaño, laubicación, el visual y el mapa de colores) a utilizar cuando se correlaciona la pantalla. Estos requisitosforman la base de esta extensión.

PresupuestosEsta extensión exporta la base de una ventana protectora de pantalla especial que se correlaciona sobrelas demás ventanas de la pantalla. Esta ventana tiene definido el atributo override-redirect de modo que

Capítulo 5. Utilización de las extensiones en AIXwindows 45

Page 58: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

no está sujeta a la manipulación por parte del gestor de ventanas. Además, las peticiones de protocoloQueryTree de la ventana raíz nunca devuelven el identificador X correspondiente a la ventana, así queéste no suele ser visible para los demás clientes.

TiposAdemás de los tipos comunes descritos en el protocolo de núcleo (core), se utiliza el siguiente tipo en lasdefiniciones de peticiones y de sucesos en las siguientes secciones.

Nombre Valor

SCREENSAVEREVENT {ScreenSaverNotify, ScreenSaverCycle}

ErroresLa extensión de protector de pantalla no añade errores al protocolo de núcleo.

PeticionesLa extensión de protector de pantalla añade las siguientes peticiones:ScreenSaverQueryVersion

client-major-version: CARD8client-minor-version: CARD8

->server-major-version: CARD8server-minor-version: CARD8

Esta petición permiten al cliente y al servidor determinar la versión del protocolo que se tiene que utilizar.El cliente envía la versión que prefiere; si el servidor comprende dicha versión, devuelve los mismosvalores e interpreta las siguientes peticiones para esta extensión de acuerdo con la versión especificada.De lo contrario, el servidor devuelve la versión más cercana del protocolo a la que da soporte e interpretalas siguientes peticiones de acuerdo con dicha versión. Este documento describe la versión 1 mayor, laversión 0 menor; los números de revisión mayor y menos sólo se deben aumentar como respuesta acambios incompatibles o compatibles, respectivamente.ScreenSaverQueryInfo

drawable: DRAWABLE->saver-window: WINDOWstate: {Disabled, Off, On}kind: {Blanked, Internal, External}til-or-since: CARD32idle: CARD32event-mask: SETofSCREENSAVEREVENTErrors: Drawable

Esta petición devuelve información sobre el estado del protector de pantalla en la pantalla asociada aldrawable. La ventana protectora es el tipo XID asociado a la ventana protectora de pantalla. No estágarantizado que esta ventana exista, excepto cuando está activo el protector de pantalla externo. Aunquees hijo de la ventana raíz, las peticiones de protocolo QueryTree no devuelven esta ventana en laraíz.Cuando se correlaciona esta ventana, siempre está por encima de sus semejantes en el orden depila.

El campo de estado especifica si el protector de pantalla está o no actualmente activo y el modo en quese debe interpretar el valor til-or-since:

Off Actualmente no se está protegiendo la pantalla; til-or-since especifica el número de milisegundos enque se espera que se activará el protector de pantalla.

On Actualmente se está protegiendo la pantalla; til-or-since especifica el número de milisegundos quehan pasado desde que se activó el protector de pantalla.

46 Guía de programación de AIXwindows

Page 59: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Disabled El protector de pantalla está inhabilitado; til-or-since es cero.

El campo kind especifica el mecanismo que se está utilizando actualmente o que se usaría si seprotegiera la pantalla:

Blanked Se ha inhabilitado la señal de vídeo del monitor de pantalla.Internal Se ha mostrado una imagen de protector de pantalla incorporada, independiente del servidor; ningún

cliente ha definido los atributos de la ventana protectora de pantalla o bien otro cliente habíacapturado el servidor cuando se activó el protector de pantalla.

External La ventana protectora de pantalla se correlacionó con los atributos definidos por un cliente utilizandola petición ScreenSaverSetAttributes.

El campo idle especifica el número de milisegundos transcurridos desde que se recibió la última entradadel usuario en cualquiera de los dispositivos de entrada.

El campo event-mask especifica los sucesos de protección de pantalla que ha solicitado el cliente, si hayalguno, utilizando la función ScreenSaverSelectInput .

Si el drawable no es un identificador de drawable válido, se devuelve un error Drawable y se pasa poralto la petición.ScreenSaverSelectInput

drawable: DRAWABLEevent-mask: SETofSCREENSAVEREVENT

Errors: Drawable, Match

Esta petición especifica qué sucesos de extensión de protector de pantalla se deben generar en lapantalla asociada al drawable para este cliente. Si no se define ningún bit en el campo eventmask, no segenera ningún suceso.De lo contrario, se puede definir cualquier combinación de los siguientes bits:

ScreenSaverNotify Si se ha definido este bit, se generan sucesos ScreenSaverNotify cuando seactiva o desactiva el protector de pantalla.

ScreenSaverCycle Si se ha definido este bit, se generan sucesos ScreenSaverNotify cuando pasa elintervalo del ciclo del protector de pantalla.

Si el drawable no es un identificador de drawable válido, se devuelve un error Drawable . Si se ha definidoalgún bit no definido en el campo event-mask, se devuelve un error Value .Si se devuelve un error, lapetición se pasa por alto.ScreenSaverSetAttributes

drawable: DRAWABLEclass: {InputOutput, InputOnly, CopyFromParent}depth: CARD8visual: VISUALID or CopyFromParentx, y: INT16width, height, border-width: CARD16value-mask: BITMASKvalue-list: LISTofVALUE

Errors: Access, Window, Pixmap, Colormap, Cursor, Match,Value, Alloc

Esta petición define los atributos que desea ver este cliente al crear la ventana protectora de pantalla enla pantalla asociada al drawable. Si otro cliente tiene actualmente los atributos definidos, se genera unerror Access y se pasa por alto la petición.

Capítulo 5. Utilización de las extensiones en AIXwindows 47

Page 60: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

De lo contrario, se comprueban los atributos de ventana especificados como si se utilizasen en unapetición de protocolo CreateWindow de núcleo cuyo padre es el raíz. El campo overrideredirect sepasa por alto puesto que se ha definido de forma implícita con el valor True. Si los atributos de la ventanageneran un error de acuerdo con las reglas de la petición de protocolo CreateWindow , se pasa por altola petición.

De lo contrario, los atributos se almacenan y entran en vigor en la próxima activación que se produzcacuando el servidor no esté capturado por otro cliente. Los recursos especificados para los atributosbackground-pixmap o cursor se pueden liberar de inmediato. El servidor puede realizar una copia losrecursos background-pixmap o cursor o los puede utilizar tal cual; por lo tanto, el efecto de cambiar elcontenido de estos recursos es indefinido. Si el valor colormap especificado ya no existe cuando se activael protector de pantalla, se utiliza el valor colormap del padre en su lugar. Si esta petición no generaningún error, se liberan los atributos de ventana protectora de pantalla anteriormente definidos por estecliente.

La próxima vez que se active el protector de pantalla, si el servidor no está capturado por otro cliente, secrea la ventana del protector de pantalla, si hace falta, se definen sus atributos especificados y segeneran los sucesos como de costumbre. Se instala el mapa de colores asociado a la ventana delprotector de pantalla. Finalmente, se correlaciona la ventana del protector de pantalla.

La ventana permanece correlacionada y en la parte superior de la pila hasta que se desactiva el protectorde pantalla en respuesta a la actividad de cualquiera de los dispositivos de entrada del usuario, unapetición de protocolo ForceScreenSaver con el valor Reset o cualquier petición que cause que sedescorrelacione la ventana.

Si se activa el protector de pantalla mientras el servidor está capturado por otro cliente, se utiliza elmecanismo protector interno. Se puede utilizar la petición ForceScreenSaver con el valor Active paradesactivar el protector interno y activar el protector externo.

Si se interrumpe la conexión del cliente del protector de pantalla mientras el protector de pantalla estáactivado y la modalidad de cierre del cliente no es Retención permanente o Retención temporal, sedesactiva el protector de pantalla actual y se activa de inmediato el protector de pantalla interno.

Cuando se desactiva el protector de pantalla, se desinstala el mapa de colores de la ventana del protectorde pantalla y la ventana se descorrelaciona (excepto en el caso que se describe a continuación). El XIDdel protector de pantalla de desasocia de la ventana y es posible (aunque no necesario) que el servidordestruya la ventana y sus posibles hijos. Si se desactiva el protector de pantalla y luego se reactiva deinmediato (por ejemplo, cuando se conmutan protectores de pantalla) es posible que el servidor deje laventana del protector de pantalla correlacionada (normalmente para evitar riesgos).ScreenSaverUnsetAttributes

drawable: DRAWABLEErrors: Drawable

Esta petición notifica al servidor que este cliente ya no desea controlar la ventana del protector depantalla. Si el protector de pantalla no está activo, se debe liberar de inmediato cualquier atributo deprotector de pantalla definido por este cliente y los descendientes de la ventana del protector de pantallacreados por este cliente; de lo contrario, se hará cuando se desactive.

Se pasa por alto la petición si el cliente no ha definido anteriormente los atributos de la ventana delprotector de pantalla.

SucesosLa extensión de protector de pantalla añade un suceso:ScreenSaverNotify

root: WINDOW

48 Guía de programación de AIXwindows

Page 61: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

window: WINDOWstate: {Off, On, Cycle}kind: {Blanked, Internal, External}forced: BOOLtime: TIMESTAMP

Este suceso se suministra a los clientes que han solicitado sucesos ScreenSaverNotify mediante lapetición de protocolo ScreenSaverSelectInput siempre que se activa o se desactiva el protector depantalla.

El campo root especifica la ventana raíz de la pantalla para la que se ha generado el suceso. El campowindow especifica el valor que devuelve la función ScreenSaverQueryInfo como el identificador de laventana del protector de pantalla.No hace falta que exista esta ventana si el protector de pantalla externono está activo.

El campo state especifica la causa del suceso:

Off El protector de pantalla se ha desactivado; se envía este suceso si el cliente ha definido el bitScreenSaverNotify en su máscara de suceso.

On Se ha activado el protector de pantalla. Se envía este suceso si el cliente ha definido el bitScreenSaverNotify en su máscara de suceso.

Cycle Ha pasado el intervalo del ciclo y se espera que el cliente cambie la imagen de la pantalla. Se envía estesuceso si el cliente ha definido el bit ScreenSaverCycle en su máscara de suceso.

Si el campo state está definido como On u Off, forced indica si una petición de protocoloForceScreenSaver de núcleo de memoria ha causado o no la activación o la desactivación; de locontrario, forced se define con el valor False. El campo kind especifica el mecanismo que se ha utilizadopara guardar la pantalla cuando se activó el protector de pantalla, tal como se describe en la funciónScreenSaverQueryInfo .

El campo time indica la hora del servidor cuando se generó el suceso.

Tipos comunesSETofSCREENSAVEREVENT

#x00000001ScreenSaverNotifyMask#x00000002ScreenSaverCycleMask

PeticionesScreenSaverQueryVersion

1 CARD8 opcode del protector de pantalla1 0 opcode menor2 2 longitud de la petición1 CARD8 versión mayor del cliente1 CARD8 versión menor del cliente2 no utilizado

->1 1 Respuesta

1 no utilizado2 CARD16 número de secuencia4 0 longitud de la respuesta1 CARD8 versión mayor del servidor1 CARD8 versión menor del servidor22 no utilizado

ScreenSaverQueryInfo1 CARD8 opcode del protector de pantalla1 1 opcode menor2 2 longitud de la petición

Capítulo 5. Utilización de las extensiones en AIXwindows 49

Page 62: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

4 DRAWABLE drawable asociado a la pantalla

->1 1 Respuesta1 CARD8 estado

0 Off1 On3 Disabled

2 CARD16 número de secuencia4 0 longitud de la respuesta4 WINDOW ventana protectora4 CARD32 milisegundos hasta protector o desde protector4 CARD32 milisegundos desde última entrada de dispositivos de usuario4 SETofSCREENSAVEREVENTevent máscara1 CARD8 tipo

0 Blanked1 Internal2 External

10 no utilizado

ScreenSaverSelectInput1 CARD8 opcode del protector de pantalla1 2 opcode menor2 3 longitud de la petición4 DRAWABLE drawable asociado a la pantalla4 SETofSCREENSAVEREVENTevent máscara

ScreenSaverSetAttributes1 CARD8 opcode del protector de pantalla1 3 opcode menor2 6+n longitud de la petición4 DRAWABLE drawable asociado a la pantalla2 INT16 x2 INT16 y2 CARD16 anchura2 CARD16 altura2 CARD16 anchura-borde1 clase

0 CopyFromParent1 InputOutput2 InputOnly

1 CARD8 profundidad4 VISUALID visual

0 CopyFromParent4 BITMASK valor-máscara (n bits definidos en 1)

las codificaciones son iguales a las de CreateWindow de imagen de memoria4n LISTofVALUE lista-valores

las codificaciones son iguales a las de CreateWindow de imagen de memoria

ScreenSaverUnsetAttributes1 CARD8 opcode del protector de pantalla1 4 opcode menor2 3 longitud de la petición4 DRAWABLE drawable asociado a la pantalla

SucesosScreenSaverNotify

1 CARD8 código asignado por la imagen de memoria (core)1 CARD8 estado

0 Off1 On2 Cycle

2 CARD16 número de secuencia4 TIMESTAMP hora4 WINDOW raíz

50 Guía de programación de AIXwindows

Page 63: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

4 WINDOW ventana del protector de pantalla1 CARD8 tipo

0 Blanked1 Internal2 External

1 BOOL forzado14 no utilizado

Convenios de comunicaciones entre clientesLos clientes del protector de pantalla deben crear por lo menos un valor de recurso cuyo identificadorpueda almacenarse en una propiedad denominada _SCREEN_SAVER_ID en la raíz de cada pantalla quegestiona. Esta propiedad debe tener un valor de 32 bits correspondiente al identificador del recurso; eltipo de propiedad debe indicar el tipo del recurso y debe ser uno de los siguientes: WINDOW, PIXMAP,CURSOR, FONT, COLORMAP .

Enlaces del lenguaje CLos enlaces C de esta extensión simplemente ofrecen acceso al protocolo; no añaden semántica a ladescrita anteriormente.

El archivo de inclusión correspondiente a esta extensión es X11/extensions/scrnsaver.h.BoolXScreenSaverQueryExtension (Display,EventBase,ErrorBase)

Display *display;int *event_base; /* RETURN */int *error_base; /* RETURN */

Esta rutina devuelve el valor True si la pantalla especificada da soporte a la extensión del protector depantalla (SCREEN-SAVER); de lo contrario, devuelve el valor False. Si se da soporte a la extensión, elnúmero de suceso correspondiente a las funciones de sucesos ScreenSaverNotify se devuelve en elvalor al que apunta el parámetro EventBase.Puesto que esta extensión no define errores adicionales, losresultados del parámetro ErrorBase no están definidos.StatusXScreenSaverQueryVersion (Display, Major, Minor)

Display *display;int *major; /* RETURN */int *minor; /* RETURN */

Si la pantalla especificada da soporte a la extensión, los números de versión del protocolo esperado porel servidor se devuelven en los parámetros Major y Minor y se devuelve un valor distinto de cero. De locontrario, no se definen estos argumentos y se devuelve el valor 0 (cero).XScreenSaverInfo *XScreenSaverAllocInfo ()

Esta rutina asigna y devuelve una estructura XScreenSaverInfo para utilizarla en las llamadas a lafunción XScreenSaverQueryInfo . Todos los campos de la estructura se inicializan en cero. Si no haysuficiente memoria disponible, se devuelve un valor Nulo. Los resultados de esta rutina se pueden liberarutilizando la función XFree.StatusXScreenSaverQueryInfo (display, drawable, saver_info)

Display *display;Drawable drawable;XScreenSaverInfo *saver_info; /* RETURN */

Si la pantalla especificada da soporte a la extensión, se devuelve información acerca del estado actual delprotector de pantalla en saver_info y se devuelve un valor distinto de cero . La estructura deXScreenSaverInfo es la siguiente:

Capítulo 5. Utilización de las extensiones en AIXwindows 51

Page 64: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

typedef struct {Window window; /* ventana del protector de pantalla */int state; /*

ScreenSaver{Off,On,Disabled} */int /* ScreenSaver{Blanked,Internal,External} */unsigned long til_or_since; /* milisegundos */unsigned long idle; /* milisegundos */unsigned long event_mask; /* sucesos */

} XScreenSaverInfo;

Consulte la petición de protocolo ScreenSaverQueryInfo para ver una descripción de los campos. Si nose da soporte a la extensión, no se modifica la variable de estructura saver_info y se devuelve un 0.voidXScreenSaverSelectInput (display, drawable, event_mask)

Display *display;Drawable drawable;unsigned long event_mask;

Si la pantalla especificada da soporte a la extensión, la rutina solicita que se generen para este clienteaquellos sucesos relacionados con el protector de pantalla. El formato de los sucesos generados es elsiguiente:typedef struct {int type; /* del suceso */

unsigned long serial; /* núm. de la última petición *//* procesada por el servidor */

Bool send_event; /* true si procede de una *//* petición SendEvent */

Display *display; /* Pantalla de la que procede el suceso */Window window; /* ventana del protector de pantalla */Window root; /* ventana raíz de la pantalla de sucesos */int state; /* ScreenSaver{Off,On,Cycle} */int kind; /*

ScreenSaver{Blanked,Internal,External} */Bool forced; /* extensiones de nueva región */Time time; /* indicación horaria del suceso */

} XScreenSaverNotifyEvent;

Consulte la definición de la petición de protocolo ScreenSaverSelectInput para ver descripciones de lasmáscaras de suceso permitidas.voidXScreenSaverSetAttributes (display, drawable, x, y, width, height, border_width,depth, class, visual,

valuemask, attributes)Display *dpy;Drawable drawable;int x;int y;unsigned int width;unsigned int height;unsigned int border_width;int depth;unsigned int class;Visual *visual;unsigned long valuemask;XSetWindowAttributes *attributes;

Si la pantalla especificada da soporte a la extensión, esta rutina define los atributos que se utilizarán lapróxima vez que se active el protector de pantalla externo. Consulte la definición de la petición deprotocolo ScreenSaverSetAttributes para ver una descripción de cada uno de los argumentos.voidXScreenSaverUnsetAttributes (display, drawable)

Display *display;Drawable drawable;

52 Guía de programación de AIXwindows

Page 65: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Si la pantalla especificada da soporte a la extensión, esta rutina indica al servidor que elimine los atributosanteriores de la ventana de protector de pantalla definidos por este cliente.StatusXScreenSaverRegister (display, screen, xid, type)

Display *display;int screen;XID xid;Atom type;

Esta rutina almacena el XID definido en la propiedad _SCREEN_SAVER_ID (del tipo indicado) en laventana raíz de la pantalla especificada. Devuelve un 0 (cero) si se encuentra un error y no se modifica lapropiedad; de lo contrario; devuelve un valor distinto de cero.StatusXScreenSaverUnregister (display, screen)

Display *display;int screen;

Esta rutina elimina cualquier propiedad _SCREEN_SAVER_ID de la ventana raíz de la pantallaespecificada. Devuelve un 0 (cero) si se encuentra un error y se modifica la propiedad; de lo contrario,devuelve un valor distinto de cero.StatusXScreenSaverGetRegistered (display, screen, xid, type)

Display *display;int screen;XID *xid; /* RETURN */Atom *type; /* RETURN */

Esta rutina devuelve el XID y el tipo almacenados en la propiedad _SCREEN_SAVER_ID en la ventanaraíz de la pantalla especificada. Devuelve un 0 (cero) si se encuentra un error o si la propiedad no existeo no tiene el formato correcto; de lo contrario, devuelve un valor distinto de cero.

Utilización de las funciones de dispositivo de entrada de AIXwindows

Puede utilizar las funciones de dispositivo de entrada de Xlib para realizar las siguientes acciones:

v Capturar el puntero y los botones del puntero.

v Capturar el teclado y las teclas del teclado.

v Mover el puntero.

v Definir el enfoque de entrada.

v Manipular los valores del teclado y del puntero.

v Manipular la codificación del teclado.

Captura del punteroXlib ofrece funciones que puede utilizar para controlar la entrada procedente del puntero, que suele ser unratón. Normalmente, cuando se produce un suceso en el teclado o en el ratón, el servidor X los pasa alcliente adecuado, el cual se determina mediante la ventana y el enfoque de entrada. El servidor X ofrecesuficiente control sobre el suministro de sucesos como para permitir que los gestores de ventanas densoporte al movimiento anticipado del ratón y a otros estilos de interfaz de usuario. Muchas de estasinterfaces de usuario dependen del suministro síncrono de sucesos. El suministro de sucesos de punteroy de ratón se puede controlar de forma independiente.

Cuando se capturan botones del ratón o teclas del teclado, los sucesos se envían al cliente que haefectuado la captura, en lugar de enviarse al cliente normal que recibiría el suceso. Si el teclado o elpuntero están en modalidad asíncrona, se seguirán procesando sucesos del ratón y del teclado. Si elteclado o el puntero están en modalidad síncrona, no se procesan más sucesos hasta que lo permita el

Capítulo 5. Utilización de las extensiones en AIXwindows 53

Page 66: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

cliente que ha efectuado la captura (consulte XAllowEvents ). Se considera que el teclado o el punteroestán ″congelados″ durante este intervalo. También se puede reproducir el suceso que desencadenó laacción.

Nota: El estado lógico de un dispositivo (desde el punto de vista de las aplicaciones cliente) puederetardar el estado físico si el suceso de dispositivo que está procesando está congelado.

Hay dos tipos de capturas: activa y pasiva. Una captura activa se produce cuando un solo cliente capturade forma explícita el teclado y/o el puntero (consulte las funciones XGrabPointer y XGrabKeyboard ).Una captura pasiva se produce cuando clientes capturan una tecla determinada del teclado o un botón delpuntero de una ventana, y la captura se activa cuando realmente se pulsa la tecla o el botón. Lascapturas pasivas resultan útiles para implantar menús emergentes fiables. Por ejemplo, puede asegurarsede que el menú emergente se correlaciona antes de que se produzca el suceso de botón de punterohacia arriba capturando un botón y solicitando un comportamiento síncrono. El suceso del botón delpuntero hacia abajo desencadenará la captura y congelará el proceso de sucesos del puntero hasta queel usuario pueda correlacionar la ventana emergente. Luego puede permitir que se sigan procesandosucesos. A continuación se procesará correctamente el suceso del botón del puntero hacia arriba conrelación a la ventana emergente.

Para muchas de las operaciones, existen funciones que toman un argumento horario. El servidor Xincluye una indicación horaria en varios sucesos. Una indicación horaria especial, denominadaCurrentTime, representa la hora actual del servidor.El servidor X mantiene la hora de cuando se modificópor última vez el enfoque de entrada, de cuando se capturó por última vez el teclado, de cuando secapturó por última vez el puntero o de cuando se modificó por última vez una selección. Puede que laaplicación reaccione con lentitud ante un suceso. En ocasiones necesitará un modo de especificar que lapetición no se produzca si mientras tanto otra aplicación ha tomado el control del teclado, del puntero ode una selección. Al suministrar una indicación horaria procedente del suceso en la petición, puede definirque la operación no tenga efecto si alguien ha realizado mientras tanto una operación.

Una indicación horaria es un valor horario, expresado en milisegundos. Suele ser el tiempo transcurridodesde el último restablecimiento del servidor. Los valores de indicación horaria se inicializan (transcurridosaproximadamente 49,7 días). Suponiendo que su hora actual se represente mediante la indicación horariaT, el servidor siempre interpreta las indicaciones horarias de los clientes tratando la mitad del espacio dela indicación horaria como posterior a T. El servidor nunca genera un valor de indicación horariadenominado CurrentTime. Este valor está reservado para que se utilice en peticiones y represente la horaactual del servidor.

Se utilizan las siguientes funciones para capturar el puntero:

Función DescripciónXGrabPointer Captura el control del puntero.XUngrabPointer Libera el puntero.XChangeActivePointer Grab Cambia los parámetros dinámicos especificados.XGrabButton Captura un botón del puntero.XUngrabButton Libera un botón del puntero.

En muchas de las funciones que sirven para capturar el puntero, el usuario pasa bits de máscara desucesos del puntero. A continuación se mencionan los bits de máscara de sucesos del puntero válidos:

v ButtonPressMask

v ButtonReleaseMask

v EnterWindowMask

v LeaveWindowMask

v PointerMotionMask

v PointerMotionHintMask

54 Guía de programación de AIXwindows

Page 67: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

v Button1MotionMask

v Button2MotionMask

v Button3MotionMask

v Button4MotionMask

v Button5MotionMask

v ButtonMotionMask

v KeyMapStateMask

Para otras funciones que sirven para capturar el puntero, el usuario pasa bits de máscara clave. Los bitsde máscara clave válidos son los siguientes:

v LockMask

v ControlMask

v Mod1Mask

v Mod2Mask

v Mod3Mask

v Mod4Mask

v Mod5Mask

Captura del tecladoXlib ofrece las siguientes funciones que puede utilizar para capturar el teclado o para liberar la captura delmismo y para permitir sucesos:

Función DescripciónXGrabKeyboard Captura el teclado.XUngrabKeyboard Libera el teclado.XGrabKey Captura de forma pasiva una sola tecla del teclado.XUngrabKey Libera la combinación de teclas de la ventana especificada.

Para muchas de las funciones que sirven para capturar el teclado, el usuario pasa bits de máscara clave.Los bits de máscara clave válidos son los siguientes:

v ShiftMask

v LockMask

v ControlMask

v Mod1Mask

v Mod2Mask

v Mod3Mask

v Mod4Mask

v Mod5Mask

Reanudación del proceso de sucesosUtilice la función XAllowEvents para reanudar el proceso de sucesos. Esta función permite que seprocesen más sucesos cuando se ha congelado el dispositivo.

Movimiento del punteroAunque el control del movimiento del puntero se suele dejar al usuario final, a veces resulta necesariomover el puntero a una nueva posición bajo el control de un programa. Utilice la función XWarpPointerpara mover el puntero a un punto arbitrario de una ventana.

Capítulo 5. Utilización de las extensiones en AIXwindows 55

Page 68: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Control del enfoque de entradaXlib ofrece funciones que puede utilizar para definir y obtener el enfoque de entrada. El enfoque deentrada es un recurso compartido y, para que la interacción funcione correctamente, los clientes debencooperar. Consulte la publicación Inter-Client Communication Conventions Manual (ICCCM) para verinformación sobre la política del enfoque de entrada. Utilice las siguientes funciones para controlar elenfoque de entrada:

Función DescripciónXSetInputFocus Cambia el enfoque de entrada y la hora del último cambio de enfoque.XGetInputFocus Obtiene el enfoque de entrada actual.

Valores de teclado y de punteroXlib ofrece funciones que puede utilizar para cambiar el control del teclado, obtener una lista de las teclasde repetición automática, activar o desactivar la repetición automática, hacer sonar la campana, definir uobtener la correlación de teclado o de botón de puntero y obtener un vector de bits correspondiente alteclado.

Esta sección trata sobre las opciones de preferencias del usuario sobre campana, pulsación de teclas,comportamiento del puntero, etc. Los valores por omisión de muchas de estas funciones se determinanmediante argumentos de línea de mandatos en el servidor X y, en sistemas que se adaptan a POSIX,suelen estar definidas en el archivo /etc/ttys . No todas las implantaciones podrán controlar realmentetodos estos parámetros.

Utilice las siguientes funciones para controlar los valores del teclado y del puntero:

Función DescripciónXChangeKeyboardControl Cambia el control de un teclado.XGetKeyboardControl Obtiene los valores actuales de control del teclado.XAutoRepeatOn Activa la función de repetición automática del teclado.XAutoRepeatOff Desactiva la función de repetición automática.XBell Hace sonar una campana.XQueryKeymap Obtiene un vector de bits que describe el estado del teclado.XSetPointerMapping Define la correlación de botones del puntero.XGetPointerMapping Obtiene la correlación del puntero.XChangePointerControl Controla el comportamiento interactivo del puntero.XGetPointerControl Obtiene los parámetros actuales del puntero.

La función XChangeKeyboardControl opera en una estructura XKeyboardControl:/* Bits de máscara de ChangeKeyboardControl */#define KBKeyClickPercent (1L<<0)#define KBBellPercent (1L<<1)#define KBBellPitch (1L<<2)#define KBBellDuration (1L<<3)#define KBLed (1L<<4)#define KBLedMode (1L<<5)#define KBKey (1L<<6)#define KBAutoRepeatMode (1L<<7)/* Valores */

typedef struct {int key_click_percent;int bell_percent;int bell_pitch;int bell_duration;int led;int led_mode; /* LedModeOn, LedModeOff */int key;

56 Guía de programación de AIXwindows

Page 69: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

int auto_repeat_mode; /* AutoRepeatModeOff,AutoRepeatModeOn,AutoRepeatModeDefault */

} XKeyboardControl;

El miembro key_click_percent define el volumen de las pulsaciones de teclas, entre 0 (desactivado) y 100(alto) inclusive, a ser posible. El valor \-1 restaura el valor por omisión. Otros valores negativos generanun error BadValue .

El miembro bell_percent define el volumen base de la campana, entre 0 (desactivado) y 100 (alto)inclusive, a ser posible. El valor \-1 restaura el valor por omisión. Otros valores negativos generan un errorBadValue . El miembro bell_pitch define el tono (especificado en Hz) de la campana, a ser posible. Elvalor \-1 restaura el valor por omisión. Otros valores negativos generan un error BadValue . El miembrobell_duration define la duración del toque de campana especificada en milisegundos, a ser posible. Elvalor \-1 restaura el valor por omisión. Otros valores negativos generan un error BadValue .

Si se especifican los miembros led_mode y led, se cambia, si es posible, el estado de dicho LED. Elmiembro led_mode puede tener los valores LedModeOn o LedModeOff . Si sólo se define el miembroled_mode, se cambia, si es posible, el estado de todos los LED. Se da soporte a un máximo de 32 LEDnumerados a partir de uno. No hay definida ninguna interpretación estándar de los LED. Si se especificaled y no se especifica led_mode, se obtiene un error BadMatch .

Si se especifican los miembros auto_repeat_mode y key, se modifica, si es posible, el valor deauto_repeat_mode de esa tecla (según AutoRepeatModeOn , AutoRepeatModeOff oAutoRepeatModeDefault). Si sólo se especifica auto_repeat_mode, se cambia, si es posible, el valorauto_repeat_mode global de todo el teclado lo cual no afecta a los valores de cada tecla. Si se especificakey y no se especifica auto_repeat_mode, se obtiene un error BadMatch . Cada tecla tiene su propiamodalidad sobre si debe o no realizar la función de repetición automática y un valor por omisióncorrespondiente a dicha modalidad. Además, hay una modalidad global sobre si se debe o no habilitar larepetición automática y un valor por omisión correspondiente a dicha modalidad. Cuando la modalidadglobal es AutoRepeatModeOn , las teclas deben obedecer a sus respectivas modalidades de repeticiónautomática. Cuando la modalidad global es AutoRepeatModeOff , ninguna tecla debe realizar la funciónde repetición automática. Una tecla que tiene habilitada la función de repetición automática generasucesos KeyPress y KeyRelease alternativos. Cuando se utiliza una tecla como modificador, es mejorque la tecla no realice la función de repetición automática, independientemente de su valor de repeticiónautomática.

Si hay un generador de campana conectado a la consola, aunque no directamente al teclado, se tratacomo si formara parte del teclado. El orden en el que se comprueban y se alternan los controles dependedel servidor. Cuando se genera un error, es posible que se haya modificado un subconjunto de controles.

Codificación del tecladoEl valor KeyCode representa una tecla física (o lógica). Los valores de KeyCode deben estarcomprendidos en el rango [8,255]. Un valor KeyCode no contiene información intrínseca, aunque losimplementadores del servidor pueden codificar la información de geometría (por ejemplo, matrices) demodo que se pueda interpretar de forma dependiente del servidor. La correlación entre teclas y KeyCodesno se puede modificar.

Un KeySym es una codificación de un símbolo del capuchón de una tecla. El conjunto de KeySymsdefinido incluye juegos de caracteres latinos ISO (1\-4), katakana, árabes, cirílicos, griegos, técnicos,especiales, de publicación, APL, hebreos y una combinación especial de teclas de teclados (Volver,Ayuda, tabulador, etc.) En la medida de lo posible, estos grupos derivan de estándares internacionales.En ciertas áreas en las que no hay estándares, algunos de estos grupos derivan de los estándares deDigital Equipment Corporation. Puede encontrar la lista de símbolos definidos en<X11/keysymdef.h >.Lamentablemente, algunos preprocesadores de C tienen límites en cuanto al número de símbolosdefinidos. Si debe utilizar KeySyms que no pertenezcan a las clases latín 1\-4, griego y combinación, es

Capítulo 5. Utilización de las extensiones en AIXwindows 57

Page 70: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

posible que tenga que definir un símbolo para estos conjuntos. La mayoría de aplicaciones suelen incluirúnicamente <X11/keysym.h >, que define símbolos para ISO Latín 1\-4, griego y varios.

Hay una lista de KeySyms asociada a cada KeyCode. Esta lista pretende expresar el grupo de símbolosen la tecla correspondiente. Si la lista (pasando por alto las entradas NoSymbol finales) es un soloKeySym K, la lista se trata como si fuera la lista K NoSymbol K NoSymbol. Si la lista (pasando por alto lasentradas NoSymbol finales) es un par de KeySyms K1 K2, la lista se trata como si fuera la lista K1 K2 K1K2. Si la lista (pasando por alto las entradas NoSymbol finales) contiene tres KeySyms K1 K2 K3, la listase trata como si fuera la lista K1 K2 K3 NoSymbol. Si se desea incluir en la lista un elemento vacíoexplícito, se puede utilizar el valor VoidSymbol.

Los cuatro primeros elementos de la lista se dividen en dos grupos de KeySyms. El grupo 1 contiene elprimer y segundo KeySym; el grupo 2 contiene el tercer y el cuarto KeySym. Dentro de cada grupo, si elsegundo elemento del grupo es NoSymbol, el grupo se debe tratar como si el segundo elemento fuera elmismo que el primero, excepto en el caso de que el primer elemento sea un KeySym ″K″ alfabético parael que se han definido formatos en mayúscula y en minúscula. En este caso, el grupo se debe tratarcomo si el primer elemento fuera el formato en minúsculas de K y el segundo fuera el formato enmayúsculas de K.

Las reglas estándar para obtener un KeySym a partir de un suceso KeyPress sólo utilizan los KeySymsde los grupos 1 y 2; no se proporciona ninguna interpretación de otros KeySyms de la lista. El estado delmodificador determina el grupo a utilizar. La conmutación entre grupos la controla el KeySym denominadoMODE SWITCH, conectando dicho KeySym a algún KeyCode y conectando dicho KeyCode a algunos delos modificadores comprendidos entre el Mod1 y el Mod5. Este modificador recibe el nombre demodificador de grupo. Para cualquier KeyCode, se utiliza el grupo 1 si el modificador de grupo estádesactivado y se utiliza el grupo 2 si el modificador de grupo está activado.

Dentro de un grupo, el estado del modificador determina también el KeySym a utilizar. Se utiliza el primerKeySym cuando los modificadores Shift y Lock están desactivados. Se utiliza el segundo KeySym cuandoel modificador Shift está activado, cuando el modificador Lock está activado y el segundo KeySym es unvalor alfabético en mayúsculas o cuando el modificador Lock está activado y se interpreta como ShiftLock.De lo contrario, cuando el modificador Lock está activado y se interpreta como CapsLock, el estado delmodificador Shift se aplica primero para seleccionar un KeySym; pero si dicho KeySym es un valoralfabético en minúsculas, se utiliza en su lugar el KeySym correspondiente en mayúsculas.

No se define ninguna geometría espacial de los símbolos en la tecla por su orden en la lista de KeySyms,aunque el proveedor puede haber definido una geometría. El servidor X no utiliza la correlación entreKeyCodes y KeySyms. Los almacena únicamente para que los clientes los puedan leer y grabar.

El modificador de KeyMask denominado Lock está pensado para ser correlacionado con una teclaCapsLock o ShiftLock; no obstante, a cuál se correlaciona se deja a elección de la aplicación o delusuario. Sin embargo, se recomienda que se determine en función del(los) KeySym(s) del KeyCodecorrespondiente.

Se utilizan las funciones siguientes para la codificación del teclado:

Función DescripciónXChangeKeyboardMapping Define los símbolos para la correlación del teclado.XDeleteModifiermapEntry Suprime una entrada de una estructura XModifierKeymap .XDisplayKeycodes Devuelve los KeyCodes legales correspondientes a una pantalla.XFreeModifiermap Destruye una estructura XModifierKeymap .XGetKeyboardMapping Devuelve los símbolos correspondientes a los KeyCodes

especificados.XGetModifierMapping Devuelve los KeyCodes que se utilizan como modificadores.XInsertModifiermapEntry Añade una nueva entrada a una estructura XModifierKeymap .XNewModifiermap Crea una estructura XModifierKeymap .

58 Guía de programación de AIXwindows

Page 71: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Función DescripciónXSetModifierMapping Define los KeyCodes a utilizar como modificadores.

Biblioteca de extensión de entrada de AIXwindows

Finalidad de la extensiónEste tema describe una extensión al servidor X11. La finalidad de esta extensión consiste en dar soporteal uso de dispositivos de entrada adicionales, además de los dispositivos de puntero y de tecladodefinidos en el protocolo X de núcleo. La primera sección contiene una visión general de la extensión deentrada. Las secciones siguientes corresponden a los capítulos 7 y 8, ″Window Manager Functions″ y″Events and Event-Handling Functions″ del manual Xlib - C Language Interface y describen cómo utilizarla extensión de entrada.

Enfoque del diseñoEl enfoque del diseño de la extensión consiste en definir funciones y sucesos análogos a las funciones ysucesos de la imagen de memoria. Esto permite que los sucesos y dispositivos de entrada de laextensión se puedan distinguir entre sí y se puedan distinguir de los sucesos y dispositivos de entrada dela imagen de memoria. Estas funciones y sucesos utilizan un identificador de dispositivo y dan soporte ala notificación de datos de movimiento de n dimensiones así como a otros datos que no se puedennotificar actualmente mediante los sucesos de entrada de la imagen de memoria.

Dispositivos de entrada de la imagen de memoriaEl protocolo de núcleo del servidor X da soporte a dos dispositivos de entrada: un puntero y un teclado. Eldispositivo de puntero cumple dos funciones principales. Primero, se puede utilizar para generarinformación de movimiento que pueden detectar los programas cliente. Segundo, se puede utilizar paraindicar la ubicación actual y enfoque del teclado X. Para ello, el servidor duplica un cursor en la posiciónactual del puntero X. A no ser que se haya enfocado de forma explícita el teclado X, este cursor muestratambién la ubicación actual y el enfoque del teclado X.

El teclado X se utiliza para generar entradas que los programas cliente pueden detectar.

En este documento se hace referencia al teclado X y al puntero X como dispositivos de imagen dememoria, mientras que los sucesos de entrada que generan (KeyPress , KeyRelease , ButtonPress ,ButtonRelease y MotionNotify ) son conocidos como sucesos de entrada de imagen de memoria. Losdemás dispositivos de entrada reciben el nombre de dispositivos de entrada de extensión y los sucesosde entrada que generan reciben el nombre de sucesos de entrada de extensión.

Nota: Esta extensión de entrada no cambia el comportamiento ni el funcionamiento de losdispositivos de entrada de imagen de memoria, los sucesos de imagen de memoria ni las peticionesde protocolos de núcleo, a excepción de las peticiones de captura de imagen de memoria. Estaspeticiones pueden afectar a la sincronización de sucesos precedentes de dispositivos de extensión.Consulte la explicación que se proporciona en la sección titulada Sincronización de sucesos ycapturas de imagen de memoria.

La selección de los dispositivos físicos que utilizará inicialmente el servidor como dispositivos de imagende memoria depende de la implementación. Existen funciones que permiten a los programas clientecambiar los dispositivos físicos a utilizar como dispositivos de imagen de memoria.

Dispositivos de entrada de extensiónLa extensión de entrada controla el acceso a dispositivos de entrada que no son el teclado X y el punteroX. Permite a los programas cliente seleccionar entradas en estos dispositivos, con independencia entre síy con independencia de los dispositivos de imagen de memoria. Los sucesos de entrada de estos

Capítulo 5. Utilización de las extensiones en AIXwindows 59

Page 72: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

dispositivos son de tipos de extensión (DeviceKeyPress , DeviceKeyRelease , DeviceButtonPress ,DeviceButtonRelease , DeviceMotionNotify , etc.) y pueden contener un identificador de dispositivo demodo que se puedan distinguir los sucesos del mismo tipo procedentes de distintos dispositivos deentrada.

Los sucesos de entrada de extensión no tienen la limitación de tamaño de los sucesos de cableado de 32bytes del servidor. El servidor puede generar los sucesos de dispositivo de entrada enviando tantossucesos de tamaño de cableado como sea necesario para devolver la información necesaria para dichosuceso. Las rutinas de reformateo de sucesos de biblioteca son las responsables de combinar lossucesos en uno más XEvents cliente.

Se puede utilizar como dispositivo de entrada de extensión un dispositivo de entrada que genere datos detecla, de ratón o de movimiento. Los dispositivos de entrada de extensión pueden tener cero o másteclas, cero o más botones y pueden notificar cero o más ejes de movimiento. El movimiento se debenotificar como movimientos relativos a partir de una posición anterior o como una posición absoluta. Todoslos evaluadores que notifiquen información correspondiente a un determinado dispositivo de entrada deextensión deben notificar el mismo tipo de información de movimiento (absoluta o relativa).

Esta extensión está diseñada para dar cabida a nuevos tipos de dispositivos de entrada que se puedanañadir en el futuro. Las peticiones de protocolo que hacen referencia a características específicas de losdispositivos de entrada organizan dicha información por clases de dispositivos de entrada . Losimplantadores del servidor pueden añadir nuevas clases de dispositivos de entrada sin modificar laspeticiones de protocolo.

Todos los dispositivos de entrada de extensión se tratan como el teclado X de imagen de memoria aldeterminar su ubicación y enfoque. El servidor no efectúa un seguimiento de la ubicación de cada uno deestos dispositivos y, por lo tanto, no duplica un cursor para indicar su ubicación actual. En su lugar, laubicación se determina a partir de la ubicación del puntero X de imagen de memoria. Al igual que elteclado X de imagen de memoria, es posible enfocar algunos de ellos de forma explícita. Si no se enfocande forma explícita, se determina su enfoque a partir de la ubicación del puntero X de imagen de memoria.

Clases de dispositivos de entradaAlgunas de las peticiones de extensión de entrada dividen los dispositivos de entrada en clases según sufunción. De este modo, se pueden definir posteriormente nuevas clases de dispositivos de entrada sintener que cambiar la semántica de estas funciones. Actualmente están definidas las siguientes clases dedispositivos de entrada:

KEY El dispositivo notifica sucesos de teclas.BUTTON El dispositivo notifica sucesos de botones.VALUATOR El dispositivo notifica datos de valoración en sucesos de movimiento.PROXIMITY El dispositivo notifica sucesos de proximidad.FOCUS Se puede enfocar el dispositivo.FEEDBACK El dispositivo da soporte a las retroalimentaciones.

También se pueden añadir clases adicionales en el futuro. Las funciones que dan soporte a varias clasesde entrada, como la función XListInputDevices que lista todos los dispositivos de entrada disponibles,organizan los datos que devuelven en clases de entrada. Los programas cliente que utilizan dichasfunciones no deben acceder a los datos a no ser que coincidan con una clase definida en el momento enque se compilaron dichos clientes. De este modo, se pueden añadir nuevas clases sin tener que volver acompilar los clientes existentes que utilizan dichas funciones.

60 Guía de programación de AIXwindows

Page 73: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Utilización de los dispositivos de entrada de extensiónUn cliente que desee acceder a un dispositivo de entrada debe hacerlo a través de las funciones debiblioteca definidas en las secciones siguientes. Una secuencia típica de peticiones que realizaría uncliente es la siguiente:

v XListInputDevices - Lista todos los dispositivos de entrada disponibles. A partir de la información quedevuelve esta petición, determinaría si el dispositivo de entrada que desea está conectado al servidor.Para ver una descripción de la petición XListInputDevices , consulte la sección titulada Lista dedispositivos disponibles.

v XOpenDevice - Solicita que el servidor abra el dispositivo para que pueda acceder al mismo estecliente. Esta petición devuelve una estructura XDevice que utiliza la mayoría de las peticiones deextensión de entrada para identificar el dispositivo especificado. Para ver una descripción de la peticiónXOpenDevice , consulte la sección titulada Habilitación e inhabilitación de dispositivos de extensión.

v Determinación de los tipos de sucesos y las clases de sucesos necesarios para seleccionar lossucesos de extensión de entrada deseados y los identifica cuando los recibe. Esto se realiza mediantemacros cuyos nombres corresponden con el suceso deseado, es decir, DeviceKeyPress . Para ver unadescripción de estas macros, consulte la sección titulada Selección de sucesos de dispositivos deextensión.

v XSelectExtensionEvent - Selecciona los sucesos deseados del servidor. Para ver una descripción dela petición XSelextExtensionEvent , consulte la sección titulada Selección de sucesos de dispositivosde extensión .

v XNextEvent - Recibe el siguiente suceso disponible. Es la función XNextEvent de imagen de memoriaque suministra la biblioteca X estándar.

Existen otras peticiones que sirven para tomar el control y enfocar dispositivos de extensión, para cambiarsus correlaciones de teclas, botones o modificadores, para controlar la propagación de sucesos deextensión de entrada, para obtener un histórico de movimiento de un dispositivo de extensión y paraenviar sucesos de extensión de entrada a otro cliente. Estas funciones se describen en las siguientessecciones.

Peticiones de extensión de bibliotecaLos programas cliente acceden a los dispositivos de entrada de extensión mediante nuevas peticiones deprotocolo. Se suministran las siguientes peticiones como extensiones de Xlib. Las constantes yestructuras a las que hacen referencia estas funciones pueden encontrarse en los archivos XI.h yXInput.h , que se han adjuntado a este documento como Apéndice A.

La biblioteca devuelve NoSuchExtension si se efectúa una petición de extensión a un servidor que no dasoporte a la extensión de entrada. Las peticiones de extensión de entrada no pueden utilizarse paraacceder a los dispositivos de teclado X y de puntero X.

Funciones del Gestor de ventanas

Cambio de los dispositivos de imagen de memoriaEstas funciones se proporcionan para cambiar cuál de los dispositivos físicos se utilizan como puntero X ocomo teclado X.

Nota: Si se utilizan estas funciones, se pueden modificar las características de los dispositivos deimagen de memoria. Es posible que el nuevo dispositivo de puntero tenga distinto número debotones que el antiguo, o puede que el nuevo dispositivo de teclado tenga un número distinto deteclas o notifique un rango distinto de códigos de teclas. Es posible que se ejecuten programascliente que dependan de estas características. Por ejemplo, un programa cliente puede asignar unamatriz basada en el número de botones del dispositivo de puntero y luego utilizar los números debotones que recibe en sucesos de botones como índices de dicha matriz. Si se cambian los

Capítulo 5. Utilización de las extensiones en AIXwindows 61

Page 74: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

dispositivos de imagen de memoria, puede que dichos programas cliente funcionen incorrectamenteo terminen de forma anómala, o puede que pasen por alto el suceso ChangeDeviceNotify generadopor dichas peticiones.

Estas funciones cambian el dispositivo de teclado X o de puntero X y generan un sucesoXChangeDeviceNotify y un suceso MappingNotify . Los dispositivos especificados pasan a ser el nuevoteclado X o el nuevo dispositivo de puntero X. La ubicación de los dispositivos de imagen de memoria nocambia como resultado de esta petición.

Estas peticiones fallan y devuelven AlreadyGrabbed si otro cliente captura el dispositivo especificado o eldispositivo de imagen de memoria. Si alguno de los dispositivos está congelado como resultado de lacaptura activa de otro cliente, estas peticiones fallan y devuelven un valor GrabFrozen .

Estas peticiones fallan con un error BadDevice si el dispositivo especificado no es válido, no se haabierto previamente mediante una petición XOpenDevice o no está soportado como un dispositivo deimagen de memoria por la implementación del servidor.

Una vez que el dispositivo ha sustituido satisfactoriamente uno de los dispositivos de imagen de memoria,se le trata como un dispositivo de imagen de memoria hasta que sea sustituido por otra peticiónChangeDevice o hasta que termine el servidor. Si termina el cliente que ha cambiado el dispositivo, ésteno vuelve a cambiar. Si se intenta utilizar la petición XCloseDevice para cerrar el nuevo dispositivo deimagen de memoria, se genera un error BadDevice .

La función XChangeKeyboardDevice se utiliza para cambiar el dispositivo físico que se utiliza comoteclado X.

La función XChangePointerDevice se utiliza para cambiar el dispositivo físico que se utiliza comopuntero X.

Sincronización de sucesos y capturas de imagen de memoriaLa implementación de la extensión de entrada necesita una extensión del significado de la sincronizaciónde sucesos para las peticiones de captura de imagen de memoria. Esto sirve para que los gestores deventanas puedan congelar todos los dispositivos de entrada con una sola petición.

Las peticiones de captura de imagen de memoria requieren un argumento PointerMode y KeyboardMode.La extensión de entrada cambia el significado de estas modalidades. En el caso de las peticionesXGrabPointer y XGrabButton , PointerMode controla la sincronización del dispositivo de puntero yKeyboardMode controla la sincronización de los demás dispositivos de entrada. En el caso de laspeticiones XGrabKeyboard y XGrabKey , PointerMode controla la sincronización de todos los dispositivosde entrada excepto del teclado X, mientras que KeyboardMode controla la sincronización del teclado.Cuando se utiliza una de las peticiones de captura de imagen de memoria, la modalidad especificadapara el dispositivo no capturado es la que controla la sincronización de los dispositivos de extensión.

Capturas activas de extensiónSe da soporte a las capturas activas de los dispositivos de extensión mediante la función XGrabDevicede la misma manera que se capturan los dispositivos de imagen de memoria utilizando la funciónXGrabKeyboard de imagen de memoria, salvo que se pasa un dispositivo como parámetro de función. Lafunción XUngrabDevice permite que se libere una captura activa anterior de un dispositivo de extensión.

Captura pasiva de botones y teclasSe da soporte a las capturas pasivas de botones y teclas en los dispositivos de extensión mediante lasfunciones XGrabDeviceButton y XGrabDeviceKey . Estas capturas pasivas se liberan mediante lasfunciones XUngrabDeviceKey y XUngrabDeviceButton .

″Descongelación ″ de un dispositivoLa función XAllowDeviceEvents permite que se procesen sucesos adicionales cuando se ha congeladoun dispositivo.

62 Guía de programación de AIXwindows

Page 75: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Control del enfoque de dispositivoSe puede determinar el enfoque actual de la ventana para un dispositivo de entrada de extensiónmediante la función XGetDeviceFocus . Los dispositivos de extensión se enfocan mediante la funciónXSetDeviceFocus del mismo modo que se enfoca un teclado mediante la función XSetInputFocus deimagen de memoria, excepto en que se pasa un ID de dispositivo como parámetro de función. Sesuministra un estado de enfoque adicional, FollowKeyboard , para los dispositivos de extensión.

Control de la retroalimentación de dispositivosLos valores actuales de retroalimentación de un dispositivo de entrada de extensión se determinanmediante la función XGetFeedbackControl . La función XFreeFeedbackList libera la lista de informaciónde control de retroalimentación que devuelve la función XGetFeedbackControl .

Los valores de retroalimentación en un dispositivo de extensión pueden modificarse mediante la funciónXChangeFeedbackControl . Esta función modifica los valores actuales de control de la retroalimentaciónespecificada utilizando la información que se pasa en la estructura XFeedbackControl adecuadacorrespondiente a la retroalimentación. Los valores que se modifican dependen de la máscara de valorque se pasa.

Hacer sonar una campana en un dispositivo de entradaSe puede definir que suene una campana en un dispositivo especificado de entrada de extensiónmediante la función XDeviceBell .

Control de la codificación de dispositivosSe puede obtener la correlación de teclado de un dispositivo de extensión que dé soporte a la clase deentrada Keys mediante la función XGetDeviceKeyMapping . La función XFree libera los datos quedevuelve la función XGetDeviceKeyMapping . La correlación de teclado de un dispositivo de extensiónque dé soporte a la clase de entrada Keys se puede modificar mediante la funciónXChangeDeviceKeyMapping .

Los códigos de teclas que se utilizan como modificadores en un dispositivo de extensión que dé soporte ala clase de entrada Keys se obtienen mediante la función XGetDeviceModifierMapping . Los códigos deteclas que se van a utilizar como modificadores de un dispositivo de extensión se definen mediante lafunción XSetDeviceModifierMapping .

Control de la correlación de botonesLa correlación de los botones en un dispositivo de extensión se define mediante la funciónXSetDeviceButtonMapping . La correlación de botones en un dispositivo de extensión se obtienemediante la función XGetDeviceButtonMapping .

Obtención del estado de un dispositivoPara obtener información que describa el estado de las teclas, botones y evaluadores de un dispositivo deextensión, utilice la función XQueryDeviceState . La función XFreeDeviceState libera los datos de estadodel dispositivo.

Funciones de sucesos y de manejo de sucesosLa extensión de entrada crea sucesos de entrada análogos a los sucesos de entrada de imagen dememoria. Estos sucesos de entrada de extensión se generan manipulando uno de los dispositivos deentrada de extensión. Las secciones siguientes describen estos sucesos y explican el modo en que unprograma cliente los puede recibir.

Tipos de sucesosLos tipos de sucesos son números enteros que puede utilizar el cliente para determinar el tipo de sucesoque ha recibido. El cliente compara el campo de tipo de la estructura de sucesos con tipos de sucesosconocidos para determinar el tipo de suceso. Los tipos de sucesos de entrada de imagen de memoria sonconstantes y están definidos en el archivo de cabecera <X11/X.h>. Los tipos de sucesos de extensión noson constantes; los asigna de forma dinámica la petición de la extensión al servidor X cuando se inicializala extensión. Por eso, el cliente debe obtener los tipos de sucesos de extensión del servidor. El programa

Capítulo 5. Utilización de las extensiones en AIXwindows 63

Page 76: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

cliente determina el tipo de suceso de un suceso de extensión utilizando la información que devuelve lapetición XOpenDevice . Luego se puede utilizar este tipo para compararlo con el campo tipo de lossucesos que recibe el cliente. Los sucesos de extensión se propagan en sentido ascendente por lajerarquía de ventanas del mismo modo que lo hacen los sucesos de imagen de memoria. Si una ventanano está interesada en un suceso de extensión, suele propagarlo al antecesor más cercado que estéinteresado, a no ser que la lista dont_propagate lo prohíba. Las capturas de dispositivos de extensiónpueden modificar el grupo de ventanas que reciben un determinado suceso de extensión. A continuaciónse muestra una lista de las categorías de sucesos y el tipo o tipos de sucesos asociados.

Categoría de suceso Tipo de sucesoSucesos de teclas de dispositivos DeviceKeyPress, DeviceKeyReleaseSucesos de movimiento de dispositivos DeviceButtonPress, DeviceButtonRelease, DeviceMotionNotifySucesos de enfoque de entrada de dispositivos DeviceFocusIn , DeviceFocusOutSucesos de notificación de estado dedispositivos

DeviceStateNotify

Sucesos de proximidad de dispositivos ProximityIn , ProximityOutSucesos de correlación de dispositivos DeviceMappingNotifySucesos de cambio de dispositivos ChangeDeviceNotify

Clases de sucesosLas clases de sucesos son números enteros que se utilizan del mismo modo que las máscaras desucesos de la imagen de memoria. Las utilizan los programas cliente para indicar al servidor los sucesosque el programa cliente desea recibir.

Las máscaras de sucesos de entrada de imagen de memoria son constantes y están definidas en elarchivo de cabecera <X11/X.h>. Las clases de sucesos no son contantes; los asigna de forma dinámica lapetición de la extensión al servidor X cuando se inicializa la extensión. Por eso, el cliente debe obtenerlas clases de sucesos de extensión del servidor.

La clase de suceso correspondiente a un dispositivo y suceso de extensión se obtiene a partir de lainformación que devuelve la función XOpenDevice . Luego se puede utilizar esta clase en una peticiónXSelectExtensionEvent para solicitar que los sucesos de este tipo procedentes de ese dispositivo seenvíen al programa cliente.

En el caso de los sucesos DeviceButtonPress , el cliente puede especificar si se debe realizar o no unacaptura pasiva implícita cuando se pulse el botón. Si el cliente se quiere asegurar de que recibe unsuceso DeviceButtonRelease para cada suceso DeviceButtonPress que recibe, debe especificar laclase DeviceButtonPressGrab además de la clase DeviceButtonPress . Esto supone una restricciónpara el cliente, puesto que sólo un cliente a la vez puede solicitar sucesos DeviceButtonPressprocedentes del mismo dispositivo y ventana si algún otro cliente especifica dicha clase.

Si algún cliente ha especificado la clase DeviceButtonPressGrab , cualquier petición de otro cliente queespecifique el mismo dispositivo y ventana y que especifique DeviceButtonPress oDeviceButtonPressGrab causará que se genere un error Access .

Si sólo se especifica la clase DeviceButtonPress , no se realiza ninguna captura pasiva implícita cuandose pulsa un botón en el dispositivo. Varios clientes pueden utilizar esta clase para especificar la mismacombinación de dispositivo y ventana.

El cliente también puede seleccionar sucesos DeviceMotion sólo cuando haya un botón pulsado. Paraello, debe especificar las clases de sucesos comprendidas entre DeviceButton1Motion yDeviceButton5Motion . Un dispositivo de entrada sólo da soporte a tantas clases de movimiento debotones como botones tiene.

64 Guía de programación de AIXwindows

Page 77: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Estructuras de sucesosCada tipo de suceso de extensión tiene una estructura correspondiente, declarada en <X11/XInput.h> .Todas las estructuras de sucesos tienen los siguientes miembros:

type Definido en el número de tipo de suceso que lo identifica de forma exclusiva. Por ejemplo,cuando el servidor X notifica un suceso DeviceKeyPress a una aplicación cliente, envía unaestructura XDeviceKeyPressEvent .

display Definido en un puntero a una estructura que define la pantalla en la que se leyó el suceso.send_event Definido como True si el suceso procede de una petición XSendEvent .serial Definido a partir del número de serie notificado en el protocolo, pero ampliado desde los bits

menos significativos de 16 bits a un valor completo de 32 bits.

Las estructuras de sucesos de extensión notifican la posición actual al puntero X. Además, si undispositivo notifica datos de movimiento y datos absolutos, también se notifican los valores actuales de losevaluadores que contiene el dispositivo.

Sucesos de teclas de dispositivosLos sucesos de teclas precedentes de dispositivos de extensión contienen toda la información quecontiene un suceso de teclas procedente del teclado X. Además, contienen un ID de dispositivo y notificanlos valores actuales de los evaluadores del dispositivo, si dicho dispositivo notifica datos absolutos. Si senotifican datos correspondientes a más de seis evaluadores, se envía más de un suceso de teclas. Elcampo axes_count contiene el número de ejes que se notifican. El servidor envía tantos sucesos comohacen falta para notificar los datos del dispositivo. Cada suceso contiene el número total de ejesnotificados en el campo axes_count y el primer eje notificado en el suceso actual en el campo first_axis.Si el dispositivo da soporte a los evaluadores de clase de entrada, pero no notifica datos de modalidadabsoluta, el campo axes_count contiene un 0 (cero). La ubicación notificada en los campos x, y y x_root,y_root es la ubicación del puntero X de imagen de memoria. La estructura de XDeviceKeyEvent sedefine de la siguiente manera:typedef struct{int type; /* del suceso */unsigned long serial; /* núm. de la última petición procesada*/Bool send_event; /* true si viene de una petición SendEvent */Display *display; /* Pantalla de la que procede el suceso */Window window; /* ventana "suceso" en relación a la que se notifica */XID deviceid;Window root; /* ventana raíz en la que se produjo el suceso */Window subwindow; /* ventana hijo */Time time; /* milisegundos */int x, y; /* coordenadas x,y en ventana suceso */int x_root; /* coordenadas relativas a raíz */int y_root; /* coordenadas relativas a raíz */unsigned int state; /* máscara de botón o tecla */unsigned int keycode; /* detalle*/Bool same_screen; /* mismo distintivo de pantalla */unsigned char axes_count;unsigned char first_axis;unsigned int device_state; /* máscara de botón o tecla de dispositivo */int axis_data[6];} XDeviceKeyEvent;typedef XDeviceKeyEvent XDeviceKeyPressedEvent;typedef XDeviceKeyEvent XDeviceKeyReleasedEvent;

Sucesos de botones de dispositivosLos sucesos de botones procedentes de dispositivos contienen toda la información que contiene unsuceso de botones procedente del puntero X. Además, contienen un ID de dispositivo y notifican losvalores actuales de los evaluadores del dispositivo, si dicho dispositivo notifica datos absolutos. Si senotifican datos correspondientes a más de seis evaluadores, se pueden enviar más de un suceso debotones. El campo axes_count contiene el número de ejes que se notifican. El servidor envía tantossucesos como hacen falta para notificar los datos del dispositivo. Cada suceso contiene el número total

Capítulo 5. Utilización de las extensiones en AIXwindows 65

Page 78: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

de ejes notificados en el campo axes_count y el primer eje notificado en el suceso actual en el campofirst_axis. Si el dispositivo da soporte a los evaluadores de clase de entrada pero no notifica datos enmodalidad absoluta, el campo axes_count contiene un 0. La ubicación notificada en los campos x , y yx_root , y_root es la ubicación del puntero X de imagen de memoria.typedef struct {int type; /* del suceso */unsigned long serial; /* núm. de la última petición procesada

por el servidor*/Bool send_event; /* true si procede de una petición SendEvent */Display *display; /* Pantalla de la que procede el suceso */Window window; /* ventana "suceso" en relación a la que se notifica */XID deviceid;Window root; /* ventana raíz en la que se ha producido

el suceso */Window subwindow; /* ventana hijo */Time time; /* milisegundos */int x, y; /* coordenadas x,y en ventana suceso */int x_root; /* coordenadas relativas a raíz */int y_root; /* coordenadas relativas a raíz */unsigned int state; /* máscara de botón o tecla */unsigned int button; /* detalle */Bool same_screen; /* mismo distintivo de pantalla */unsigned char axes_count;unsigned char first_axis;unsigned int device_state; /* máscara de botón o tecla de dispositivo */int axis_data[6];} XDeviceButtonEvent;typedef XDeviceButtonEvent XDeviceButtonPressedEvent;typedef XDeviceButtonEvent XDeviceButtonReleasedEvent;

Sucesos de movimiento de dispositivosLos sucesos de movimiento procedentes de dispositivos de extensión contienen toda la información quecontiene un suceso de movimiento procedente del puntero X. Además, contienen un ID de dispositivo ynotifican los valores actuales de los evaluadores del dispositivo. La ubicación notificada en los campos x ,y y x_root, y_root es la ubicación del puntero X de imagen de memoria, por lo que tiene 2dimensiones.Los dispositivos de movimiento de extensión pueden notificar datos de movimientocorrespondiente a un número variable de ejes. El campo axes_count contiene el número de ejes que senotifican. El servidor envía tantos sucesos como hacen falta para notificar los datos del dispositivo. Cadasuceso contiene el número total de ejes notificados en el campo axes_count y el primer eje notificado enel suceso actual en el campo first_axis.typedef struct {int type; /* del suceso */unsigned long serial; /* núm. última petición procesada por servidor */Bool send_event; /* true si procede de una petición SendEvent */Display *display; /* Pantalla de la que procede el suceso */Window window; /* ventana "suceso" en relación a la que se notifica */XID deviceid;Window root; /* ventana raíz en la que se produjo el suceso */Window subwindow; /* ventana hijo */Time time; /* milisegundos */int x, y; /* coordenadas x,y en ventana suceso */int x_root; /* coordenadas relativas a raíz */int y_root; /* coordenadas relativas a raíz */unsigned int state; /* máscara de botón o tecla */char is_hint; /* detalle*/Bool same_screen; /* mismo distintivo de pantalla */unsigned int device_state; /* máscara de botón o tecla de dispositivo */unsigned char axes_count;unsigned char first_axis;int axis_data[6];} XDeviceMotionEvent;

66 Guía de programación de AIXwindows

Page 79: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Sucesos de enfoque de dispositivosEstos sucesos equivalen a los sucesos de enfoque de imagen de memoria. Contienen la mismainformación y además contienen un ID de dispositivo que identifica qué dispositivo ha cambiado suenfoque y una indicación horaria. Los sucesos DeviceFocusIn y DeviceFocusOut correspondientes acambios de enfoque de dispositivos de extensión se generan del mismo modo que los sucesos deenfoque de imagen de memoria.typedef struct{int type; /* del suceso */unsigned long serial; /* núm. de la última petición procesada

por el servidor */Bool send_event; /* true si procede de una petición

SendEvent */Display *display; /* Pantalla de la que procede el suceso */Window window; /* ventana de "suceso" en relación a la

que se notifica */XID deviceid;int mode; /* NotifyNormal, NotifyGrab,NotifyUngrab */int detail; /*

* NotifyAncestor, NotifyVirtual, NotifyInferior,* NotifyNonLinear,NotifyNonLinearVirtual, NotifyPointer,* NotifyPointerRoot, NotifyDetailNone*/

Time time;} XDeviceFocusChangeEvent;typedef XDeviceFocusChangeEvent XDeviceFocusInEvent;typedef XDeviceFocusChangeEvent XDeviceFocusOutEvent;

Suceso StateNotify de dispositivoEste suceso es análogo al suceso de mapa de teclas de imagen de memoria, pero notifica el estadoactual del suceso correspondiente a cada clase de entrada a la que da soporte. Se genera después decada suceso DeviceFocusIn y de cada suceso EnterNotify y se envía a los clientes que hanseleccionado sucesos XDeviceStateNotify .Si el dispositivo da soporte a los evaluadores de clases deentrada, el campo mode de la estructura XValuatorStatus es una máscara de bits que notifica lamodalidad del dispositivo, el estado de proximidad y otra información de estado. Actualmente estándefinidos los siguientes bits:0x01 Relative = 0, Absolute = 10x02 InProximity = 0, OutOfProximity = 1

Si el dispositivo da soporte a más evaluadores de los que se pueden notificar en un solo XEvent , segeneran varios sucesos XDeviceStateNotify .typedef struct{unsigned char class;unsigned char length;} XInputClass;

typedef struct {int type;unsigned long serial; /* núm. de la última petición procesada

por el servidor */Bool send_event; /* true si procede de una petición

SendEvent */Display *display; /* Pantalla de la que procede el suceso */Window window;XID deviceid;Time time;int num_classes;char data[64];} XDeviceStateNotifyEvent;

typedef struct {unsigned char class;unsigned char length;

Capítulo 5. Utilización de las extensiones en AIXwindows 67

Page 80: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

unsigned char num_valuators;unsigned char mode;int valuators[6];} XValuatorStatus;

typedef struct {unsigned char class;unsigned char length;short num_keys;char keys[32];} XKeyStatus;

typedef struct {unsigned char class;unsigned char length;short num_buttons;char buttons[32];} XButtonStatus;

Suceso de correlación de dispositivosEste suceso equivale al suceso MappingNotify de imagen de memoria. Envía una notificación a losprogramas cliente cuando se ha modificado la correlación de teclas, modificadores o botones en undispositivo de extensión.typedef struct {int type;unsigned long serial;Bool send_event;

Display *display;Window window;XID deviceid;Time time;int request;int first_keycode;int count;} XDeviceMappingEvent;

Suceso ChangeDeviceNotifyEste suceso no tiene ningún equivalente en el protocolo de núcleo. Envía una notificación a losprogramas cliente cuando se ha modificado uno de los dispositivos de imagen de memoria.typedef struct {int type;unsigned long serial;Bool send_event;

Display *display;Window window;XID deviceid;Time time;int request;} XChangeDeviceNotifyEvent;

Sucesos de proximidadEstos sucesos no tienen ningún equivalente en el protocolo de núcleo. Algunos dispositivos de entrada,como los tableros de gráficos o las pantallas táctiles, puede enviar estos sucesos para indicar que unestilete ha entrado en contacto con la superficie de detección posicional, o bien que el estilete ha dejadode estar en contacto con dicha superficie. Este suceso contiene el valor actual de cualquier evaluador deldispositivo, en el caso de que el dispositivo notifique datos absolutos. Si se notifican datoscorrespondientes a más de seis evaluadores, se puede enviar más de un suceso de proximidad. Elcampo axes_count contiene el número de ejes que se notifican. El servidor envía tantos sucesos comohacen falta para notificar los datos del dispositivo. Cada suceso contiene el número total de ejesnotificados en el campo axes_count y el primer eje notificado en el suceso actual en el campo first_axis.Si el dispositivo da soporte a la clase de entrada Valuators , pero no notifica datos en modalidad absoluta,el campo axes_count contiene un 0.

68 Guía de programación de AIXwindows

Page 81: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

typedef struct{int type; /* ProximityIn o ProximityOut */unsigned long serial; /* núm. de la última petición procesada

por el servidor */Bool send_event; /* true se procede de una petición

SendEvent */Display *display; /* Pantalla de la que procede el suceso */Window window;XID deviceid;Window root;Window subwindow;Time time;int x, y;int x_root, y_root;unsigned int state;Bool same_screen;unsigned char axes_count;unsigned char first_axis;unsigned int device_state; /* máscara de botón o tecla de dispositivo */int axis_data[6];} XProximityNotifyEvent;typedef XProximityNotifyEvent XProximityInEvent;typedef XProximityNotifyEvent XProximityOutEvent;

Determinación de la versión de la extensiónLa función XExtensionVersion permite que un cliente determine si un servidor da soporte a la versióndeseada de la extensión de entrada. La estructura XExtensionVersion devuelve información sobre laversión de la extensión a la que da soporte el servidor.

Lista de dispositivos disponiblesUn programa cliente que desee acceder a un determinado dispositivo debe antes determinar si dichodispositivo está conectado al servidor X. Para eso sirve la función XListInputDevices , que devuelve unalista de todos los dispositivos que el servidor X puede abrir. El programa cliente puede utilizar uno de losnombres definidos en el archivo de cabecera XI.h en una petición XInternAtom a fin de determinar el tipode dispositivo correspondiente al dispositivo que desea. Luego se puede comparar este tipo con los tiposde dispositivo que devuelve la petición XListInputDevices . La función XFreeDeviceList libera la lista deinformación de dispositivos de entrada.

Habilitación e inhabilitación de los dispositivos de extensiónCada programa cliente que desee acceder a un dispositivo de extensión debe solicitar al servidor queabra dicho dispositivo. Para eso sirve la petición XOpenDevice .

Antes de terminar, el programa cliente debe solicitar al servidor que cierre el dispositivo. Para eso sirve lapetición XCloseDevice . Un cliente puede abrir el mismo dispositivo de extensión más de una vez. Laspeticiones posteriores a la primera petición satisfactoria devuelven una estructura XDevice adicional quecontiene la misma información que la primera, pero que no tiene ningún otro efecto. Una sola peticiónXCloseDevice termina el acceso del cliente al dispositivo. Al cerrar un dispositivo, se liberan las capturasactivas o pasivas que ha establecido el cliente que ha emitido la petición. Si el dispositivo está congeladosólo por una captura activa del cliente que ha emitido la petición, se libera cualquier suceso en cola. Si unprograma cliente termina sin cerrar un dispositivo, el servidor cierra de forma automática dicho dispositivoen nombre del cliente. Esto no afecta a los demás clientes que acceden a dicho dispositivo.

Cambio de la modalidad de un dispositivoAlgunos dispositivos pueden notificar datos de movimiento relativos o absolutos. La modalidad de undispositivo se pasa de relativa a absoluta mediante la función XSetDeviceMode . Los valores válidos sonAbsolute o Relative .

Capítulo 5. Utilización de las extensiones en AIXwindows 69

Page 82: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Inicialización de evaluadores en un dispositivo de entradaAlgunos dispositivos que notifican datos posicionales absolutos se pueden inicializar con un valor dearranque. En el caso de dispositivos capaces de notificar datos de movimiento relativos o datosposicionales absolutos, es posible que se tengan que inicializar sus evaluadores en un valor de arranquedespués de modificar la modalidad del dispositivo por Absolute . Los evaluadores de este tipo dedispositivos se inicializan mediante la función XSetDeviceValuators .

Obtención de controles de dispositivos de entradaAlgunos dispositivos de entrada dan soporte a varios controles de configuración que los clientes puedenconsultar o modificar. El grupo de controles a los que se da soporte varía de un dispositivo de entrada aotro. Las peticiones de manipulación de estos controles falla si el servidor X de destino o el dispositivo deentrada de destino no dan soporte al control de dispositivo solicitado. Cada control de dispositivo tiene unidentificador exclusivo. La información que se pasa con cada control de dispositivo tiene distinta longitud yse correlaciona mediante estructuras de datos exclusivas de dicho control de dispositivo. Se puedenconsultar los controles de dispositivos mediante la función XGetDeviceControl .

Cambio de los controles de dispositivos de entradaAlgunos dispositivos de entrada dan soporte a diversos controles de configuración que los clientes puedenmodificar mediante la función XChangeDeviceControl . Normalmente, los controles se modifican parainicializar el dispositivo con una configuración o estado conocidos. El grupo de controles a los que se dasoporte varía de un dispositivo de entrada a otro. Las peticiones de manipulación de estos controles fallasi el servidor X de destino o el dispositivo de entrada de destino no dan soporte al control de dispositivosolicitado. La configuración del control de dispositivo falla si otro cliente tiene el control sobre el dispositivode entrada de destino o si otro cliente ha abierto el dispositivo y éste tiene un estado conflictivo.

Selección de sucesos de dispositivos de extensiónLos sucesos de entrada de dispositivo se seleccionan mediante la función XSelectExtensionEvent . Losparámetros que se pasan son un puntero a una lista de clases que define los dispositivos y tipos desucesos que se desean, un contaje del número de elementos de la lista y el ID de la ventana de la quese desea obtener sucesos.

Determinación de los sucesos de dispositivo seleccionadosLos sucesos de extensión que están seleccionados actualmente de una ventana concreta puedendeterminarse mediante la función XGetSelectedExtensionEvents .

Control de la propagación de sucesosLos sucesos de extensión se propagan en sentido ascendente por la jerarquía de ventanas del mismomodo que lo hacen los sucesos de imagen de memoria. Si una ventana no está interesada en un sucesode extensión, suele propagarlo al antecesor más cercano que esté interesado, a no ser que la listadont_propagate lo prohíba. Las capturas de dispositivos de extensión pueden modificar el grupo deventanas que reciben un determinado suceso de extensión. Los programas cliente pueden controlar lapropagación de sucesos mediante las funciones XChangeDeviceDontPropagateList yXGetDeviceDontPropagateList .

La función XChangeDeviceDontPropagateList añade un suceso correspondiente a la ventanaespecificada a la lista de sucesos de extensión do_not_propagate, o bien lo suprime de la misma. Hayuna lista por ventana, y la lista existe mientras exista la ventana. No se modifica la lista si termina uncliente que la ha modificado. La función XGetDeviceDontPropagateList permite que el cliente puedadeterminar la lista do_not_propagate de sucesos de extensión correspondiente a la ventana especificada.La función XSendExtensionEvent permite que un cliente pueda enviar un suceso de extensión a otrocliente.

70 Guía de programación de AIXwindows

Page 83: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Obtención del histórico de movimientosLa función XGetDeviceMotionEvents devuelve todas las posiciones del almacenamiento intermedio delhistórico de movimientos del dispositivo dentro del período comprendido entre las horas de inicio y dedetención especificadas, ambas inclusive. Si la hora de inicio es futura, o es posterior a la hora dedetención, no se devuelve ninguna posición. La función XFreeDeviceMotionEvents libera la matriz deinformación de movimientos.#endif /* _XI_H_ */

Especificación del protocolo de extensión de entrada de AIXwindowsEste documento define una extensión del protocolo AIXwindows para dar soporte a los dispositivos deentrada distintos del puntero y el teclado X de imagen de memoria. Un documento adicional define unaextensión correspondiente de Xlib (se tratan extensiones parecidas para lenguajes que no son el C). Laprimera sección contiene una visión general de la extensión de entrada. La siguiente sección define lasnuevas peticiones de protocolo definidas por la extensión. Este documento concluye con una descripciónde los nuevos sucesos de entrada generados por los dispositivos de entrada adicionales.

Enfoque del diseñoLa finalidad global del diseño de la extensión consiste en definir peticiones y sucesos análogos a laspeticiones y sucesos de imagen de memoria (core). Esto permite que los dispositivos de entrada deextensión se puedan distinguir entre sí y se puedan distinguir de los dispositivos de entrada de imagen dememoria. Estos sucesos y peticiones utilizan un identificador de dispositivo y dan soporte a la notificaciónde datos de movimiento de n dimensiones, así como a la notificación de otros datos que no se puedennotificar mediante los sucesos de entrada de imagen de memoria.

Dispositivos de entrada de la imagen de memoriaEl protocolo de núcleo del servidor X da soporte a dos dispositivos de entrada: un puntero y un teclado. Eldispositivo de puntero cumple dos funciones principales. Primero, se puede utilizar para generarinformación de movimiento que pueden detectar los programas cliente. Segundo, se puede utilizar paraindicar la ubicación actual y enfoque del teclado X. Para ello, el servidor duplica un cursor en la posiciónactual del puntero X. A no ser que se haya enfocado de forma explícita el teclado X, este cursor muestratambién la ubicación actual y el enfoque del teclado X.

El teclado X se utiliza para generar entradas que los programas cliente pueden detectar.

En este documento se hace referencia al teclado X y al puntero X como dispositivos de imagen dememoria, mientras que los sucesos de entrada que generan (KeyPress , KeyRelease , ButtonPress ,ButtonRelease y MotionNotify ) son conocidos como sucesos de entrada de imagen de memoria. Losdemás dispositivos de entrada reciben el nombre de dispositivos de entrada de extensión y los sucesosde entrada que generan reciben el nombre de sucesos de entrada de extensión.

Nota: Esta extensión de entrada no cambia el comportamiento ni la funcionalidad de los dispositivosde entrada de imagen de memoria, los sucesos de imagen de memoria ni las peticiones deprotocolos de núcleo, a excepción de las peticiones de captura de imagen de memoria. Estaspeticiones pueden afectar a la sincronización de sucesos precedentes de dispositivos de extensión.Consulte la explicación que se proporciona en la sección titulada Sincronización de sucesos ycapturas de imagen de memoria.

La selección de los dispositivos físicos que utilizará inicialmente el servidor como dispositivos de imagende memoria depende de la implementación. Existen peticiones que permiten a los programas clientecambiar los dispositivos físicos a utilizar como dispositivos de imagen de memoria.

Capítulo 5. Utilización de las extensiones en AIXwindows 71

Page 84: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Dispositivos de entrada de extensiónLa extensión de entrada controla el acceso a dispositivos de entrada que no son el teclado X y el punteroX. Permite a los programas cliente seleccionar entradas en estos dispositivos, con independencia entre síy con independencia de los dispositivos de imagen de memoria.

Un cliente que desee acceder a un determinado dispositivo debe antes determinar si dicho dispositivoestá conectado al servidor X. Para eso sirve la petición ListInputDevices , que devuelve una lista de losdispositivos que puede abrir el servidor X. Un cliente puede abrir uno o más dispositivos mediante lapetición OpenDevice , especificar los sucesos que se desean recibir y recibir y procesar los sucesos deentrada procedentes de los dispositivos de extensión del mismo modo que los sucesos procedentes delteclado X o del puntero X.Los sucesos de entrada de estos dispositivos son de tipos de extensión(DeviceKeyPress , DeviceKeyRelease , DeviceButtonPress , DeviceButtonRelease ,DeviceMotionNotify , etc.) y pueden contener un identificador de dispositivo de modo que se puedandistinguir los sucesos del mismo tipo procedentes de distintos dispositivos de entrada.

Se puede utilizar como dispositivo de entrada de extensión cualquier tipo de dispositivo de entrada. Losdispositivos de entrada de extensión pueden tener cero o más teclas, cero o más botones y puedennotificar cero o más ejes de movimiento. El movimiento se debe notificar como movimientos relativos apartir de una posición anterior o como una posición absoluta. Los evaluadores que notifique informacióncorrespondiente a un determinado dispositivo de entrada de extensión deben notificar el mismo tipo deinformación de movimiento (absoluta o relativa).

Esta extensión está diseñada para dar cabida a nuevos tipos de dispositivos de entrada que se puedanañadir en el futuro. Las peticiones de protocolo que hacen referencia a determinadas características delos dispositivos de entrada organizan dicha información por clases de entrada .Los implantadores delservidor pueden añadir nuevas clases de dispositivos de entrada sin modificar las peticiones de protocolo.Las clases de entrada son números exclusivos registradas con el Consorcio X. Cada dispositivo deentrada de extensión puede dar soporte a varias clases de entradas.

Todos los dispositivos de entrada de extensión se tratan como el teclado X de imagen de memoria aldeterminar su ubicación y enfoque. El servidor no efectúa un seguimiento de la ubicación de cada uno deestos dispositivos y, por lo tanto, no duplica un cursor para indicar su ubicación actual. En su lugar, laubicación se determina a partir de la ubicación del puntero X de imagen de memoria. Al igual que elteclado X de imagen de memoria, es posible enfocar algunos de ellos de forma explícita. Si no se enfocande forma explícita, se determina su enfoque a partir de la ubicación del puntero X de imagen de memoria.

Los sucesos que el servidor notifica a un cliente tienen un tamaño fijo (32 bytes). Para representar elcambio del estado de un dispositivo de entrada, es posible que la extensión tenga que generar unasecuencia de sucesos de entrada. Normalmente, una biblioteca adicional del cliente (como por ejemplo labiblioteca Xlib) toma estos sucesos de entrada tal cual y les da un formato que resulte más convenientepara el cliente.

Clases de sucesosEn el protocolo de núcleo, un cliente expresa su interés en recibir ciertos sucesos de entrada dirigidos auna ventana modificando la máscara de sucesos de dicha ventana. La mayoría de los bits de la máscarade sucesos ya se utilizan para expresar interés en sucesos X de imagen de memoria. La extensión deentrada especifica otro mecanismo con el cual un cliente puede expresar su interés en sucesosgenerados por esta extensión.

Cuando un cliente abre un dispositivo de entrada de extensión mediante la petición OpenDevice , sedevuelve una estructura XDevice . Se proporcionan macros que extraen de dicha estructura números de32 bits denominados clases de sucesos ; un cliente puede utilizar dichos números para expresar suinterés en sucesos de extensión mediante la petición SelectExtensionEvent . La clase de sucesocombina el ID de dispositivo y el tipo de suceso deseado; esta combinación puede considerarseequivalente a las máscaras de sucesos de imagen de memoria.

72 Guía de programación de AIXwindows

Page 85: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Clases de entradasAlgunas de las peticiones de extensión de entrada dividen los dispositivos de entrada en clases según sufunción. De este modo, se pueden definir nuevas clases de dispositivos de entrada posteriormente, sintener que cambiar la semántica de estas peticiones. Actualmente están definidas las siguientes clases dedispositivos de entrada:

KEY Informa de sucesos de teclas.BUTTON Informa de sucesos de botones.VALUATOR Informa de datos de evaluador en los sucesos de movimiento.PROXIMITY Informa de sucesos de proximidad.FOCUS Se puede enfocar e informa de sucesos de enfoque.FEEDBACK Da soporte a las retroalimentaciones.OTHER Se puede invocar a las macros ChangeDeviceNotify , DeviceMappingNotify y DeviceStateNotify

pasando la estructura XDevice devuelta para este dispositivo.

Cada dispositivo de entrada de extensión puede dar soporte a varias clases de entradas. También sepueden añadir clases adicionales en el futuro. Las peticiones que dan soporte a varias clases deentradas, como la función ListInputDevices , que lista todos los dispositivos de entrada disponibles,organizan los datos que devuelven por clase de entrada.Los programas cliente que utilizan dichaspeticiones no deben acceder a los datos a no ser que coincidan con una clase definida en el momento enque se compilaron dichos clientes. De este modo, se pueden añadir clases nuevas sin tener querecompilar los clientes existentes que utilizan dichas peticiones.

Los programas cliente acceden a los dispositivos de entrada de extensión mediante nuevas peticiones deprotocolo. Esta sección resume las nuevas peticiones definidas por esta extensión. La sintaxis y lasdefiniciones de tipos utilizadas a continuación siguen la notación que se utiliza para el protocolo de núcleoX11.

Obtención de la versión de la extensiónLa petición GetExtensionVersion devuelve información de la versión sobre la extensión de entrada.

Lista de dispositivos disponiblesUn cliente que desee acceder a un determinado dispositivo debe antes determinar si dicho dispositivoestá conectado al servidor X. Para eso sirve la petición ListInputDevices , que devuelve una lista detodos los dispositivos que puede abrir el servidor X.

Habilitación de dispositivosLos programas cliente que deseen acceder a un dispositivo de extensión deben solicitar al servidor queabra dicho dispositivo. Para eso sirve la petición OpenDevice . Antes de salir, el programa cliente debesolicitar de forma explícita al servidor que cierre el dispositivo. Para eso sirve la petición CloseDevice .

Un cliente puede abrir el mismo dispositivo de extensión más de una vez. Las peticiones posteriores a laprimera petición satisfactoria devuelven una estructura XDevice adicional que contiene la mismainformación que la primera, pero que no tiene efecto.Una sola petición CloseDevice termina el acceso deeste cliente al dispositivo.

Cambio de la modalidad de un dispositivoAlgunos dispositivos pueden notificar datos de movimiento relativos o absolutos. La modalidad de undispositivo se pasa de relativa a absoluta mediante la petición SetDeviceMode . Los valores válidos sonAbsolute o Relative .

Inicialización de evaluadores en un dispositivo de entradaAlgunos dispositivos que notifican datos posicionales absolutos se pueden inicializar con un valor dearranque. En el caso de dispositivos capaces de notificar datos de movimiento relativos o datos

Capítulo 5. Utilización de las extensiones en AIXwindows 73

Page 86: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

posicionales absolutos, es posible que se tengan que inicializar sus evaluadores en un valor de arranquedespués de modificar la modalidad del dispositivo por Absolute . La petición SetDeviceValuators sirvepara inicializar los evaluadores en este tipo de dispositivo.

Obtención de controles de dispositivos de entradaLa petición GetDeviceControl devuelve el estado actual del control de dispositivo especificado. Eldispositivo y el servidor de destino deben dar soporte al control del dispositivo; si no es así, se produceun error.

La petición ChangeDeviceControl cambia el control del dispositivo especificado según los valoresindicados en la estructura DeviceControl . El dispositivo y el servidor de destino deben dar soporte alcontrol del dispositivo; si no es así, se produce un error.

Selección de sucesos de dispositivos de extensiónLos sucesos de entrada de entrada de extensión se seleccionan mediante la peticiónSelectExtensionEvent .

Determinación de sucesos seleccionadosGetSelectedExtensionEvents se utiliza para determinar los sucesos de extensión seleccionadosactualmente de una ventana determinada.

Control de la propagación de sucesosLos sucesos de extensión se propagan en sentido ascendente por la jerarquía de ventanas del mismomodo que lo hacen los sucesos de imagen de memoria. Si una ventana no está interesada en un sucesode extensión, suele propagarlo al antecesor más cercano que esté interesado, a no ser que la listadont_propagate lo prohíba. Las capturas de dispositivos de extensión pueden modificar el grupo deventanas que reciben un determinado suceso de extensión.

Los programas cliente pueden controlar la propagación de sucesos de extensión mediante el uso de laspeticiones ChangeDeviceDontPropagateList y GetDeviceDontPropagateList .

La función XChangeDeviceDontPropagateList añade un suceso correspondiente a la ventanaespecificada a la lista de sucesos de extensión do_not_propagate, o bien lo suprime de la misma. Estalista existe mientras existe la ventana, y no se modifica si el cliente termina.

Envío de sucesos de extensiónUn programa cliente puede enviar un suceso a otro mediante la función XSendExtensionEvent . Elsuceso de la estructura XEvent debe ser uno de los sucesos definidos por la extensión de entrada, demodo que el servidor X pueda intercambiar correctamente los bytes del contenido, según necesite. Si noes así, el servidor no modifica ni comprueba el contenido del suceso, excepto para forzar que SendEventtenga el valor True en el suceso reenviado y para definir correctamente el número de secuencia en elsuceso. XSendExtensionEvent devuelve un 0 (cero) si falla el protocolo conversión-a-cableado; de locontrario, devuelve un valor distinto de cero.

Obtención del histórico de movimientosLa petición GetDeviceMotionEvents devuelve todas las posiciones del almacenamiento intermedio delhistórico de movimientos del dispositivo que entran dentro del período comprendido entre las horas deinicio y de detención especificadas, ambas inclusive. Si la hora de inicio es futura, o es posterior a la horade detención, no se devuelve ninguna posición.

Cambio de los dispositivos de imagen de memoriaEstas peticiones ChangePointerDevice y ChangeKeyboardDevice se proporcionan para cambiar eldispositivo físico que se utilizará como puntero X o teclado X.

Nota: Si se utilizan estas peticiones, se pueden modificar las características de los dispositivos deimagen de memoria. Es posible que el nuevo dispositivo de puntero tenga distinto número debotones que el antiguo, o puede que el nuevo dispositivo de teclado tenga un número distinto de

74 Guía de programación de AIXwindows

Page 87: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

teclas o notifique un rango distinto de códigos de teclas. Es posible que se ejecuten programascliente que dependan de estas características. Por ejemplo, un programa cliente puede asignar unamatriz basada en el número de botones del dispositivo de puntero y luego utilizar los números debotones que recibe en sucesos de botones como índices de dicha matriz. Si se cambian losdispositivos de imagen de memoria, puede que dichos programas cliente funcionen incorrectamenteo terminen de forma anómala.

Estas peticiones cambian el teclado X o el dispositivo de puntero X y generan un sucesoChangeDeviceNotify y un suceso MappingNotify . El suceso ChangeDeviceNotify sólo se envía aaquellos clientes que han expresado su interés en recibir dicho suceso mediante la peticiónXSelectExtensionEvent . Los dispositivos especificados pasan a ser el nuevo teclado X o el nuevodispositivo de puntero X. La ubicación de los dispositivos de imagen de memoria no cambia comoresultado de esta petición.

Estas peticiones fallan y devuelven AlreadyGrabbed si otro cliente captura el dispositivo especificado o eldispositivo de imagen de memoria. Si alguno de los dispositivos está congelado como resultado de lacaptura activa de otro cliente, estas peticiones fallan y devuelven un valor GrabFrozen .

Estas peticiones fallan con un error BadDevice si el dispositivo especificado no es válido o no se haabierto anteriormente con OpenDevice .

La petición ChangeKeyboardDevice cambia el dispositivo de teclado X. El dispositivo especificado debedar soporte a la clase de entrada Keys (notificada en la petición ListInputDevices ); si no es así, lapetición falla con un error BadMatch . Una vez que el dispositivo ha sustituido satisfactoriamente uno delos dispositivos de imagen de memoria, se le trata como un dispositivo de imagen de memoria hasta quesea sustituido por otra petición ChangeDevice o hasta que termine el servidor. Si termina el cliente queha cambiado el dispositivo, este no vuelve a cambiar. Si se intenta utilizar la petición CloseDevice paracerrar el nuevo dispositivo de imagen de memoria, se genera un error BadDevice .

La petición ChangePointerDevice cambia el dispositivo de puntero X. El dispositivo especificado debedar soporte a los evaluadores de la clase de entrada (notificada en la petición ListInputDevices ); si noes así, la petición falla con un error BadMatch .Se deben especificar los evaluadores a utilizar como ejes xe y del dispositivo de puntero. Se pasa por alto los datos procedentes de otros evaluadores deldispositivo.

Sincronización de sucesos y capturas de imagen de memoriaLa implementación de la extensión de entrada necesita una extensión del significado de la sincronizaciónde sucesos para las peticiones de captura de imagen de memoria. Esto sirve para que los gestores deventanas puedan congelar todos los dispositivos de entrada con una sola petición.

Las peticiones de captura de imagen de memoria requieren un argumento PointerMode y KeyboardMode.La extensión de entrada cambia el significado de estas modalidades. En el caso de las peticionesXGrabPointer y XGrabButton , PointerMode controla la sincronización del dispositivo de puntero yKeyboardMode controla la sincronización de los demás dispositivos de entrada.En el caso de laspeticiones XGrabKeyboard y XGrabKey , PointerMode controla la sincronización de todos los dispositivosde entrada excepto del teclado X, mientras que KeyboardMode controla la sincronización delteclado.Cuando se utiliza una de las peticiones de captura de imagen de memoria, la modalidadespecificada para el dispositivo no capturado es la que controla la sincronización de los dispositivos deextensión.

Capturas activas de extensiónSe da soporte a las capturas activas de los dispositivos de extensión mediante la petición GrabDevice dela misma manera que se capturan los dispositivos de imagen de memoria mediante la peticiónGrabKeyboard de imagen de memoria, salvo que se pasa Device como parámetro de función. Tambiénse pasa una lista de sucesos que el cliente desea recibir. La petición UngrabDevice permite que se libere

Capítulo 5. Utilización de las extensiones en AIXwindows 75

Page 88: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

una captura activa anterior correspondiente a un dispositivo de extensión. Para capturar un dispositivo deextensión, utilice la petición GrabDevice . Antes se tiene que haber abierto el dispositivo mediante lapetición OpenDevice .

Captura pasiva de botones y teclasSe da soporte a las capturas pasivas de botones y teclas en los dispositivos de extensión mediante laspeticiones GrabDeviceButton y GrabDeviceKey . Estas capturas pasivas se liberan mediante laspeticiones UngrabDeviceKey y UngrabDeviceButton . Para capturar de forma pasiva una sola tecla deun dispositivo de extensión, utilice GrabDeviceKey .Antes se tiene que haber abierto el dispositivomediante la petición OpenDevice .

″Descongelación ″ de un dispositivoLa petición AllowDeviceEvents permite que se procesen sucesos adicionales cuando se ha congeladoun dispositivo.

Control del enfoque de dispositivoSe puede determinar la ventana de enfoque actual correspondiente a un dispositivo de entrada deextensión mediante la petición GetDeviceFocus . Los dispositivos de extensión se enfocan mediante lapetición SetDeviceFocus del mismo modo que se enfoca un teclado mediante la petición SetInputFocus ,excepto en que se especifica un dispositivo como parte de la petición. Se suministra un estado deenfoque adicional, FollowKeyboard , para los dispositivos de extensión.

Control de la retroalimentación de dispositivosLa petición GetFeedbackControl obtiene los valores de las retroalimentaciones en un dispositivo deextensión. Esta petición ofrece una función equivalente a las funciones GetKeyboardControl yGetPointerControl de imagen de memoria. También ofrece un método para controlar las pantallasasociadas a un dispositivo de entrada que pueden mostrar un entero o una serie de caracteres. Lapetición ChangeFeedbackControl cambia los valores de una retroalimentación en el dispositivo deextensión.

Hacer sonar una campana en un dispositivo de entradaLa petición DeviceBell hace sonar una campana en un dispositivo de entrada de extensión. La peticiónChangeFeedbackControl cambia el volumen base de la campana.

Control de la codificación de dispositivosLa petición GetDeviceKeyMapping obtiene la correlación de teclado de un dispositivo de extensión quetenga teclas. La petición ChangeDeviceKeyMapping cambia la correlación de teclado de un dispositivode extensión que tenga teclas.

La petición GetDeviceModifierMapping obtiene los códigos de teclas que se utilizan como modificadoresen un dispositivo de extensión que tenga teclas. La petición SetDeviceModifierMapping define loscódigos de teclas que se utilizan como modificadores de un dispositivo de extensión.

Control de la correlación de botonesLas peticiones GetDeviceButtonMapping y SetDeviceButtonMapping son análogas a las peticionesGetPointerMapping y ChangePointerMapping de imagen de memoria. Permiten que un cliente puedadeterminar la correlación actual de botones de un dispositivo de extensión y que pueda cambiar lacorrelación. Para obtener la correlación actual de botones correspondiente a un dispositivo de extensión,utilice GetDeviceButtonMapping . La petición SetDeviceButtonMapping define la correlación de botonescorrespondiente a un dispositivo de extensión.

Obtención del estado de un dispositivoLa petición QueryDeviceState obtiene vectores que describen el estado de las teclas, botones yevaluadores de un dispositivo de extensión.

76 Guía de programación de AIXwindows

Page 89: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

SucesosLa extensión de entrada crea sucesos de entrada análogos a los sucesos de entrada de imagen dememoria. Estos sucesos de entrada de extensión se generan manipulando uno de los dispositivos deentrada de extensión.

Sucesos de botones, teclas y movimientoSe generan los sucesos DeviceKeyPress ,DeviceKeyRelease , DeviceButtonPress ,DeviceButtonRelease y DeviceMotionNotify cuando se modifica de forma lógica el estado de una tecla,un botón o un evaluador. La generación de estos cambios lógicos puede retrasar los cambios físicos, si elproceso de sucesos del dispositivo está congelado. Tenga en cuenta que se generan sucesosDeviceKeyPress y DeviceKeyRelease para todas las teclas, incluidas aquellas correlacionadas con bitsde modificador.

Suceso DeviceValuatorSe generan sucesos DeviceValuator para que contengan información sobre evaluadores para la que nohay espacio suficiente en los sucesos de cableado DeviceKey , DeviceButton , DeviceMotion yProximity . Un segundo suceso de tipo DeviceValuator sigue inmediatamente a los sucesos de estostipos.La biblioteca combina estos sucesos en un solo suceso que puede recibir el cliente mediante unXNextEvent .Los clientes no seleccionan los sucesos DeviceValuator ; sólo se generan para contener lainformación que no cabe en otros sucesos seleccionados por los clientes.

Sucesos de enfoque de dispositivosSe generan sucesos DeviceFocusIn y DeviceFocusOut cuando cambia el enfoque de entrada y seinforma a los clientes seleccionando DeviceFocusChange para el dispositivo y la ventana especificados.Los sucesos generados por SetDeviceFocus cuando el dispositivo no está capturado tienen ModalidadNormal . Los sucesos generados por SetDeviceFocus al capturar el dispositivo tienen la ModalidadWhileGrabbed . Los sucesos generados al activar una captura de dispositivo tienen la Modalidad Grab ,mientras que los sucesos generados al desactivar una captura de dispositivo tienen una ModalidadUngrab . Todos los sucesos DeviceFocusOut generados cuando se descorrelaciona una ventana siguena cualquier suceso UnmapNotify , pero el orden de DeviceFocusOut con respecto a los sucesosEnterNotify , LeaveNotify , VisibilityNotify y Expose generados no está restringido. Se generan sucesosDeviceFocusIn y DeviceFocusOut para cambios de enfoque de dispositivos de extensión del mismomodo que se generan sucesos de enfoque para los dispositivos de imagen de memoria.

Suceso de notificación de estado de dispositivoEl suceso DeviceStateNotify informa sobre el estado del dispositivo, del mismo modo que en la peticiónQueryDeviceState . Se notifica este suceso a los clientes que han seleccionado DeviceStateNotify parael dispositivo y la ventana, y se genera inmediatamente después de cada EnterNotify y DeviceFocusIn .Si el dispositivo no tiene más de 32 botones, no tiene más de 32 teclas o no tiene más de 3 evaluadores,este suceso puede notificar el estado del dispositivo. Si el dispositivo tiene más de 32 botones, estesuceso irá inmediatamente seguido de un suceso DeviceButtonStateNotify . Si el dispositivo tiene másde 32 teclas, este suceso irá inmediatamente seguido de un suceso DeviceKeyStateNotify . Si eldispositivo tiene más de 3 evaluadores, el suceso irá seguido de uno o más sucesos DeviceValuator .

Sucesos de notificación de estado de teclas y de estado de botonesLos sucesos DeviceKeyStateNotify y DeviceButtonStateNotify contienen información acerca del estadode las teclas y los botones en un dispositivo que no cabe en el suceso de cableado DeviceStateNotify .Los clientes no seleccionan estos sucesos; pueden ir inmediatamente después de un suceso de cableadoDeviceStateNotify y pueden ir combinados con este mediante un solo suceso de clienteDeviceStateNotify que el cliente puede recibir mediante un XNextEvent .

Suceso DeviceMappingNotifyEl suceso DeviceMappingNotify informa de un cambio en la correlación de teclas, modificadores obotones en un dispositivo de extensión. Se notifica este suceso a los clientes seleccionandoDeviceMappingNotify para la ventana y dispositivo y se genera después de cada peticiónSetDeviceButtonMapping , ChangeDeviceKeyMapping o ChangeDeviceModifierMapping del cliente.

Capítulo 5. Utilización de las extensiones en AIXwindows 77

Page 90: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Suceso ChangeDeviceNotifyEl suceso ChangeDeviceNotify informa de un cambio en el dispositivo físico que se utiliza como tecladoX o dispositivo de puntero X. Los sucesos ChangeDeviceNotify se notifican seleccionandoChangeDeviceNotify para el dispositivo y ventana y se generan después de cada peticiónChangeKeyboardDevice o ChangePointerDevice del cliente.

Sucesos de proximidadAlgunos dispositivos (como tableros de gráficos o pantallas táctiles) generan los sucesos ProximityIn yProximityOut para indicar que un estilete se ha puesto en contacto con la superficie de detección deposición o ha perdido el contacto con la misma.

Especificación de extensión de doble almacenamiento intermedio deAIXwindows

IntroducciónLa Extensión de doble almacenamiento intermedio (DBE) ofrece un método estándar de utilizar el doblealmacenamiento intermedio en la estructura del sistema X Window. El doble almacenamiento intermedioutiliza dos almacenamientos intermedios, denominados frontal y posterior, que albergan imágenes. Elalmacenamiento intermedio frontal resulta visible para el usuario; el posterior, no. Las tramas sucesivas deuna imagen animada se representan en el almacenamiento intermedio posterior, mientras que la tramarepresentada anterior se puede ver en el almacenamiento intermedio frontal. Cuando hay una nuevatrama lista, los almacenamientos intermedios posterior y frontal intercambian sus funciones, de modo quese pueda ver una nueva trama. Este intercambio sucede de forma instantánea ante el usuario, sinartificios visuales. Por lo tanto, sólo las imágenes completamente representadas se presentan al usuario ypermanecen visibles durante el intervalo de tiempo que se tarda en preparar una nueva trama. Comoresultado, se obtiene imágenes en movimiento sin parpadeos.

Esta parte contiene las siguientes secciones:

v Objetivos

v Conceptos

v Peticiones

v Codificación

v Enlaces del lenguaje C

ObjetivosEsta extensión debe permitir a los clientes:

v Asignar y desasignar doble almacenamiento intermedio para una ventana.

v Dibujar en los almacenamientos intermedios frontal y posterior de una ventana y leer datos de losmismos.

v Intercambiar los almacenamientos intermedios frontal y posterior asociados a una ventana.

v Especificar una amplia gama de acciones a tomar cuando se intercambia una ventana. Esto incluyeacciones sencillas de intercambio (definidas a continuación) y acciones más complejas (como porejemplo, borrar almacenamientos intermedios auxiliares) que se pueden unir con peticiones ’’begin’’ y’’end’’ (definidas a continuación).

v Solicitar que los almacenamientos intermedios frontal y posterior asociados a varias ventanas de doblealmacenamiento intermedio se conmuten simultáneamente.

Además, la extensión debe:

v Permitir que varios clientes utilicen el doble almacenamiento intermedio en la misma ventana.

v Dar soporte a una amplia gama de métodos de implementación que aprovechen las características dehardware existentes.

78 Guía de programación de AIXwindows

Page 91: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

v No añadir nuevos tipos de sucesos.

v Permitir que se integre de forma razonablemente sencilla con varias arquitecturas de acceso directo ahardware de gráficos (DGHA).

ConceptosLas ventanas normales se crean mediante la petición CreateWindow de imagen de memoria, la cualasigna un conjunto de atributos de ventana y, en el caso de las ventanas InputOutput, un almacenamientointermedio frontal, en el que se puede dibujar una imagen. El contenido de este almacenamientointermedio aparecerá cuando la ventana esté visible.

Esta extensión permite que las aplicaciones utilicen doble almacenamiento intermedio con una ventana.Esto implica la creación de un segundo almacenamiento intermedio, denominado almacenamientointermedio posterior, y asociar uno o más nombres de almacenamiento intermedio posterior (XID) a laventana, para utilizarlos cuando se haga referencia al almacenamiento intermedio posterior de la ventana(por ejemplo, al dibujar en el mismo o al leer del almacenamiento intermedio). El nombre delalmacenamiento intermedio posterior es un DRAWABLE de tipo BACKBUFFER .

La DBE ofrece un modelo relativo de doble almacenamiento intermedio. Un XID, la ventana, siempre hacereferencia al almacenamiento intermedio frontal. Otro u otros XID, los nombres de almacenamientointermedio posterior, siempre hacen referencia al almacenamiento intermedio posterior. Después de unintercambio de almacenamiento intermedio, la ventana sigue haciendo referencia al (nuevo)almacenamiento intermedio frontal, y el nombre del almacenamiento intermedio posterior sigue haciendoreferencia al (nuevo) almacenamiento intermedio posterior. Por lo tanto, las aplicaciones o kits deherramientas que deseen representar datos sólo en el almacenamiento intermedio posterior siempreutilizan el nombre del almacenamiento intermedio posterior para todas las peticiones de dibujos quehacen a la ventana. Partes de una aplicación que desee representar datos en el almacenamientointermedio frontal siempre utilizan el XID de la ventana para todas las peticiones de dibujo que se hacen ala ventana.

Varios clientes y kits de herramientas pueden utilizar el doble almacenamiento intermedio en la mismaventana. La DBE no ofrece una petición que sirva para consultar si una ventana tiene soporte de doblealmacenamiento intermedio, y, si es así, cuál es el nombre del almacenamiento intermedio posterior.Debido a la naturaleza asíncrona del sistema X Window, una petición de este tipo causaría condicionesde contienda. Sin embargo, la DBE permite que existan varios nombres de almacenamiento intermedioposterior para la misma ventana; todos ellos hacen referencia al mismo almacenamiento intermedioposterior físico. La primera vez que se asigna un nombre de almacenamiento intermedio posterior parauna ventana, la ventana pasa a tener doble almacenamiento intermedio y el nombre del almacenamientointermedio posterior se asocia a la ventana. A partir de entonces, la ventana ya es una ventana de doblealmacenamiento intermedio y no cambia ningún aspecto de la ventana cuando se asigna un nuevonombre de almacenamiento intermedio posterior, excepto que el nuevo nombre de almacenamientointermedio posterior se asocia a la ventana. La ventana permanece con doble almacenamiento intermediohasta que se destruye la ventana o hasta que se desasignan todos los nombres de almacenamientointermedio posterior correspondientes a la ventana.

En general, tanto el almacenamiento intermedio frontal como el posterior se tratan del mismo modo. Enconcreto, hay ciertas características importantes, que son las siguientes:

v Sólo se puede ver un almacenamiento intermedio por ventana simultáneamente (el almacenamientointermedio frontal).

v Ambos almacenamientos intermedios asociados a una ventana tienen el mismo tipo visual, profundidad,anchura, altura y forma que la ventana.

v Ambos almacenamientos intermedios asociados a una ventana se pueden hacer ’’visible’’ (u’’obscured’’) del mismo modo. Cuando se genera un suceso de exposición para una ventana, seconsidera que ambos almacenamientos intermedios se han dañado en el área expuesta. Si se producealgún daño en cualquier almacenamiento intermedio, se produce un suceso de exposición en la

Capítulo 5. Utilización de las extensiones en AIXwindows 79

Page 92: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

ventana. Cuando se expone un doble almacenamiento intermedio, ambos almacenamientos intermediosse colocan en mosaico con el fondo de la ventana, exactamente como indica el protocolo de núcleo.Aunque el almacenamiento intermedio posterior no resulte visible, se aplican términos como oscuro(obscure) al almacenamiento intermedio posterior, así como al almacenamiento intermedio frontal.

v Se puede pasar un BACKBUFFER en cualquier petición en cualquier momento, en particular en cualquierpetición de dibujo de extensión o de imagen de memoria, que espere un DRAWABLE .Esto permite a unaaplicación dibujar directamente en BACKBUFFER del mismo modo que lo haría en cualquier otro DRAWABLE.

v Es un error (Window) pasar un BACKBUFFER en una petición de imagen de memoria que espera unWindow.

v El X de imagen de memoria nunca enviará un BACKBUFFER en una respuesta, suceso o error en la quese especifique una ventana.Si los atributos backing-store y save-under de X11 se aplican a unaventana de doble almacenamiento intermedio, se aplican a ambos almacenamientos intermedios porigual.

v Si se ejecuta la petición ClearArea de imagen de memoria en una ventana de doble almacenamientointermedio, se borra la misma área en los almacenamientos intermedios frontal y posterior.

El efecto de pasar una ventana a una petición que acepta un DRAWABLE no resulta modificado por estaextensión. La ventana y el almacenamiento intermedio frontal son mutuamente sinónimos. Esto incluye elobedecer a la semántica de GetImage y a la semántica de modalidad de subventana si interviene uncontexto de gráficos de imagen de memoria.Independientemente de si se pasó de forma explícita unapetición GetImage o se hizo referencia a la misma de forma implícita (por ejemplo, se pasó uno de losantecesores de la ventana en la petición), siempre se hace referencia al almacenamiento intermediofrontal (es decir, visible). Por lo tanto, los clientes de vuelco de pantalla que no conocen la DBE siempreobtendrán el almacenamiento intermedio frontal. La petición GetImage del almacenamiento intermedioposterior devuelve contenido indefinido de imagen para cualquier región oscurecida (obscured) delalmacenamiento intermedio posterior que entre dentro de la imagen.

Al dibujar en un almacenamiento intermedio posterior siempre se utiliza la región de recorte que seutilizaría para dibujar en el almacenamiento intermedio frontal con una modalidad de subventanaClipByChildren . Si se dibuja en un antecesor de una ventana de doble almacenamiento intermedio conun GC de imagen de memoria que tiene una modalidad de subventana IncludeInferiors , el efecto delalmacenamiento intermedio posterior de la ventana de doble almacenamiento intermedio depende de laprofundidad de la ventana de doble almacenamiento intermedio y de la del antecesor.Si ambasprofundidades coinciden, el contenido del almacenamiento intermedio posterior de la ventana de doblealmacenamiento intermedio no se modifica. Si las profundidades son distintas, el contenido del doblealmacenamiento intermedio posterior de la ventana correspondiente a los pixels que el dibujoIncludeInferiors haya tocado queda indefinido.

La DBE no añade nuevos sucesos. La DBE no amplía la semántica de ninguno de los sucesos existentes,con la excepción de que añade un nuevo DRAWABLE denominado BACKBUFFER .Si se generan sucesos,respuestas o errores que contienen un DRAWABLE (por ejemplo, GraphicsExpose ) como respuesta a unapetición, el DRAWABLE que se devuelva será el especificado en la petición.

La DBE notifica los visuales que dan soporte al doble almacenamiento intermedio.

La DBE no incluye ningún recurso de sincronización ni ningún recurso horario.

Operaciones de gestión de ventanasLa filosofía de la DBE se basa en que las operaciones de gestión de X Window de imagen de memoriatratan por igual ambos almacenamientos intermedios.

Cuando se ejecuta el DestroyWindow de imagen de memoria en una ventana de doble almacenamientointermedio, se eliminan ambos almacenamientos intermedios asociados a la ventana y se liberan todoslos nombres de almacenamientos intermedios posteriores asociados a la ventana.

80 Guía de programación de AIXwindows

Page 93: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Si la petición ConfigureWindow de imagen de memoria cambia el tamaño de una ventana, ambosalmacenamientos intermedios adoptan el nuevo tamaño. Si se aumenta el tamaño de la ventana, el efectosobre los almacenamientos intermedios depende de si la implementación da soporte a la gravedad de bitspara los almacenamientos intermedios. Si se da soporte a la gravedad de bits, el contenido de ambosalmacenamientos intermedios se mueve de acuerdo a la gravedad de bits de la ventana (consulte lapetición ConfigureWindow de imagen de memoria) y el resto de las áreas se colocan en mosaico con elfondo de la ventana. Si no se da soporte a la gravedad de bits, toda la región no oscurecida de ambosalmacenamientos intermedios se coloca en mosaico con el fondo de la ventana. En cualquier caso, segeneran sucesos de exposición Expose para la región que se coloca en mosaico con el fondo de laventana.

Si se ejecuta la petición GetGeometry de imagen de memoria en un BACKBUFFER, los valores devueltos dex, y y border-width serán cero.

Si las peticiones ShapeRectangles , ShapeMask , ShapeCombine o ShapeOffset de la extensión Shapese ejecutan en una ventana de doble almacenamiento intermedio, se cambian de forma ambosalmacenamientos intermedios para que coincidan con la nueva forma de la ventana. La diferencia de lasregiones

D = FormaNueva - FormaAntigua

se coloca en mosaico con el fondo de la ventana en ambos almacenamientos intermedios y se generansucesos Expose para D.

Acciones de intercambio complejoLa DBE no tiene conocimiento explícito de los almacenamientos intermedios auxiliares (por ejemplo,almacenamientos intermedios de profundidad o almacenamientos intermedios alfa) y tiene únicamente ungrupo limitado de acciones de intercambio definidas. Es posible que algunas aplicaciones necesiten ungrupo más amplio de acciones de intercambio que las que ofrece la DBE. Algunas implementaciones deDBE tienen conocimiento de almacenamientos intermedios auxiliares y/o pueden ofrecer una gama másamplia de acciones de intercambio. En lugar de tener que ampliar continuamente la DBE a fin deaumentar su grupo de acciones de intercambio, la DBE ofrece un mecanismo flexible de ’’expresiónidiomática’’. Si las acciones de intercambio definidas cumplen con los requisitos de una aplicación, éstadebe utilizarlas; en caso contrario, debe utilizar el siguiente método de expresar una acción deintercambio complejo como una expresión idiomática. Si se sigue esta política, se consigue el mejor nivelde rendimiento posible en una amplia variedad de implementaciones.

Tal como sugiere el término ′′expresión idiomática’’, una acción de intercambio complejo se debe expresarcomo un grupo o serie de peticiones. La implementación puede combinar este grupo de peticiones en unaoperación atómica, a fin de maximizar el rendimiento. El grupo de expresiones idiomáticas actualmentereconocidos que se pueden optimizar depende de la implementación. Para que pueda recibir ayuda encuanto a la interpretación y expresión de la expresión idiomática, este debe rodearse de dos peticiones deprotocolo: DBEBeginIdiom y DBEEndIdiom . Una implementación no reconocerá la expresión idiomática,a no ser que esté precedida y seguida de este par begin-end, lo cual afectaría negativamente alrendimiento.

Por ejemplo, si una aplicación desea intercambiar almacenamientos intermedios correspondientes a dosventanas y utilizar X de imagen de memoria para borrar sólo algunos planos de los almacenamientosintermedios posteriores, la aplicación emitiría la siguiente petición de protocolo como un grupo, y en elsiguiente orden:

v Petición DBEBeginIdiom .

v Petición DBESwapBuffers con los XID para dos ventanas, cada una de las cuales utiliza una acciónde intercambio Untouched.

v Petición PolyFillRectangle de C de imagen de memoria al almacenamiento intermedio posterior deuna ventana.

Capítulo 5. Utilización de las extensiones en AIXwindows 81

Page 94: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

v Petición PolyFillRectangle de X de imagen de memoria al almacenamiento intermedio posterior de laotra ventana.

v Petición DBEEndIdiom .

Las peticiones DBEBeginIdiom y DBEEndIdiom no realizan ninguna acción por sí mismas. Lasimplementaciones que pueden combinar ciertos grupos o series de peticiones como expresionesidiomáticas las tratan como marcadores y las otras implementaciones las pasan por alto; también sepasan por alto los grupos o series no reconocidos de peticiones. Si estas peticiones se envían cuando noprocede, o bien no coinciden, no se envía ningún error y las peticiones se ejecutan como de costumbre,aunque posiblemente en detrimento del rendimiento.

No es preciso que una expresión idiomática incluya una petición DBESwapBuffers . Por ejemplo, si sedesea la acción de intercambio Copied, pero sólo se tienen que copiar algunos de los planos, se puedeutilizar la petición CopyArea de X de imagen de memoria en lugar de la petición DBESwapBuffers . Si seincluye DBESwapBuffers en una expresión idiomática, la petición debe ir inmediatamente después de lapetición DBEBeginIdiom .Además, si se incluye DBESwapBuffers en una expresión idiomática, estaacción de intercambio de la petición seguirá siendo válida y si la acción de intercambio se solapa con otrapetición, el resultado final de la expresión idiomática debe ser igual al que se produciría si se ejecutaranen serie las distintas peticiones.Por ejemplo, si la acción de intercambio especificada es Untouched, y sise realiza un PolyFillRectangle utilizando un recorte rectangular de cliente en el almacenamientointermedio posterior de la ventana después de la petición DBESwapBuffers , el contenido del nuevoalmacenamiento intermedio posterior (después de la expresión idiomática) será el mismo que el que segeneraría si la implementación no hubiera reconocido la expresión idiomática.

PeticionesEn esta sección se describen las siguientes peticiones:

v DBEGetVersion

v DBEGetVisualInfo

v DBEAllocateBackBufferName

v DBEDeallocateBackBufferName

v DBESwapBuffers

v DBEBeginIdiom

v DBEEndIdiom

v DBEGetBackBufferAttributes

DBEGetVersionEsta petición devuelve los números de versión mayor y menor de esta extensión.

DBEGetVersion:client-major-version : CARD8client-minor-version : CARD8=>server-major-version : CARD8server-minor-version : CARD8

Los números client-major-version y client-minor-version indican cuál es la versión del protocolo que elcliente desea que el servidor implemente. Los números server-major-version y server-minor-versiondevueltos indican el protocolo al que da soporte esta extensión actualmente. Puede no coincidir con laversión enviada por el cliente. Una implementación puede (aunque no necesariamente) dar soporte a másde una versión simultáneamente. Los números server-major-version y server-minor-version permiten quese creen las revisiones futuras del protocolo de Extensión de doble almacenamiento que resultennecesarias.En general, la versión mayor se incrementaría en el caso de cambios incompatibles y laversión menor se incrementaría en el caso de cambios pequeños y compatibles con versiones anteriores.

82 Guía de programación de AIXwindows

Page 95: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Los servidores que dan soporte al protocolo definido en este documento devuelven unserver-major-version igual a uno (1), y un server-minor-version igual a cero (0).

El cliente de Doble almacenamiento intermedio debe emitir una petición DBEGetVersion antes decualquier otra petición de Doble almacenamiento intermedio para negociar una versión de protocolocompatible, de lo contrario el cliente conseguirá un funcionamiento indefinido (puede que DBE funcione ono).

DBEGetVisualInfoEsta petición devuelve información sobre los visuales que dan soporte al doble almacenamientointermedio.

DBEGetVisualInfo:screen-specifiers : LISTofDRAWABLE=>visinfo : LISTofSCREENVISINFO

(Errores: Drawable)

Se aplican las siguientes definiciones de tipo:SCREENVISINFO : LISTofVISINFOVISINFO: [VISUALID visual;

CARD8 depth;CARD8 perflevel]

Todos los valores pasados en screen-specifiers deben ser DRAWABLE válidos (o se producirá un errorDrawable). Para cada drawable contenido en screen-specifiers, la respuesta contendrá una lista deestructuras VISINFO correspondientes a los visuales que dan soporte al doble almacenamiento intermedioen la pantalla en la que reside el drawable.El miembro visual especifica el VISUALID . El miembro depthespecifica la profundidad en bits del visual. El miembro perflevel constituye una indicación del rendimientodel sistema. La única operación definida en un perflevel es la comparación con un perflevel de otro visualde la misma pantalla. El visual que tiene el perflevel más alto tendrá probablemente un mejor rendimientode gráficos de doble almacenamiento intermedio que el visual que tiene el perflevel más bajo. No sepuede sacar ninguna conclusión de los siguientes elementos: magnitud de la diferencia entre los dosperflevel, un valor perflevel aislado o la comparación entre los perflevel de distintos servidores.

Si la lista de screen-specifiers está vacía, se devolverá información para todas las pantallas, empezandopor la pantalla cero.

DBEAllocateBackBufferNameEsta petición asigna un ID de drawable que se utiliza para hacer referencia al almacenamiento intermedioposterior de una ventana.

DBEAllocateBackBufferName:window : WINDOWback-buffer-name : BACKBUFFERswap-action-hint : SWAPACTION

(Errores: Alloc, Value, IDChoice, Match, Window)

Si la ventana no es ya una ventana de doble almacenamiento intermedio, se convierte en una ventana deeste tipo y back-buffer-name se asocia a ella. swap-action-hint indica al servidor la acción de intercambioque probablemente se utilizará con la ventana en las siguientes peticiones DBESwapBuffers .swap-action-hint debe tener uno de los valores especificados para el tipo SWAPACTION (si no es así. seproduce un error Value).Consulte la descripción de la petición DBESwapBuffers para ver una definicióncompleta de las acciones de intercambio y del tipo SWAPACTION.

Capítulo 5. Utilización de las extensiones en AIXwindows 83

Page 96: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Si la ventana ya es una ventana de doble almacenamiento intermedio, no cambia nada en ella, salvo queun back-buffer-name adicional se asocia a ella. La ventana continúa teniendo doble almacenamientointermedio hasta que se destruya o hasta que se desasignen todos los nombres de doble almacenamientointermedio correspondientes a la ventana.

La ventana pasada a la petición debe ser un valor WINDOW válido (o se producirá un error Window). Laventana que se pasa en la petición debe ser una ventana InputOutput (si no es así, se produce un errorMatch). El visual de la ventana debe estar en la lista que devuelve DBEGetVisualInfo (si no es así, seproduce un error Match).El back-buffer-name debe estar comprendido en el rango asignado al cliente y nopuede ser uno ya utilizado (si no es así, se produce un error IDChoice).Si el servidor no puede asignartodos los recursos asociados al intercambio del doble almacenamiento intermedio correspondiente a laventana, se produce un error Alloc, el estado de doble almacenamiento intermedio* de la ventana no semodifica (sea o no una ventana de doble almacenamiento intermedio) y se libera el back-buffer-name.

DBEDeallocateBackBufferNameEsta petición libera un ID de drawable obtenido por DBEAllocateBackBufferName .

DBEDeallocateBackBufferName:back-buffer-name : BACKBUFFER

(Errores: Buffer)

El back-buffer-name pasado en la petición se libera y deja de estar asociado a la ventana. Si se trata delúltimo back-buffer-name asociado a la ventana, los clientes dejan de poder acceder al almacenamientointermedio posterior y se pueden liberar todos los recursos de doble almacenamiento intermedioasociados a la ventana.El almacenamiento intermedio frontal actual de la ventana sigue siendo elalmacenamiento intermedio frontal.

El back-buffer-name debe ser un BACKBUFFER válido asociado a una ventana (o se producirá un errorBuffer).

DBESwapBuffersEsta petición intercambia los almacenamientos intermedios correspondientes a todas las ventanas listadasy aplica la acción de intercambio correcta a cada una de ellas.

DBESwapBuffers:windows : LISTofSWAPINFO

(Errores: Match, Window, Value)

Se aplican las siguientes definiciones de tipo:SWAPINFO : [ WINDOW window; SWAPACTION swap-action ]

SWAPACTION : {Undefined, Background, Untouched, Copied}

Cada ventana pasada en la petición debe ser un valor WINDOW válido (o se producirá un error Window).Cada ventana que se pasa en la petición debe ser una ventana de doble almacenamiento intermedio (sino es así, se produce un error Match). Cada ventana que se pasa en la petición debe estar listada unasola vez (si no es así, se produce un error Match). Cada swap-action de la lista debe tener uno de losvalores especificados para el tipo SWAPACTION (si no es así, se produce un error Value).Si se produce unerror, no se intercambia ninguno de los almacenamientos intermedios de las ventanas de doblealmacenamiento intermedio.

La swap-action determina qué le pasará al nuevo almacenamiento intermedio posterior de la ventana conla que está emparejado en la lista, además de hacer visible el antiguo almacenamiento intermedioposterior. Las acciones definidas son las siguientes:

84 Guía de programación de AIXwindows

Page 97: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Undefined El contenido del nuevo almacenamiento intermedio posterior pasa a ser indefinido. Esta puederesultar la acción más eficaz, puesto que permite que la implementación descarte el contenidodel almacenamiento intermedio si hace falta.

Background La región no oscurecida del nuevo almacenamiento intermedio posterior se coloca en mosaicoen el fondo de la ventana. La acción background permite que los dispositivos utilicen un recursorápido de borrado durante un intercambio.

Untouched La región no oscurecida del nuevo almacenamiento intermedio posterior no se modifica comoconsecuencia del intercambio.

Copied La región no oscurecida del nuevo almacenamiento intermedio posterior pasa a ser el contenidodel almacenamiento intermedio posterior antiguo.

Si se incluye DBESwapBuffers en el tipo de expresión idiomática ’’swap and clear’’, debe estarinmediatamente después de la petición DBEBeginIdiom .

DBEBeginIdiomEsta petición informa al servidor que inmediatamente después de esta petición hay un intercambiocomplejo.

DBEBeginIdiom: Tal como se ha mencionado anteriormente, una acción de intercambio complejo es ungrupo o serie de peticiones que la implementación puede combinar en una operación atómica. La únicafunción de esta petición consiste en servir de ’’marker’’ que el servidor pueda utilizar como ayuda en elproceso de una expresión idiomática. El servidor puede implementar esta petición como no-op.

DBEEndIdiomEsta petición informa al servidor que ha concluido un intercambio complejo.

DBEEndIdiom: La única función de esta petición consiste en servir como ′′marcador’’ que pueda utilizarel servidor como ayuda en el proceso de una expresión idiomática. El servidor puede implementar estapetición como no-op.

DBEGetBackBufferAttributesEsta petición devuelve información sobre un almacenamiento intermedio posterior.

DBEGetBackBufferAttributes:back-buffer-name : BACKBUFFER=>attributes : BUFFER_ATTRIBUTES

Se aplican las siguientes definiciones de tipo:BUFFER_ATTRIBUTES: [WINDOW window;]

Si back-buffer-name es un BACKBUFFER válido, el campo window de los atributos de la respuesta será laventana que tiene el almacenamiento intermedio posterior al que back-buffer-name hace referencia. Siback-buffer-name no es un BACKBUFFER válido, el campo window de los attributes de la respuesta seráNone.

CodificaciónConsulte el documento X11 Protocol Encoding, puesto que en esta sección se utilizan conveniossintácticos definidos en dicho documento.

El nombre de esta extensión es ′′DOUBLE-BUFFER’’.

TiposLa extensión utiliza los siguientes tipos nuevos.BACKBUFFER : XID

Capítulo 5. Utilización de las extensiones en AIXwindows 85

Page 98: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

SWAPACTION#x00 Undefined#x01 Background#x02 Untouched#x03 Copied

SWAPINFO4 WINDOW ventana1 SWAPACTION acción intercambio3 no utilizado

VISINFO4 VISUALID visual1 CARD8 profundidad

1 CARD8 perflevel2 no utilizado

SCREENVISINFO4 CARD32 n, número de la lista8n LISTofVISINFO n VISINFOs

BUFFER_ATTRIBUTES4 WINDOW ventana

ErroresBuffer1 0 error1 error base + 0 código2 CARD16 número de secuencia4 CARD32 almacenamiento intermedio erróneo2 CARD16 opcode-menor1 CARD8 opcode-mayor21 no utilizado

Peticiones

DBEGetVersion:1 CARD8 opcode-mayor1 0 opcode-menor2 2 longitud de la petición1 CARD8 versión-mayor-cliente1 CARD8 versión-menor-cliente2 no utilizado=>1 1 Respuesta1 no utilizado2 CARD16 número de secuencia4 0 longitud de la respuesta1 CARD8 versión-mayor-servidor1 CARD8 versión-menor-servidor22 no utilizado

DBEAllocateBackBufferName:1 CARD8 opcode-mayor1 1 opcode-menor4 WINDOW ventana4 BACKBUFFER nombre almacenamiento intermedio posterior1 SWAPACTION acción intercambio recomendada3 no utilizado

DBEDeallocateBackBufferName:1 CARD8 opcode-mayor1 2 opcode-menor4 BACKBUFFER nombre almacenamiento intermedio posterior

DBESwapBuffers:

86 Guía de programación de AIXwindows

Page 99: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

1 CARD8 opcode-mayor1 4 opcode-menor4 CARD32 n, número de pares acciones ventana/intercambio de la lista8n LISTofSWAPINFO pares acciones ventana/intercambio

DBEBeginIdiom:1 CARD8 opcode-mayor1 4 opcode-menor2 1 longitud petición

DBEEndIdiom:1 CARD8 opcode-mayor1 5 opcode-menor2 1 longitud petición

DBEGetVisualInfo:1 CARD8 opcode-mayor1 6 opcode-menor2 2+n longitud petición4 CARD32 n, número de especificadores de pantalla de la lista4n LISTofDRAWABLE n especificadores de pantalla=>1 1 Respuesta1 no utilizado2 CARD16 número de secuencia4 CARD32 longitud respuesta4 CARD32 m, número de SCREENVISINFO de la lista20 no utilizado4j LISTofSCREENVISINFO m SCREENVISINFOs

DBEGetBackBufferAttributes:1 CARD8 opcode-mayor1 7 opcode-menor42 2 longitud de la petición4 BACKBUFFER back-buffer-name=>1 1 Respuesta1 no utilizado2 CARD16 número de secuencia4 0 longitud de la respuesta4 BUFFER_ATTRIBUTES atributos20 no utilizado

Enlaces del lenguaje CLa cabecera de esta extensión es <X11/extensions/Xdbe.h> . Todos los nombres de indentificadores quese ofrecen en esta cabecera empiezan por Xdbe.

TiposEl tipo XdbeBackBuffer es un Drawable.

Ek tipo XdbeSwapAction puede ser una de las constantes XdbeUndefined , XdbeBackground ,XdbeUntouched o XdbeCopied .

FuncionesLas rutinas de C ofrecen acceso directo al protocolo y no añaden semántica adicional. Para obtenerdetalles completos sobre los efectos de estas funciones, consulte las peticiones de protocolo adecuadas,que se pueden obtener sustituyendo Xdbe al principio del nombre de la función por DBE. Todas lasfunciones que tienen un tipo de retorno Status devolverán un valor distinto de cero si son satisfactorias yun cero si fallan.

Capítulo 5. Utilización de las extensiones en AIXwindows 87

Page 100: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

StatusXdbeQueryExtension ( Display * dpy , int * major_version_return,int * minor_version_return

Define major_version_return yminor_version_return como las versiones de protocolo de DBE mayor ymenor soportadas por el servidor. Si la biblioteca de DBE es combatible con la versión que devuelve elservidor, esta función devuelve un valor distinto de cero. Si dpy no da soporte a la extensión DBE, si seprodujo algún error durante la comunicación con el servidor o si las versiones del servidor y del protocolode biblioteca son incompatibles, esta función devuelve un cero.No se puede llamar a ninguna otra funciónXdbe antes que a esta función. Si un cliente viola esta norma, los efectos sobre las siguientes llamadasXdbe que efectúa resultan imprevisibles.XdbeScreenVisualInfo *XdbeGetVisualInfo ( Display * dpy, Drawable * screen_specifiers,int * num_screens

Esta función devuelve información sobre los visuales que dan soporte al doble almacenamientointermedio. El argumento num_screens especifica el número de elementos que hay en la listascreen_specifiers .Cada drawable que hay en screen_specifiers designa una pantalla para la que sesolicitan los visuales soportados.Si num_screens es cero, se solicita información sobre todas laspantallas.En este caso, tras la respuesta de esta función, num_screens se define con el valorcorrespondiente al número de pantallas encontradas.Si se produce un error, esta función devuelve unNULO; si no, devuelve un puntero a la lista de estructuras XdbeScreenVisualInfo de longitudnum_screens.El elemento número n de la lista devuelta corresponde al drawable número n de la listascreen_specifiers, a no ser que se pasara num_screens con el valor cero, en cuyo caso el elementonúmero n de la lista devuelta corresponde a la pantalla número n del servidor, empezando por la pantallacero.

La estructura XdbeScreenVisualInfo tiene los siguientes campos:int count número elementos de visinfoXdbeVisualInfo* visinfo lista de visuales y profundidades

correspondiente a esta ventana

La estructura XdbeVisualInfo tiene los siguientes campos:VisualID visual un ID de visual que dé

soporte al doble almacenamiento intermedioint depth profundidad del visual en bitsint perflevel nivel de rendimiento del visual

voidXdbeFreeVisualInfo (XdbeScreenVisualInfo * visual_info)

Esta función libera la lista de XdbeScreenVisualInfo devuelta por la función XdbeGetVisualInfo .XdbeBackBufferXdbeAllocateBackBufferName (Display * dpy , Window window ,XdbeSwapAction swap_action)

Esta función devuelve un ID de drawable utilizado para hacer referencia al almacenamiento intermedioposterior del valor window especificado. swap_action corresponde a una recomendación que indica laacción de intercambio que probablemente se utilizará en las siguientes llamadas a XdbeSwapBuffers .Laacción de intercambio real utilizada en las llamadas a XdbeSwapBuffers no tiene necesariamente queser igual a la swap_action que se pasa a esta función, aunque se recomienda a los clientes quesuministren información adecuada siempre que les sea posible.StatusXdbeDeallocateBackBufferName (Display * dpy , XdbeBackBufferbuffer)

88 Guía de programación de AIXwindows

Page 101: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Esta función libera un ID de drawable, buffer, que se obtuvo mediante XdbeAllocateBackBufferName . Elbuffer debe ser un nombre válido de almacenamiento intermedio posterior de una ventana; si no es así,se produce un error XdbeBadBuffer .StatusXdbeSwapBuffers (Display * dpy , XdbeSwapInfo * swap_info, intnum_windows)

Esta función intercambia los almacenamientos intermedios frontal y posterior correspondientes a una listade ventanas. El argumento num_windows especifica el número de ventanas cuyos almacenamientosintermedios se intercambian; es el número de elementos de la matriz swap_info.El argumento swap_infoespecifica la información que necesita cada ventana para realizar el intercambio.

La estructura XdbeSwapInfo tiene los siguientes campos:Window swap_window ventana cuyos almacenamientos intermedios se intercambiaránXdbeSwapAction swap_action acción de intercambio a utilizar para esta

wap_window

StatusXdbeBeginIdiom (Display * dpy)

Esta función marca el principio de una secuencia de expresión idiomática. Consulte la sección Accionesde intercambio complejo para ver un análisis completo de las expresiones idiomáticas.StatusXdbeEndIdiom (Display * dpy)

Esta función marca el final de una secuencia de expresión idiomática.XdbeBackBufferAttributes *XdbeGetBackBufferAttributes (Display * dpy , XdbeBackBufferbuffer)

Esta función devuelve los atributos asociados al almacenamiento intermedio especificado.

La estructura XdbeBackBufferAttributes tiene los siguientes campos:Window window ventana a la que pertenece el almacenamiento intermedio

Si buffer no es unXdbeBackBuffer válido, window se define como None (Ninguna).

La estructura XdbeBackBufferAttributes devuelta puede liberarse con la función XFree de Xlib.

ErroresLa estructura XdbeBufferError tiene los siguientes campos:int tipoDisplay * display Pantalla de la que se ha leído el sucesoXdbeBackBuffer buffer id de recursounsigned long serial número serie de la petición fallidaunsigned char error_code error base + XdbeBadBufferunsigned char request_code op-code mayor de la petición fallidaunsigned char minor_code op-code menor de la petición fallida

Extensión XTest de AIXwindows

Visión generalEsta extensión constituye un conjunto mínimo de las extensiones de cliente y de servidor necesarias paraprobar por completo el servidor X11 sin intervención del usuario.

Esta extensión no está pensada para dar soporte a acciones de diario y de reproducción de acciones deusuario. Ésta constituye un área complicada, puesto que intenta sincronizar interacciones sintéticas de

Capítulo 5. Utilización de las extensiones en AIXwindows 89

Page 102: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

usuarios con sus efectos; se produce a un nivel superior de grabación y reproducción de diálogo, no a unnivel estrictamente léxico. Esta extensión sirve para estos últimos casos más sencillos.

Esta extensión ofrece un grupo mínimo de recursos que solucionan problemas inmediatos de prueba yvalidación.

Esta extensión cumple con los siguientes objetivos.

v Limitar la extensión a un nivel alto adecuado dentro del servidor a fin de minimizar los problemas deportabilidad.En la práctica, esto significa que la extensión debe estar al nivel DIX o debe utilizar lainterfaz DIX/DDX, o ambas cosas. Esto tiene sus efectos, en concreto en el nivel al que se produce la″síntesis de entrada″.

v Minimizar los cambios necesarios en el resto del servidor.

v Minimizar los efectos negativos sobre el rendimiento durante la operación normal del servidor.

Para obtener información adicional, consulte los temas siguientes:

v Descripción

v Tipos

v Enlace Xlib del lenguaje C

DescripciónLas funciones proporcionadas por esta extensión pertenecen a dos grupos: operaciones de cliente ypeticiones de servidor.

Operaciones de clienteLa Extensión XTest incluye las siguientes operaciones de cliente:

v XTestSetGContextOfGC

v XTestSetGVisualIDOf Visual

v XTestDiscard

Estas rutinas manipulan cierto comportamiento del lado del cliente que sin ellas quedaría oculto. Laimplementación real dependerá de los detalles del enlace de lenguaje real y del nivel de almacenamientointermedio de petición, antememoria de GContext, etc. que se suministre. En los enlaces C, definidos enEnlaces Xlib del lenguaje C, se proporcionan rutinas para acceder a los elementos internos de dosestructuras de datos opacas: GC y visual, así como para descartar las peticiones que estuviesenpendientes en el almacenamiento intermedio de salida de una conexión. Los detalles exactos puedendiferir para otros enlaces de lenguaje.

Existen definiciones abstractas de la funcionalidad. Hacen referencia a objetos del lado del cliente, comoson los ″GC″ y los ″VISUAL″, que se expresan entre comillas para indicar su naturaleza abstracta. Lasversiones concretas de estas funciones sólo están definidas para determinados enlaces de lenguaje. Bajociertas circunstancias, es posible que un enlace de lenguaje determinado no implemente el tipo abstractorelevante o puede que lo proporcione como un tipo transparente (en lugar de tipo opaco), con lo que lafunción correspondiente no tiene sentido o no se necesita, respectivamente.

Peticiones del servidorLa Extensión XTest incluye las siguientes peticiones de servidor:

v XTestGetVersion

v XTestCompareCursor

v XTestFakeInput

La primera de estas peticiones se parece a la que se ofrece en la mayoría de las extensiones: permite aun cliente especificar un número de versión mayor y menor al servidor y a éste responder con sus propiasversiones mayor y menor. Las dos peticiones restantes

90 Guía de programación de AIXwindows

Page 103: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

1. Permiten el acceso a un recurso del servidor que de no ser por ellas sería de ″sólo grabación″: elcursor asociado a una determinada ventana; y

2. Permiten, lo que quizás sea más importante, la síntesis limitada de sucesos de dispositivos deentrada, casi como si un usuario cooperante hubiera movido el dispositivo de puntero o hubierapulsado una tecla o un botón.

TiposSe utilizan los siguientes tipos en las definiciones de sucesos y peticiones.FAKE_EVENT_TYPE: {KeyPress, KeyRelease, MotionNotify, ButtonPress, ButtonRelease}

FAKE_XINPUT_EVENT_TYPE: { XI_DeviceKeyPress, XI_DeviceKeyRelease, XI_DeviceMotionNotify,

XI_DeviceButtonPress, XI_DeviceButtonRelease, ProximityIn, ProximityOut }

FAKE_EVENT: [type:FAKE_EVENT_TYPE; detail: BYTE; time: TIME; root: WINDOW; rootX: INT16; rootY:INT16;]

FAKE_XINPUT_EVENT: [ type: FAKE_XINPUT_EVENT_TYPE; detail : BYTE; time : TIME; root : WINDOW; rootX :INT16; rootY : INT16; state : KeyButMask; same_screen : BOOL; deviceid : BYTE ]

FAKE_VALUATOR_EVENT: [ type :XI_DeviceValuator; deviceid : BYTE; device_state : KeyButMask; num_valuators :BYTE; first_valuator : BYTE; valuator(0-5) : LISTofINT32 ]

CurrentCursor--1

La Extensión XTest incluye los siguientes tipos nuevos:FAKE_EVENT_TYPE

2 KeyPress3 KeyRelease4 ButtonPress5 ButtonRelease6 MotionNotify

FAKE_XINPUT_EVENT_TYPE

Nota: Los valores anteriores se han definido de modo que sean equivalentes a los tipos de sucesoscorrespondientes del protocolo de núcleo. Los valores para FAKE_XINPUT_EVENT_TYPE se handefinido para que sean iguales que los de la Extensión XInput .

Enlace Xlib del lenguaje CLas rutinas del lenguaje C proporcionan un acceso directo al protocolo y no añaden semántica adicional alas definidas en Peticiones de servidor, o corresponden directamente a las descripciones abstractas de lasoperaciones de cliente de Operaciones de cliente .

Todas las funciones y los procedimientos de la Extensión XTest , así como todas las constantes y macrosmanifiestas, comienzan por la serie ″XTest″. Todas las operaciones están clasificadas comoservidor/cliente (Server) o como sólo-cliente (Client). Todas las rutinas cuyo tipo de retorno es Statusdevolverán valores distintos de cero para indicar una función satisfactoria y el valor cero para indicarfunciones fallidas. Aunque se soporte le Extensión XTest , puede que el servidor retire estos recursos deforma arbitraria; en tal caso devolverán a partir de este momento el valor cero.

La Extensión XTest incluye las siguientes rutinas de lenguaje C:

v XTestQueryExtension

v XTestCompareCursorWithWindow

v XTestCompareCurrentCursorWithWindow

v XTestFakeKeyEvent

v XTestFakeButtonEvent

v XTestFakeMotionEvent

Capítulo 5. Utilización de las extensiones en AIXwindows 91

Page 104: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

v XTestFakeRelativeMotionEvent

v XTestGrabControl

v XTestSetGContextOfGC

v XTestSetVisualIDOfVisual

v XTestDiscard

92 Guía de programación de AIXwindows

Page 105: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Capítulo 6. Biblioteca de captura de pantalla de AIXwindows

La biblioteca de capturas de pantalla de X-Windows mejorado ofrece una API de uso general que sirvepara capturar imágenes de la pantalla en un formato que se pueda utilizar con otras aplicaciones.También ofrece un método para almacenar datos en disco (a fin de recuperarlos y exportarlos a otrosformatos estándar).

Funciones de captura de pantalla

Dispone de las siguientes funciones en la biblioteca de capturas de pantalla de X-Windows mejorado:

Tipos de capturasExisten las dos familias de funciones siguientes que sirven para capturar datos de la pantalla:

captura deventana

La región de la pantalla que se debe devolver se identifica como un id X-Windows. Se le tratacomo si fuera el padre de una jerarquía de ventanas, y se captura y se devuelve la región de laventana limitada por los bordes de dicha ventana. (Llame a la función XMapRaised paraasegurarse de que la ventana está expuesta.)

captura de región La región de la pantalla que se debe capturar se identifica por sus coordenadas superiorizquierda e inferior derecha. Se comprueban todas las ventanas que solapen la región definida,incluida la ventana raíz. Se pasan por alto las ventanas que estén completamente oscurecidas. Sino lo están, se lee la intersección entre la ventana y la región indicada y se añade a un mapa dememoria combinada.

Formatos de los datos devueltosExisten cuatro opciones de devolución de datos:

v Devolver siempre datos RGB de 24 bits (color real de 24 bits)

v Devolver siempre datos en seudo color (8 bits si el número total de colores utilizados es menor que255; 24 bits si no es así). Otras opciones son 12 bits o permitir que el usuario especifique 12 bits o 24bits)

v Devolver siempre la mejor opción (seudo color de 8 bits si hay menos de 255 colores; RGB si no esasí)

v Devolver siempre datos de 8 bits con la compresión de color que seleccione el usuario.

Estructuras de datosTodos los datos de imagen devueltos están en formato XImage . En el caso de visuales que necesitentablas de colores, la tabla de colores se devuelve como una matriz XColor . El tamaño de la tabla decolores se devuelve como un int.

Puede proporcionar almacenamiento para XImage o dejar que la API de captura de pantalla asigne elalmacenamiento. En cualquiera de los casos, la aplicación llama a la función XDestroyImage para que lolibere.

Puede proporcionar almacenamiento para XColor o dejar que la API de captura de pantalla asigne elalmacenamiento. En cualquiera de los casos, la aplicación llama a la función free de la biblioteca C paraque lo libere.

© Copyright IBM Corp. 1997, 2001 93

Page 106: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Funciones de E/S de archivosLa salida se pasa a una corriente, cuyo ID suministra la aplicación que efectúa la llamada. La aplicaciónque efectúa la llamada debe asegurarse de que la corriente está abierta y que la aplicación puede grabaren la misma antes de llamar a las funciones de salida. La aplicación que efectúa la llamada debe tambiénvaciar y cerrar la corriente después de llamar a las funciones de salida.

Interfaz de programación en CDispone de las siguientes estructuras e interfaz de C en la biblioteca de capturas de pantalla deX-Windows mejorado:

Estructura de datos de entradaLa estructura KDATA permite que se amplíe la interfaz sin modificar el código existente. También permitea la aplicación pasar nuevos distintivos a medida que se definan.

Formatos de datos de salidaLas estructuras de captura de pantalla devuelven entre uno y tres formatos de datos.

XImage La estructura XImage de XWindows. Contiene datos de pixel correspondientes a la imagen; lasrutinas kread y de captura de pantalla devuelven dicha estructura en las llamadas satisfactorias

Color_Array Una matriz XColor . Las rutinas kread y de captura de pantalla devuelven dicha estructuracuando la XImage resultante es un tipo visual de seudo color.

numcolors Un entero que indica el número de colores que se devuelven en la matriz de colores. No esnecesariamente el tamaño de la matriz de colores. En el caso de visuales de color directo, elvalor devuelto será siempre cero.

Asignación de almacenamiento para los formatos de datos devueltosSi se llama a las rutinas de captura de pantalla con un puntero nulo correspondiente a la estructuraXImage , la API asignará la estructura. Se asigna al campo de datos XImage suficientes datos pararepresentar la imagen como color real de 24 bits por pixel. Si el puntero XImage no es nulo, se da porsupuesto que apunta a una estructura XImage correcta con un campo de datos con suficiente espaciopara la llamada actual.La aplicación debe asegurarse de que se cumple esta condición. Siempre se debellamar a la rutina kread con un puntero XImage nulo.Dicha rutina asignará y devolverá el almacenamientoen las llamadas satisfactorias. La aplicación debe liberar el almacenamiento de XImage efectuando unallamada a XDestroyImage .

Si se llama a las rutinas de captura de pantalla con un puntero nulo correspondiente a la estructuraColor_Array , la API asignará la estructura con almacenamiento suficiente para K_DEF_CTAB_SIZEcolores (4096). Si el puntero no es nulo, la API da por supuesto que hay suficiente almacenamientodisponible para entradas numcolorXColor de la tabla. Si el número de colores supera numcolors , sedevuelve un error, y se liberan los datos que esta llamada a la API haya asignado. Siempre se debellamar a la rutina kread con un puntero de mapa de colores nulo. Esta rutina asignará suficientealmacenamiento en las llamadas satisfactorias. Las aplicaciones que efectúan la llamada llaman a lafunción free para devolver el almacenamiento.

La aplicación debe asignar el almacenamiento correspondiente a numcolors . Si el puntero es nulo, sedevuelve un error. Si se efectúa una llamada a las rutinas de captura de pantalla con una tabla de coloresque ya había asignado la API, el contenido de la memoria a la que hace referencia este puntero debecontener K_DEF_CTAB_SIZE .

Nota: El valor por omisión de K_DEF_CTAB_SIZE es 4096. Puede alterar este valor definiendo lavariable de entorno KCTABSIZE con el valor adecuado. Si este valor es menor que 256, adoptará elvalor por omisión, 256.

94 Guía de programación de AIXwindows

Page 107: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Liberación de estructuras de datos asignadasLa API libera las estructuras de datos asignadas si se detecta una condición de error en la misma llamadaen la que está asignada la memoria. Si no es así, las aplicaciones deben llamar a XDestroyImage paraque libere la estructura XImage .

Normas básicas del almacenamiento de datosEsta API facilita la consulta de los generadores de animación y de las ventanas interactivas. Si unaaplicación captura repetidamente la misma ventana, o captura repetidamente la misma región, sólo sedebe asignar almacenamiento una vez. Si una aplicación captura repetidamente distintas ventanas odistintas regiones, se debe liberar el almacenamiento de datos y se debe volver a asignar con cadallamada.

Rutinas de captura de pantalla

Dispone de las siguientes rutinas de captura de pantalla en la biblioteca de capturas de pantalla deX-Windows mejorado:

kgetwindowEsta función devuelve una Ximage de color real de 24 bits de una jerarquía de árbol de ventanas a partirdel ID de XWindow del padre. El rendimiento de esta función es óptimo en el caso de visuales de 24 bitsy de jerarquías de ventanas que incluyan varios mapas de colores. Esta función devuelve datos precisospara todos los visuales de todos los servidores, independientemente de la profundidad de la ventana, delservidor o de los tipos de visuales y combinaciones de los mismos. El código de retorno es distinto decero si se produce un error.xtern intkgetwindow (

Display *dpy, /* IN: puntero a pantalla */Window window, /* IN: ID ventana de padre de árbol */KDATA *kdata, /* IN: punt. a inform. adicional */XImage** ximage /* OUT: puntero a puntero ximage */

) ;

kgetregionEsta función devuelve una Ximage de color real de 24 bits de una región rectangular de la pantalla poromisión de la pantalla dpy. Los parámetros de entrada xul, yul, xlr e ylr indican las coordenadas x e y dela esquina superior izquierda y las coordenadas x e y de la esquina inferior derecha de la ventana. Elrendimiento de esta función resulta óptimo en el caso de visuales de 24 bits y de regiones que incluyenvarios mapas de colores. Esta función devuelve datos precisos para todos los visuales de todos losservidores, independientemente de la profundidad de la ventana, del servidor o de los tipos de visuales ycombinaciones de los mismos. El código de retorno es distinto de cero si se produce un error.intkgetregion(

Display *dpy, /* IN: Puntero a pantalla */int xul, /* IN: x superior izquierda */int yul, /* IN: y superior izquierda */int xlr, /* IN: x inferior derecha */int ylr, /* IN: y inferior derecha */KDATA *kdata, /* IN: punt. a inform. adicional */XImage ** Ximage /* OUT: punt. a estructura Ximage*/) ;

kgetwindow_pseudoEsta función devuelve una Ximage de una jerarquía de árbol de ventanas a partir del ID de Xwindow dela ventana padre. La imagen devuelta es de seudo color de 8 bits si el número de colores es menor oigual a 255; si no es así, devuelve una imagen seudo color de 24 bits. Esta función es óptima para

Capítulo 6. Biblioteca de captura de pantalla de AIXwindows 95

Page 108: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

capturar jerarquías de ventanas de 8 bits que comparten un sólo mapa de colores. Además, ofrece datosen un formato óptimo para convertirlo a formatos de archivos orientados a tabla de colores. Esta funcióndevuelve datos precisos para todos los visuales de todos los servidores, independientemente del servidor,la profundidad de ventana o los tipos de visuales, y combinaciones de los mismos. Si la región completade la ventana capturada está representada por un solo visual instalado de seudo color, se devuelve el IDdel recurso de este mapa de colores del visual en colormap; si no es así, se devuelve un 0 en colormap.El código de retorno es distinto de cero si se produce un error.intkgetwindow_pseudo(

Display *dpy, /* IN: puntero a pantalla */Window window, /* IN: ID ventana de padre de árbol */KDATA *kdata, /* IN: punt. a inform. adicional */XImage** ximage, /* OUT: puntero a puntero ximage */XColor** color_array, /* OUT: matriz de colores utilizada */int* numcolors, /* OUT: punt. a área a grabar */Colormap* colormap /* OUT: ID de mapa colores instalado

si es válido */) ;

kgetregion_pseudoEsta función devuelve una Ximage de una región rectangular de una pantalla a partir de los puntos de lasesquinas de la región. La imagen devuelta es de seudo color de 8 bits si el número de colores es menoro igual a 255; si no es así, devuelve una imagen seudo color de 24 bits. Esta función es óptima paracapturar jerarquías de ventanas de 8 bits que comparten un sólo mapa de colores. Además, ofrece datosen un formato óptimo para convertirlo a formatos de archivos orientados a tabla de colores. Esta funcióndevuelve datos precisos para todos los visuales de todos los servidores, independientemente del servidor,la profundidad de ventana o los tipos de visuales, y combinaciones de los mismos. Si toda la región de lapantalla capturada está representada por un solo visual de seudo color instalado, se devuelve el ID derecurso de dicho mapa de colores en colormap; si no es así, se devuelve el valor cero en colormap. Elcódigo de retorno es distinto de cero si se produce un error.intkgetregion_pseudo(

Display *dpy, /* IN: Puntero de pantalla */int xul, /* IN: x superior izquierda */int yul, /* IN: y superior izquierda */int xlr, /* IN: x inferior derecha */int ylr, /* IN: y inferior derecha */KDATA *kdata, /* IN: punt. a inform. adicional */XImage ** Ximage, /* OUT: estructura de imagen */XColor** color_array, /* OUT: matriz de colores utilizada */int* numcolors, /* OUT: ptr a área en la que grabar el

número de colores utilizado */Colormap* colormap /* OUT: ID mapa colores cargado en X*/

) ;

kgetwindow_bestdepthEsta función devuelve una Ximage de una jerarquía de árbol de ventanas a partir del ID de Xwindow dela ventana padre. La imagen devuelta es de seudo color de 8 bits si el número de colores es menor oigual a 255; si no es así, se devuelve una imagen a color real de 24 bits. Esta función es óptima paracapturar jerarquías de ventanas de 8 bits que comparten un sólo mapa de colores. Además, ofrece losdatos en un formato que proporciona el mejor rendimiento para ser visualizados en pantallas que densoporte a visuales tanto de 8 como de 24 bits. Esta función devuelve datos precisos para todos losvisuales de todos los servidores, independientemente del servidor, la profundidad de ventana o los tiposde visuales, y combinaciones de los mismos. El código de retorno es distinto de cero si se produce unerror.intkgetwindow_bestdepth(

Display *dpy, /* IN: puntero a pantalla */Window window, /* IN: ID ventana de padre de árbol */

96 Guía de programación de AIXwindows

Page 109: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

KDATA *kdata, /* IN: punt. a inform. adicional */XImage** ximage, /* OUT: puntero a puntero ximage */XColor** color_array, /* OUT: matriz de colores utilizada */int* numcolors /* OUT: punt. a área en la que grabar

el número de colores usado */Colormap* colormap /* OUT: ID de mapa colores cargado en X */

) ;

kgetregion_bestdepthEsta función devuelve una Ximage de una región rectangular de una pantalla, a partir de los puntos delas esquinas de la región. La imagen devuelta es de seudo color de 8 bits si el número de colores esmenor o igual a 255; si no es así, se devuelve una imagen a color real de 24 bits. Esta función es óptimapara capturar regiones de ventana de 8 bits que sólo comparten un único colormap. Además, ofrece datosen un formato óptimo para convertirlo a formatos de archivos orientados a tabla de colores. Esta funcióndevuelve datos precisos para todos los visuales de todos los servidores, independientemente del servidor,la profundidad de ventana o los tipos de visuales, y combinaciones de los mismos. El código de retornoes distinto de cero si se produce un error.intkgetregion_bestdepth(

Display *dpy, /* IN: Puntero a pantalla */int xul, /* IN: x superior izquierda */int yul, /* IN: y superior izquierda */int xlr, /* IN: x inferior derecha */int ylr, /* IN: y inferior derecha */KDATA *kdata, /* IN: punt. a inform. adicional */XImage ** Ximage, /* OUT: estructura de imagen */XColor** color_array, /* OUT: matriz de colores utilizada */int* numcolors, /* OUT: ptr a área en la que grabar el

número de colores utilizados */Colormap* colormap /* OUT: ID mapa colores cargado en X*/

) ;

kgetwindow_8Esta función devuelve una Ximage de una jerarquía de árbol de ventanas a partir del ID de Xwindow dela ventana padre. La imagen devuelta es de seudo color de 8 bits. Si el número de colores es menor oigual a 255, esta función devuelve datos precisos. Si no es así, aplica un algoritmo de reducción decolores especificado en la estructura KDATA para comprimir el número de colores a 255. Esta funciónresulta óptima para generar imágenes para pantallas de dispositivos que no den soporte a más de 8 bitspor pixel. Si toda la región de la pantalla capturada está representada por un solo visual de seudo colorinstalado, se devuelve el ID de recurso de dicho mapa de colores en colormap; si no es así, se devuelveel valor cero en colormap. El código de retorno es distinto de cero si se produce un error.intkgetwindow_8(

Display *dpy, /* IN: puntero a la pantalla */Window window, /* IN: id ventana de padre del árbol*/KDATA *kdata, /* IN: punt. a inform. adicional */XImage** ximage, /* OUT: puntero a puntero ximage */XColor** color_array, /* OUT: matriz de colores utilizada */int* numcolors, /* OUT: puntero a área para grabar

el número de colores usado */Colormap* colormap /* OUT: ID de mapa de colores instalado

si es válido */) ;

kgetregion_8Esta función devuelve una Ximage de una región rectangular de una pantalla, a partir de los puntos delas esquinas de la región. La imagen devuelta es de seudo color de 8 bits. Si el número de colores esmenor o igual a 255, esta función devuelve datos precisos. Si no es así, aplica un algoritmo de reducciónde colores especificado en la estructura KDATA para comprimir el número de colores a 255. Esta función

Capítulo 6. Biblioteca de captura de pantalla de AIXwindows 97

Page 110: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

resulta óptima para generar imágenes para pantallas de dispositivos que no den soporte a más de 8 bitspor pixel. Si toda la región de la pantalla capturada está representada por un solo visual de seudo colorinstalado, se devuelve el ID de recurso de dicho mapa de colores en colormap; si no es así, se devuelveel valor cero en colormap. El código de retorno es distinto de cero si se produce un error.intkgetregion_8(

Display *dpy, /* IN: Puntero a pantalla */int xul, /* IN: x superior derecha */int yul, /* IN: y superior izquierda */int xlr, /* IN: x inferior derecha */int ylr, /* IN: y inferior derecha */KDATA *kdata, /* IN: ptr a info adicional */XImage ** Ximage, /* OUT: estructura de imagen */XColor** color_array, /* OUT: matriz de colores utilizada */int* numcolors, /* OUT: puntero a área para grabar

número de colores utilizados */Colormap* colormap /* OUT: id del mapa de colores instalado

si es válido */) ;

Rutinas de E/S de archivosDispone de las siguientes rutinas de E/S de archivos en la biblioteca de capturas de pantalla deX-Windows mejorado:

Formatos de archivos de salida definidos en interface.h#define K_PS4 0x01 /* escala de grises de 4 bits Postscript */#define K_PS8 0x02 /* correlación colores de 8 bits Postscript */#define K_PS24 0x04 /* RGB de 24 bits Postscript */#define K_TIFF4 0x11 /* escala grises de 4 bits TIFF */#define K_TIFF8 0x12 /* correlación colores 8 bits TIFF */#define K_TIFF24 0x14 /* RGB de 24 bits TIFF */#define K_XWD 0x20 /* formato vuelco ventana x */

kreadLee una corriente formateada xwd y devuelve el contenido como una Ximage y una matriz de Xcolors . Siel tipo de visual de la corriente xwd es DirectColor , el numcolors devuelto será 0 y no se asignarámemoria para el mapa de colores. Si el tipo de visual es PseudoColor , se asigna almacenamiento parael mapa de colores. En cualquiera de los casos, se asigna almacenamiento para la ximage. Si el tipo devisual no es PseudoColor ni DirectColor , se devuelve un error. Si la llamada resulta satisfactoria, elnúmero de bytes leídos se devuelve a la pila. Si se produce un error, se devuelve 0xFFFFFFFF (-1) y selibera el almacenamiento que haya asignado la función.extern intkread(

int FileDescriptor, /* IN: Descriptor del archivo en el que leer */XImage** ximage, /* OUT: Ptr a estructura XImage */int *visualtype, /* OUT: Tipo de visual de X.h */int *numcolors, /* OUT: Entrada más alta utilizada en tabla */XColor* *colormap, /* OUT: Matriz de Xcolors */) ;

kwriteColoca la salida de Ximage en la corriente abierta identificada por el parámetro FileDescriptor. Los datosse formatean de acuerdo al parámetro Kfiletype. Se pasan por alto numcolors y colormap para losvisuales de color directo. El tipo Xvisual debe ser un seudo color o un color directo. En las llamadassatisfactorias, se devuelve el número de bytes grabados. Si se produce un error, se devuelve un0xFFFFFFFF (-1).

98 Guía de programación de AIXwindows

Page 111: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

extern intkwrite(

int FileDescriptor, /* IN: Descriptor del archivo en el que grabar */XImage* ximage, /* IN: Ptr a estructura XImage */int visualtype, /* IN: Tipo de visual de X.h */int numcolors, /* IN: Entrada más alta utilizada en tabla */XColor* colormap, /* IN: Matriz de Xcolors */int Kfiletype, /* IN: Formato del archivo de salida */

) ;

Rutinas de programas de utilidadDispone de las siguientes rutinas de programas de utilidad en la biblioteca de capturas de pantalla deX-Windows mejorado:

init_true_colorAbre una ventana de color real de 24 bits en cualquier pantalla que le dé soporte.extern intinit_true_color(

Display *dpy, /* ptr a pantalla en la que se abre la ventana*/Window *window, /* puntero a id ventana a devolver */int w, /* anchura de la ventana en pixels */int h /* altura de la ventana en pixels */) ;

rubberbandDevuelve un rectángulo elástico seleccionado de la pantalla.voidrubberband(

Display* dpy, /* IN: Pantalla */int* xul, /* OUT: x superior izquierda */int* yul, /* OUT: y superior izquierda */int* xlr, /* OUT: x inferior derecha */int* ylr /* OUT: y inferior derecha */

) ;

select_windowDevuelve un ID de ventana a partir de una pulsación del ratón.extern Window

select_window( Display *dpy );

Archivos suministradosDispone de los siguientes archivos en la biblioteca de capturas de pantalla de X-Windows mejorado:

v libkap.a (biblioteca) se suministra como parte de X11.adt.lib .

v kapture.h (archivo de interfaz) se suministra como parte de X11.adt.include .

v código de ejemplo kapture/6000 (archivo fuente de ejemplo) se suministra como parte dex11.samples.apps.aixclients .

Capítulo 6. Biblioteca de captura de pantalla de AIXwindows 99

Page 112: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

100 Guía de programación de AIXwindows

Page 113: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Capítulo 7. Mejoras de fonts de AIXwindows

Fonts de bitmap que cumplen el estándar ISO9241El Consejo de comunidades europeas adoptó el estándar 9241 de la ISO ″Requisitos ergonómicos paratrabajo en oficina con terminales de pantalla visual (VDT)″, que ofrece unos requisitos mínimos deseguridad y confort a seguir para trabajar con equipos de pantalla. Estos requisitos relacionados con losVDT incluyen los siguientes temas en cuanto a fonts de bitmaps:

v Altura de los caracteres

v Anchura de los caracteres

v Relación anchura-altura de los caracteres

v Formato de caracteres

v Uniformidad del tamaño de los caracteres

v Espaciado entre caracteres

v Espaciado entre palabras

v Espaciado entre líneas

v Contraste de luz de los detalles de los caracteres, dentro de los caracteres o entre los mismos.

Los fonts de bitmap que cumplen el estándar ISO9241 actualmente disponibles incluyen los fonts deceldas de caracteres Ergo: fonts Serif, Sans Serif y fonts proporcionales Symbol, y los fontsmonoespaciado Typewriter. Dado que los distintos monitores tiene distintas especificaciones, no todosestos fonts cumplen con el estándar de la ISO en todos los monitores. Sin embargo, se pueden configurarlos clientes con cualquier font mediante las herramientas de personalización disponibles.

Dispositivo de barrido TrueTypeEn entorno AIXwindows se dispone de un dispositivo de barrido TrueType. El dispositivo de barridoTrueType da soporte a archivos de font TrueType 1.0. Además, en AIXwindows 4.3 se dispone de un fontTrueType que da soporte a la mayoría de los juegos de caracteres definidos actualmente en laespecificación Unicode 2.0.

El directorio de fonts /usr/lib/X11/fonts/TrueType es la vía de acceso de fonts por omisión para elservidor C de AIXwindows y el servidor de fonts de AIXwindows. Los usuarios que prefieran realizar elbarrido de imagen fuera del servidor X, deben añadir un servidor de fonts de AIXwindows a la vía deacceso de fonts del servidor X.

Codificaciones de fonts soportadas por el dispositivo de barridoTrueTypeEl dispositivo de barrido TrueType de AIXwindows da soporte a las codificaciones de fonts requeridas porlos entornos nacionales que están soportados en la versión 4.3. La tabla siguiente describe losparámetros que se utilizan cuando se genera un font de bitmaps codificado específico de cada país apartir del font TrueType codificado Unicode:

Juego de caracteres XLFD

Columna Fila Car. poromisiónPrimero Último Primero Último

iso8859-1 0x20 0xff 0x00 0x00 0x20

iso8859-2 0x20 0xff 0x00 0x00 0x20

iso8859-3 0x20 0xff 0x00 0x00 0x20

iso8859-4 0x20 0xff 0x00 0x00 0x20

© Copyright IBM Corp. 1997, 2001 101

Page 114: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

iso8859-5 0x20 0xff 0x00 0x00 0x20

iso8859-6 0x20 0xff 0x00 0x00 0x20

iso8859-7 0x20 0xff 0x00 0x00 0x20

iso8859-8 0x20 0xff 0x00 0x00 0x20

iso8859-9 0x20 0xff 0x00 0x00 0x20

IBM-850 0x20 0xff 0x00 0x00 0x20

IBM-856 0x20 0xff 0x00 0x00 0x20

IBM-1046 0x20 0xff 0x00 0x00 0x20

jisx0201.1976-0 0x20 0xdf 0x00 0x00 0x20

jisx0208.1983-0 0x21 0x7e 0x21 0x74 0x2121

IBM-udcJP 0x21 0x7e 0x65 0x7e 0x7e7e

ksc5601.1987-0 0xa1 0xfe 0xa1 0xfd 0xa1a1

cns11643.1986-1 0x21 0x7e 0x21 0x7d 0x2121

cns11643.1986-2 0x21 0x7e 0x21 0x72 0x2121

cns11643.1992-3 0x21 0x7e 0x21 0x62 0x2121

cns11643.1992-4 0x21 0x7e 0x21 0x6e 0x2121

ibm-udcTW 0x21 0x7e 0x21 0x24 0x2121

ibm-sbdTW 0x21 0x7e 0x21 0x24 0x2121

gb2312.1980-0 0x21 0x7e 0x21 0x77 0x2121

ibm-udcCN 0x21 0x22 0x21 0x22 0x2121

ibm-sbdCN 0x21 0x7e 0x21 0x7e 0x2121

ucs2.thai-0 0x00 0xff 0x00 0xff 0x0020

ucs-2 0x00 0xff 0x00 0xff 0xfffd

Nota: Esta tabla se proporciona en /usr/lpp/X11/defaults/TrueType/Xlfdcset . Los usuarios puedenampliar los grupos de codificaciones a las que da soporte el dispositivo de barrido TrueTypeañadiendo elementos a esta tabla.

102 Guía de programación de AIXwindows

Page 115: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Apéndice A. Soporte bidireccional en la biblioteca Xm (Motif1.2)

Nombre de biblioteca/usr/lib/libXm.a

FinalidadEl kit de herramientas Motif es una biblioteca que define una serie de ″widgets″ con sus correspondientesfunciones. El kit de herramientas Motif bidireccional ofrece un modo sencillo de crear interfaces gráficasde usuario en árabe/hebreo.

DescripciónLas adiciones a libXm.a para árabe/hebreo pertenecen a dos categorías. Hay cambios relacionados conla geometría reservada (orientación de pantalla de derecha a izquierda). Esto afecta a gran cantidad dewidgets y gadgets. Otros cambios están relacionados con la entrada de texto bilingüe y con el soporte dela función bidireccional (es decir, forma de caracteres, intercambio simétrico, etc.). Los últimos cambiosafectan principalmente a los widgets de texto.

Dado que las adiciones a libXm.a para árabe/hebreo pertenecen a dos categorías, se han incorporadovarios recursos adicionales al kit de herramientas. La sección siguiente contiene una descripción dedichos recursos, sus nombres y sus posibles valores.

Recursos bidireccionalesEstos recursos controlan la geometría de la pantalla, así como el comportamiento bidireccional de loswidgets. Estos recursos, al igual que otros, se pueden definir a partir de un archivo de recursos o desdedentro de un programa (la función XtSetArg ). La manera como se graban sus nombres y valoresdepende del modo que elija para definirlos.

Consulte los Servicios de diseño en el archivo libi18n.a para obtener más información sobre estosvalores.

Si los recursos se definen a partir de un archivo de recursos:

Nombre delrecurso

Valores Efecto Valores por omisión

textMode text_mode_implicit El texto aparece en modalidad implícita text_mode_implicit

text_mode_visual El texto aparece en modalidad visual

text_mode_explicit El texto aparece en modalidad explícita

layoutDirection right_to_left La orientación global es de derecha aizquierda.

left_to_right

left_to_right La orientación global es de izquierda aderecha.

csdMode (forma delos caracteres)

csd_mode_auto- matic Se da forma en modalidad automática csd_mode_automatic

csd_mode_pass- thru Se da forma en modalidad de paso a través

csd_mode_initial Se da forma a los caracteres en formatoinicial

© Copyright IBM Corp. 1997, 2001 103

Page 116: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

csd_mode_middle Se da forma a los caracteres en formatomedio

csd_mode_final Se da forma a los caracteres en formatofinal

csd_mode_isolated Se da forma a los caracteres en modalidadaislada

nssMode (formanumérica)

nss_mode_bilingual Números representados según contexto nss_mode_bilingual

nss_mode_arabic Números representados en árabe true

nss_mode_hindu Números representados en hindú false

nss_mode_pass- thru Números en modalidad de paso a través false

symmetricSwap true Intercambio simétrico activado

false Intercambio simétrico desactivado

expandTail true Familia visualizada en 2 celdas

false Familia visualizada en 1 celda

textCompose true Diacríticos sobre consonantes

false Diacríticos junto a consonantes

Si los recursos se definen mediante la lista de argumentos del widget (mediante la función XtSetArg ):

Nombre del recurso Valores Efecto

XmNtextMode XmTEXT_MODE_IMPLICIT El texto aparece en modalidad implícita

XmTEXT_MODE_VISUAL El texto aparece en modalidad visual segúnmodalidad de contexto

XmTEXT_MODE_EXPLICIT El texto aparece en modalidad explícita

XmNcsdMode XmCSD_MODE_AUTOMATIC Se da forma en modalidad automática

XmCSD_MODE_PASSTHRU Se da forma en modalidad de paso a través

XmCSD_MODE_INITIAL Se da forma a los caracteres en formatoinicial

XmCSD_MODE_MIDDLE Se da forma a los caracteres en formatomedio

XmCSD_MODE_FINAL Se da forma a los caracteres en formato final

XmCSD_MODE_ISOLATED Se da forma a los caracteres en modalidadaislada

XmNnssMode XmNSS_MODE_BILINGUAL Números representados según contexto

XmNSS_MODE_ARABIC Números representados en árabe

XmNSS_MODE_HINDU Números representados en hindú

XmNSS_MODE_PASSTHRU Números en modalidad de paso a través

Nota: Tenga en cuenta que se tiene que definir otro recurso no relacionado con el soporte deárabe/hebreo añadido: el recurso fontList . La lista de fonts debe incluir un nombre de fontárabe/hebreo para que se puedan crear caracteres árabes/hebreos.

EjemploEl siguiente ejemplo crea un widget de texto después de definir la dirección de diseño de derecha aizquierda y modalidad de texto implícito. Se puede hacer desde un archivo de recurso:

104 Guía de programación de AIXwindows

Page 117: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

*XmText*layoutDirection :right_to_left*XmText*textMode :text_mode_implicit

O bien se puede realizar desde dentro de un programa:

ArgList args;XtSetArg(args&1brk.0&rbrk., XmNlayoutDirection, XmRIGHT_TO_LEFT)XtSetArg(args&1brk.1&rbrk., XmNtextMode, XmTEXT_MODE_IMPLICIT);XmCreateTextWidget(parent_widget, text_widget_name, args, 2);

El widget de textoLa clase de widget XmText se ve afectada por todos los recursos bidireccionales estudiadosanteriormente. Puede mostrar texto en tres modalidades: implícita, explícita y visual. Da soporte a formasde caracteres y de números, además de a un par de funciones variadas: intercambio simétrico y manejoespecial de la familia vista. Además, el widget de texto da soporte a las combinaciones de teclasbidireccionales; son las mismas que utiliza el mandato aixterm . El widget XmText también reacciona enteel recurso layoutDirection . Consulte la sección siguiente, titulada: Efecto de la dirección de diseño en loswidgets y gadgets Motif.

El widget de campo de textoEl widget XmTextField se ve afectado por todos los recursos bidireccionales. Se comporta como el widgetde texto, pero no maneja la modalidad de texto explícita.

El widget de etiqueta y gadgetLas clases de widget XmLabel y XmGadget se ven afectadas por el recurso textMode , además delrecurso Primitive (o layoutDirection ). Consulte la siguiente sección, titulada: ″Efecto de la dirección dediseño en los widgets y gadgets Motif.″ Si se define el Soporte de control implícito (ICS) y la formaautomática de la serie de etiqueta, se altera temporalmente el recurso por omisión por la modalidad detexto implícito. Si no es así, la serie de la etiqueta muestra un comportamiento Motif normal.

El widget de listaLa clase de widget XmList también se ve afectada por el recurso textMode , además del recursolayoutDirection o Primitive como la clase de widget XmLabel . Cuando se define la modalidad de textoimplícita, se aplica el mecanismo de transformación al widget de lista. Si no es así, la serie del elementode lista muestra un comportamiento Motif normal.

Efecto de la dirección de diseño en los widgets y gadgets MotifEl recurso layoutDirection del widget primitivo afecta a los siguientes widgets y gadgets Motif parahabilitar el diseño bidireccional:

Nombre del widget EfectoCascadeButton Invertir lado del gráfico en cascada

Llevar el menú a la izquierdaMandato Colocar serie de solicitud en el lado derecho, con el valor por omisión ″<″DrawButton Mostrar acelerador a la izquierda de la etiqueta

Apéndice A. Soporte bidireccional en la biblioteca Xm (Motif 1.2) 105

Page 118: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Nombre del widget EfectoFileSelectionBox Disponer botones de derecha a izquierda

Alinear etiquetas en la parte derecha

Forzar dirección de series derecha a izquierdaLabel Widget Colocar texto acelerador a la izquierda del texto de la etiqueta

Forzar dirección de series derecha a izquierdaList Widget Forzar dirección de series derecha a izquierdaMessageBox Disponer botones de derecha a izquierda

Forzar dirección de series derecha a izquierda

Propagar dirección de diseño a subordinadoPushButton Mostrar acelerador a la izquierda de la etiquetaRowColumn Widget Disponer subordinados de derecha a izquierda para todos los tipos de menúsScale Si XmNorientation es XmVertical, y XmNshowValue es

true, mostrar el valor a la izquierda de la escala

Si XmNorientation es XmHorizontal, el valor por omisión

de XmNprocessingDirection es XmMAX_ON_LEFTScrolledWindow Propagar dirección a subordinados

Forzar scrollBarPlacement XmBOTTOM_LEFTScrollBar Si XmNorientation es XmHORIZONTAL, el valor por omisión de

XMNprocessingDirection es XmMAX_ON_LEFTSelectionBox Disponer botones de derecha a izquierda y alinear etiquetas

en la parte derecha

Forzar dirección de series de derecha a izquierda

Propagar dirección de diseño a subordinadosToggleButto n Mostrar acelerador a la izquierda de la etiqueta

Invertir lado de gráfico conmutadoText widget Forzar orientación de texto de derecha a izquierda

Ejemplo de cómo localizar una aplicación Motif para el soportebidireccionalEsta sección contiene un ejemplo de cómo localizar el archivo xmeditor de /usr/sample para hebreo yárabe. Los entornos nacionales de árabe son ar_AA y Ar_AA. Los entornos nacionales de hebreo sonIw_IL e iw_IL.

También se proporciona una versión traducida del archivo xmeditor . Puede comparar su versiónmodificada del archivo con la versión convertida.

Especifique el siguiente mandato para asegurarse de que los entornos nacionales árabe/hebreo estáninstalados:

LANG=iw_IL locale

106 Guía de programación de AIXwindows

Page 119: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Si no están definidas las categorías, es posible que el escenario no esté instalado. Utilice el menú de laSMIT Gestionar entorno de idioma para instalar los entornos nacionales.

Definición del entorno nacional y cambio de la geometría1. Añada lo siguiente al archivo the xmeditor.c :

#include <local.h>

setlocale(LC_ALL , "");

1. Compile el archivo xmeditor .

2. Añada la siguiente línea al archivo .Xdefaults para trabajar con árabe en una geometría de izquierdaa derecha (LTR):

fontList: -dt-interfacesystem-medium-r-normal-L*-*-*-*-*-*-*:

3. Especifique el siguiente mandato para ejecutar el xmeditor :

LANG=ar_AA/./xmeditor

4. Cuando se abra xmeditor , el teclado tendrá el diseño latino. Vaya al primer campo de texto e intentelo siguiente:

a. Pulse Alt+DesplDcho y especifique datos. El teclado pasa a tener el diseño correspondiente aárabe/hebreo.

b. Pulse Alt+Intro. Se conmuta todo el widget de texto y se invierten los movimientos del cursor. Elteclado pasa automáticamente a tener el diseño adecuado.

c. Pulse Alt+DesplIzdo y especifique datos. Los datos se especifican en inglés.

5. Añada la siguiente línea al archivo .Xdefaults para cambiar a la geometría global de derecha aizquierda (RTL) y ejecute el xmeditor en un entorno nacional hebreo o árabe:

:wn'

y

layoutDirection: right_to_left

Se invierte toda la direccionalidad de diseño del xmeditor , así como las series en latino. Los menúsemergentes en cascada también funcionan de derecha a izquierda. Todos los campos de texto se abrende derecha a izquierda y el movimiento del cursor es el contrario al del correspondiente al latino.

1. El intercambio numérico se activa de forma automática. Para desactivarlo y ver siempre los dígitos enformato árabe (latino), especifique lo siguiente:

*nssMode: nss_mode_arabic

Conversión de series codificadas de latino a hebreo o árabeEste ejemplo describe cómo convertir la serie File del Menú Principal. Sin embargo, puede utilizar elmismo proceso para convertir todas las series del xmeditor .

Apéndice A. Soporte bidireccional en la biblioteca Xm (Motif 1.2) 107

Page 120: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

En este ejemplo, las series están codificadas. Sin embargo, en muchas aplicaciones las series que tieneque convertir están en otros archivos, lo que normalmente le permitirá efectuar pruebas sin tener quevolver a compilar.

1. Utilice uno de los siguientes mandatos para abrir una ventana aixterm en hebreo o en árabe:

v Para árabe, especifique: LANG=ar_AA aixterm

v Para hebreo, especifique: LANG=iw_IL aixterm

2. Utilice los pasos siguientes para editar el archivo xmeditor.c :

a. Vaya a la ubicación de la serie File .

b. En una pantalla LTR, sustituya la serie especificando datos en hebreo o árabe. Para especificarlos datos, pulse Alt+DesplDcho y escriba el texto.

c. A medida que escriba, el texto debe aparecer con todos los caracteres en la secuencia correcta.

3. Compile el archivo xmeditor y pruébelo. El valor de layoutDirection puede ser left_to_right oright_to_left. Debe ser capaz de ver las series de caracteres a medida que las escribe en cualquierade ambos diseños.

Conversión de archivos externos para texto BIDIEsta sección describe cómo convertir archivos externos a la aplicación. Este ejemplo describe cómoconvertir un archivo externo con los tres nombres siguientes:

FILEHELPMENU

La salida de este archivo como archivo plano convertido estará en hebreo o árabe, donde los caracteresen minúsculas representan caracteres hebreo/árabe:

filehelpmenu

Así ve el archivo si abre un aixterm En_US con un font hebreo o árabe.

Si abre un aixterm árabe o hebreo con el font árabe o hebreo en modalidad implícita, el archivo tendrá elsiguiente aspecto:

elifplehunem

Puede leer las series de caracteres en el orden correcto.

Si utiliza un aixterm hebreo o árabe para convertir el archivo original, lo que tiene originalmente es losiguiente:

FILEHELPMENU

Ahora empezará a convertir la palabra FILE. Borre FILE y escriba elif pulsando f , luego i , luego l yluego e ; este es el orden correcto de la palabra en hebreo o árabe.

108 Guía de programación de AIXwindows

Page 121: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

El resultado será lo que vemos en el aixterm hebreo o árabe:

elifHELPMENU

Si muestra la serie de caracteres como un archivo plano de un aixterm Es_ES, el archivo aparecerá en elorden de caracteres lógico correcto:

fileHELPMENU

La forma en árabe se realiza de forma automática en el aixterm árabe y en el Motif árabe. Cuando loconvierta, también se formarán los caracteres árabes.

Apéndice A. Soporte bidireccional en la biblioteca Xm (Motif 1.2) 109

Page 122: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

110 Guía de programación de AIXwindows

Page 123: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Apéndice B. Programa de utilidad de fonts

El programa de utilidad de fonts, fontutil , es una herramienta que sirve para crear y revisar imágenes defonts. Consulte los siguientes temas para obtener información sobre el programa de utilidad fontutil :

v Introducción al programa de utilidad de fonts

v Limitaciones del programa de utilidad de fonts

v Cómo utilizar el programa de utilidad de fonts

v Utilización de la ventana Font Utility

v Utilización de la ventana Reference Font

v Utilización de la ventana Raster Editor

v Utilización de la ventana Vector Editor

Introducción al programa de utilidad de fonts

El programa de utilidad fontutil es un editor de fonts que se ejecuta en el entorno AIXwindows y lepermite crear fonts personalizados. El programa de utilidad de fonts utiliza ventanas y está guiado pormenús.

El programa de utilidad utiliza una biblioteca de fonts que se puede seleccionar y modificar. Esto lepermite editar un carácter parecido al que desea, en lugar de tener que seguir el método, más lento, dedibujar un carácter.

El programa de utilidad ofrece dos formas de editar fonts: edición de puntos y edición de vectores. En laedición de puntos, una imagen de pantalla consta de una matriz de pixels organizados en filas ycolumnas. En la edición de vectores, las imágenes de pantalla se generan a partir de datos decoordenadas.

La edición de puntos utiliza una cuadrícula parecida a un entramado. Cada unidad de la cuadrículacontiene un pixel. Un pixel es un elemento de imagen, o un punto, de la pantalla. Juntos, estos pixelsforman un carácter. Activando y desactivando estos pixels y definiendo distintos tamaños de los mismos,puede crear un nuevo carácter o modificar ligeramente un carácter existente. El programa de utilidadfontutil llama al editor de barrido para editar los archivos de fonts que tienen las siguientes extensionesde nombre de archivo: .snf o .bdf (es decir, los archivos definidos como SNF_FORMAT oBDF_FORMAT ).

La edición de vectores utiliza una cuadrícula de coordenadas. Puede definir puntos de la cuadrícula yconectar los puntos para formar líneas. Para crear una curva en un carácter, puede conectar una serie delíneas rectas cortas. Juntas, estas líneas forman un carácter. El programa de utilidad fontutil llama aleditor de vectores para editar archivos que tengan las siguientes extensiones: .sym o .xgsl (es decir, losarchivos definidos como graPHIGS_FORMAT o XGSL_FORMAT ).

La edición de puntos es más rápida pero está más limitada. En la edición de barrido no se puede realizarfácilmente el escalado y otras transformaciones geométricas.

La edición de vectores es más flexible y permite una mayor personalización de los fonts; no obstante, laedición de vectores requiere un conocimiento amplio de XGSL y los fonts API graPHIGS. Para obtenermás información sobre fonts, consulte los temas Understanding API graPHIGS Fonts y UnderstandingImages in API graPHIGS de la publicación The graPHIGS Programming Interface: UnderstandingConcepts (POWER-based System Only). Para obtener más información sobre XGSL, consulte el temaPackage XGSL de la publicación AIX Ada/6000 Support Package Reference.

© Copyright IBM Corp. 1997, 2001 111

Page 124: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Nota: Los paquetes de fonts no se incluyen con el sistema operativo y deben solicitarse porseparado.

La finalidad principal del programa de utilidad fontutil es la de proporcionar a los usuarios la flexibilidadpara realizar lo siguiente:

v Convertir archivos de fonts de barrido al formato de vectores (graPHIGS_FORMAT o XGSL_FORMAT )y editar caracteres del archivo de fonts de barrido con el editor de vectores. Los usuarios tambiénpueden crear archivos de fonts de vectores basados en archivos de fonts de barrido.

v Convertir archivos de fonts de vectores en formato de barrido (SNF_FORMAT o BDF_FORMAT ) yeditar los caracteres del archivo de fonts de vectores con el editor de barrido. Los usuarios tambiénpueden crear archivos de fonts de barrido basados en archivos de fonts de vectores.

Esta flexibilidad permite a los usuarios tanto avanzados como principiantes editar y crear fonts. El usuarioavanzado puede convertir archivos sencillos de fonts de puntos a un formato de vectores, proporcionandoasí la posibilidad de una adaptación significativa, mientras que un usuario principiante puede convertir elfont de vectores más complejo a un formato de puntos, que luego puede editar de forma rápida y sencilla.

Nota: La conversión de barrido a vectores sólo deben realizarla los usuarios que tengan suficienteexperiencia en crear y editar archivos de fonts de vectores.

Para obtener instrucciones completas sobre cómo empezar a utilizar el programa fontutil , consulte Cómoutilizar el programa de utilidad de fonts.

Limitaciones del programa de utilidad de fontsTenga en cuenta las siguientes limitaciones cuando utilice el programa fontutil :

v En el caso de archivos de fonts SBCS, los formatos de los archivos de entrada y de salida deben seriguales y no se pueden manejar los formatos bdf y xgsl .

v En el caso de archivos de fonts DBCS, fontutil sólo está disponible para archivos de fonts Kanjibasados en la versión 3.1.

v Cuando lea un archivo de fonts que tenga datos de fonts cuya codificación sea -1, éstos se pasan poralto; fontutil no puede ni mostrarlos ni guardar los datos.

Nota: El soporte de archivos de fonts de formato pcf está incluido en la versión 4.

Cómo utilizar el programa de utilidad de fonts

Condiciones previasAntes de iniciar el programa de utilidad de fonts, asegúrese de que está trabajando en el entornoAIXwindows.

Nota: Muchos usuarios suelen cambiar ciertos aspectos visuales de una interfaz para que se adaptea sus necesidades y a sus gustos. Sin embargo, cuando se utiliza el programa de utilidad fontutil ,los usuarios no deben cambiar, editar ni suprimir el archivo de recursos Fontutil . Por ejemplo, siintenta personalizar el font de esta interfaz, se pueden producir problemas serios al visualizarmensajes de menús. Por lo tanto, los usuarios no deben suprimir el archivo/usr/lib/X11/fonts/6x13.snf ni modificar la línea que define el font fijo en el archivo/usr/lib/X11/fonts/fonts.alias . Si se efectúa cualquier cambio en el archivo de recursos Fontutil , elprograma de utilidad de fonts resulta dañado y deja de funcionar.

ProcedimientosPara utilizar el programa de utilidad de fonts, realice los siguientes pasos:

1. Entre el mandato de arranque.

112 Guía de programación de AIXwindows

Page 125: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

2. Cree un nuevo archivo o lea un archivo anterior.

3. Verifique la información de cabecera del archivo.

4. Convierta el formato de font actual (opcional).

5. Edite y guarde la imagen.

6. Guarde el archivo.

7. Salga del programa de utilidad.

Entrar el mandato de arranquePara iniciar el programa de utilidad de fonts, entre el siguiente mandato:

fontutil

Este mandato hace que aparezca la ventana Font Utility.

Crear un archivo nuevo o leer un archivo antiguoEn la pantalla Font Utility, seleccione la opción File de la barra de menús de la ventana. Elija Create paracrear un archivo de fonts o Read para leer un archivo de fonts.

Al seleccionar Create se visualiza la ventana File Selection Dialog.

Especifique un archivo de fonts desde el que va a copiar información de cabecera; luego pulse sobre OKo pulse la tecla Intro. Para volver a la ventana Font Utility, seleccione Cancel .

Nota: Al iniciar el programa de utilidad de fonts, debe especificar un nombre de vía de acceso o undirectorio en el que encontrar los archivos de fonts. Especifique dicho nombre de vía de acceso enel recuadro File Filter (Filtro de archivos) de la ventana Font Selection Dialog. Dos nombres devías de acceso son /usr/lib/X11/fonts y /usr/lpp/fonts .A continuación se muestran ejemplos dearchivos de estos directorios que puede utilizar para crear un nuevo archivo de fonts: Bld*.snf ,Erg*.snf , Itl*.snf y Rom*.snf .

Si pulsa sobre OK, aparece la ventana Header Information correspondiente al tipo de archivo. Compruebela información de cabecera y pulse sobre OK o pulse la tecla Intro. Para volver a la ventana File SelectionDialog, pulse Cancel .

Si opta por crear un archivo nuevo, pero ha efectuado cambios en otro archivo que no ha guardado, se lesolicitará que guarde el archivo de fonts actualizado. Seleccione OK para actualizar el archivo, No paracerrar el archivo y perder el trabajo realizado o Cancel para volver a la ventana Font Utility.

Al seleccionar OK, regresará a la ventana File Selection Dialog.

Especifique el nombre del archivo que se va a guardar en el recuadro Selection . (Para guardar unarchivo de fonts, se debe utilizar una de las siguientes extensiones de nombres de archivos: .snf , .bdf ,.sym , .xgsl .) Luego pulse sobre OK o pulse la tecla Intro. Para volver a la ventana Font Utility, seleccioneCancel .

Si selecciona OK, aparece la ventana Header Information para su tipo de archivo. Compruebe lainformación de cabecera y pulse sobre OK o pulse la tecla Intro. Para volver a la ventana File SelectionDialog, pulse Cancel .

Al seleccionar Read en la ventana Font Utility, aparece la ventana File Selection Dialog.

Seleccione un nombre de archivo en la lista del recuadro Files . Luego pulse sobre OK o pulse la teclaIntro. Para volver a la ventana Font Utility, seleccione Cancel . Si selecciona OK, aparece la ventanaHeader Information correspondiente al tipo de archivo. Compruebe la información de cabecera y pulsesobre OK o pulse la tecla Intro. Para volver a la ventana File Selection Dialog, pulse Cancel .

Apéndice B. Programa de utilidad de fonts 113

Page 126: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Si decide leer un archivo de fonts pero ha realizado cambios en otro archivo que no ha guardado,aparece una ventana que le pregunta si desea guardar el archivo actualizado. El programa de utilidadnunca le permitirá abrir o editar más de un archivo de fonts a la vez.

Las siguientes extensiones de nombres de archivos determinan el editor de fonts que se utiliza:

.snf Determina que se utiliza el editor de puntos.

.bdf Determina que se utiliza el editor de puntos.

.sym Determina que se utiliza el editor de vectores.

.xgsl Determina que se utiliza el editor de vectores.

Verificar la información de cabecera del archivo

Cuando crea o lee un archivo, aparece una ventana que muestra información de cabeceracorrespondiente al archivo de fonts seleccionado en la ventana File Selection Dialog. No efectúe ningúncambio en la información que aparece en la ventana Header Information; sólo compruebe que seleccionael tipo de archivo que necesita. Si efectúa una selección incorrecta, puede cancelar la comprobación yelegir otro archivo de fonts o puede convertir el formato del font.

Convertir el formato de font actual (opcional)

Si desea cambiar la información de cabecera en el archivo nuevo o existente, realice estos cambiosseleccionando la subopción Format de la opción Extension de la ventana Font Utility.

Editar y guardar la imagenUtilice el editor de puntos o de vectores para editar y guardar la imagen. Consulte los temas Utilización dela ventana Raster Editor y Utilización de la ventana Vector Editor para obtener más información.

Guardar el archivo

En la barra de menús de la ventana Font Utility, seleccione la opción File y elija la subopción Save.

Nota: Para guardar un archivo, debe utilizar una de las siguientes extensiones de nombres dearchivos: .snf , .bdf , .sym , .xgsl .

Salir del programa de utilidad

En la barra de menús de la ventana Font Utility, seleccione la opción Exit . Seleccione la subopción Exitpara abandonar el programa de utilidad de fonts. Si ha efectuado cambios que no ha guardado, elprograma de utilidad le ofrece la opción de guardar el archivo.

Utilización de la ventana Font Utility

Al especificar el mandato de inicio fontutil se muestra la ventana Font Utility. Consulte las siguientessecciones para obtener más información sobre la ventana Font Utility y las cuatro áreas principales quecontiene:

v Barra de menús

v Panel de control

v Área de visualización de fonts

v Área de mensajes

114 Guía de programación de AIXwindows

Page 127: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Barra de menús

La barra de menús aparece en la parte superior de la ventana Font Utility. Las opciones de menúaparecen de izquierda a derecha: File (Archivo) , Refer (Consultar) , Extension (Extensión) , Information(Información) y Exit (Salir) .

FileLa opción File tiene tres subopciones: Create , Read y Save. Estas subopciones realizan las siguientesfunciones:

v Create

La subopción Create le permite crear un nuevo archivo de fonts. Si opta por crear un archivo de fontsse mostrará la ventana File Selection Dialog (Diálogo de selección de archivos).

Seleccione uno de los archivos de fonts que aparecen en el recuadro File , del que se copiará lainformación de cabecera, y luego pulse OK o pulse la tecla Intro. Para volver a la ventana Font Utility,seleccione Cancel . Si pulsa sobre OK, se muestra la ventana Header Information correspondiente altipo de archivo del usuario.

Compruebe la información de cabecera y pulse sobre OK o pulse la tecla Intro. Para volver a laventana File Selection Dialog, pulse Cancel .

Si opta por crear un archivo nuevo, pero ha efectuado cambios en otro archivo que no ha guardado, sele solicitará que guarde los cambios del archivo.

Seleccione OK para actualizar el archivo, No para cerrar el archivo y perder el trabajo realizado oCancel para volver a la ventana Font Utility.Si selecciona OK, se visualiza la ventana File SelectionDialog.

Especifique el nombre del archivo que se va a guardar en el recuadro Selection . (Para guardar unarchivo de fonts, se debe utilizar una de las siguientes extensiones de nombres de archivos: .snf , .bdf ,.sym , .xgsl .) Luego pulse sobre OK o pulse la tecla Intro. Para volver a la ventana Font Utility,seleccione Cancel .

Si selecciona OK, aparece la ventana Header Information para su tipo de archivo. Compruebe lainformación de cabecera y pulse OK o la tecla Intro.Para volver a la ventana File Selection Dialog,pulse Cancel .

v Read

La subopción Read le permite crear un nuevo archivo de fonts editando caracteres específicos en unarchivo de fonts existente. Si opta por leer un archivo de fonts, se muestra la ventana File SelectionDialog.

Seleccione un nombre de archivo en la lista del recuadro Files . El archivo que seleccione aparece enel recuadro Selection . Pulse sobre OK o pulse la tecla Intro. Para volver a la ventana Font Utility,seleccione Cancel . Si selecciona OK, aparece la ventana Header Information correspondiente al tipode archivo. Compruebe la información de cabecera y pulse sobre OK o pulse la tecla Intro. Para volvera la ventana File Selection Dialog, pulse Cancel .

Si opta por leer un archivo de fonts pero ha efectuado cambios en otro archivo que no ha guardado, sele solicitará que guarde los cambios en los archivos actualizados. El programa de utilidad nunca lepermitirá abrir o editar dos archivos de fonts a la vez.

Seleccione OK para actualizar el archivo, No para cerrar el archivo y perder el trabajo realizado oCancel para volver a la ventana Font Utility.

v Save (Guardar)

La subopción Save guarda un archivo de fonts. Cuando selecciona la subopción Save, se muestra laventana File Selection Dialog.

Especifique el nombre del archivo de fonts que desea guardar en el recuadro Selection (tambiénpuede seleccionar el archivo en la lista del recuadro Files ). Para guardar un archivo de fonts, debeutilizar una de las siguientes extensiones de nombre de archivo: .snf , .bdf , .sym , .xgsl .

Apéndice B. Programa de utilidad de fonts 115

Page 128: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

ReferLa opción Refer le permite hacer referencia a un archivo de fonts que sea distinto del que está editando ocreando. Para obtener información completa sobre la opción Refer , vaya al tema Utilización de la ventanaReference Font.

ExtensionLa opción Extension tiene tres subopciones: Codeset , Format y Size. Las subopciones de Extensionsirven para realizar las siguientes funciones:

v Codeset

Cuando selecciona la subopción Codeset , se muestra un menú desplegable. Las opciones de dichomenú son PC y PC16. Pulse sobre el juego de códigos que desee. Cuando cambie el juego decódigos, aparece el font de código menor en la esquina superior izquierda.

v Format

Esta subopción cambia el formato del font cargado. Cuando se selecciona la subopción Format , semuestra la ventana Format Convert. Las selecciones de la ventana Format Convert sirven para realizarlas siguientes funciones:

Función de Conversión de formato Cambia el sufijo del nombre del archivo defonts por:

SNF_FORMAT .snfBDF_FORMAT .bdfgraPHIGS_FORMAT .symXGSL_FORMAT .xgsl

v Size

Esta subopción cambia el tamaño del font cargado. Si selecciona la subopción Size, aparece laventana Size Convert (Conversión de tamaño).

La ventana Size Convert lista la altura y la anchura actuales y le ofrece dos maneras de cambiar eltamaño. Puede especificar la nueva altura y anchura en la entrada NUEVO, o bien puede especificar unporcentaje de tamaño en la entrada percent . Sin embargo, debe especificar una u otra de lasopciones, no ambas.

Information

La opción Information tiene la subopción Information , que muestra la información de PC de IBM decabecera correspondiente al juego de caracteres que está editando. Hay dos tipos distintos de archivosde fonts: fonts de barrido y fonts de vectores. Según el tipo de archivo de font que esté editando, semostrará una ventana de información diferente en la ventana Header Information.

Exit (Salir)

La opción Exit tiene dos subopciones: Cancel y Exit .

Con la subopción Exit se sale del programa de utilidad de fonts. La subopción Cancel cancela la opciónExit y le lleva de nuevo a la ventana Font Utility.

Panel de control

El panel de control se ejecuta bajo la parte izquierda de la ventana Font Utility. Las funciones disponiblesson Copy (Copiar) , Move (Mover) , Delete (Suprimir) , Edit (Editar) , Mode (Modalidad) , Undo(Deshacer) y Cancel (Cancelar) .

116 Guía de programación de AIXwindows

Page 129: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Copy

La función Copy copia los caracteres especificados de la ventana Font Utility o Reference Font. Lo quese copia depende de la modalidad definida.

Si la opción Mode se define como POINT, puede seleccionar y copiar sólo un carácter. Después dedefinir la modalidad POINT y seleccionar la función Copy , pulse sobre el carácter que desea copiar con elbotón izquierdo del ratón. Pulse de nuevo el botón izquierdo del ratón en un espacio vacío del área devisualización de fonts, y el carácter que copió se pega en dicho espacio.

Para copiar caracteres individuales de la ventana Reference Font en la ventana Font Utility, utilice lafunción Copy proporcionada en la ventana Font Utility. La ventana Reference Font no tiene panel decontrol.

Si la opción Mode se define como AREA , seleccione y pulse sobre dos puntos (el punto inicial y el final)con el botón izquierdo del ratón. Pulse el botón izquierdo del ratón por tercera vez sobre el punto en elque desea colocar el área seleccionada, y el área cuyo rango se ha especificado mediante los puntosinicial y final se copia en el tercer punto (destino).

Si la opción Mode se define como TOTAL AREA , la función Copy actúa sobre el juego de caracterescompleto de un archivo de fonts. Puede copiar todos los caracteres de la ventana Reference Font en laventana Font Utility. Después de definir la opción Mode como TOTAL AREA , vaya a la ventana ReferenceFont y pulse el botón izquierdo del ratón sobre el punto de la cuadrícula cuyas coordenadas sean 0x0. Seresaltan todos los caracteres, lo que indica que se van a copiar todos. Luego, vuelva a la ventana FontUtility y pulse el botón izquierdo del ratón sobre el punto 0x0 de la cuadrícula del área de visualización.Todos los caracteres de la ventana Reference Font ahora también aparecen en la ventana Font Utility.

Move

La función Move mueve los caracteres especificados de la ventana Font Utility o Reference Font. Lo quese mueve depende de la modalidad definida.

Si la opción Mode se define como POINT, puede seleccionar y mover sólo un carácter. Después dedefinir la modalidad POINT y seleccionar la función Move , pulse sobre el carácter que desea mover conel botón izquierdo del ratón. Pulse de nuevo el botón izquierdo del ratón sobre un espacio vacío del áreade visualización de fonts y el carácter que esté moviendo se pega en dicho espacio.

Para mover caracteres individuales desde la ventana Reference Font a la ventana Font Utility, utilice lafunción Move proporcionada en la ventana Font Utility. La ventana Reference Font no tiene panel decontrol.

Si la opción Mode se define como AREA , puede seleccionar y pulsar el botón sobre dos puntos (el puntoinicial y el final) con el botón izquierdo del ratón. Pulse el botón izquierdo del ratón una tercera vez en elpunto en el que desea colocar el área seleccionada, y el área cuyo rango especificó mediante los puntosinicial y final se mueve al tercer punto (destino).

Si la opción Mode se define como TOTAL AREA , la función Move actúa sobre el juego de caracteresentero de un archivo de fonts. Puede mover todos los caracteres de la ventana Reference Font a laventana Font Utility. Después de definir la opción Mode como TOTAL AREA , vaya a la ventana ReferenceFont y pulse el botón izquierdo del ratón sobre el punto de la cuadrícula cuyas coordenadas sean 0x0. Seresaltan todos los caracteres, lo que indica que se van a mover todos los caracteres. Luego, vuelva a laventana Font Utility y pulse el botón izquierdo del ratón sobre el punto 0x0 de la cuadrícula del área devisualización. Todos los caracteres de la ventana Reference Font aparecen ahora en la ventana FontUtility.

Apéndice B. Programa de utilidad de fonts 117

Page 130: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Nota: Puede copiar o mover caracteres dentro de la ventana Font Utility y desde la ventanaReference Font en la ventana Font Utility, pero no puede copiar y mover caracteres de la ventanaFont Utility a la ventana Reference Font.

Delete

La función Delete elimina los caracteres especificados. Lo que se borra depende de la modalidaddefinida.

Si la función Mode se define como POINT, seleccione un carácter que se deba suprimir pulsando sobre élcon el botón izquierdo del ratón. Una vez resaltado el carácter, pulse de nuevo el botón izquierdo delratón y se suprimirá el carácter. Si la opción Modees AREA , seleccione y pulse sobre dos puntos (elpunto inicial y el final) y luego pulse de nuevo el botón izquierdo del ratón; los caracteres dentro del esteárea se suprimen. Si la opción Mode es TOTAL AREA y pulsa el botón izquierdo del ratón en la esquinasuperior izquierda del área de visualización, se suprimen todos los caracteres.

Edit

La función Edit llama al editor de barrido o de vectores, según el formato del archivo de fonts (que puedemodificarse con la subopción Format en la opción Extension de la ventana Font Utility). Si el archivo defonts termina con el sufijo .snf o .bdf , o bien si el formato de font se cambia a SNF_FORMAT oBDF_FORMAT , se inicia el editor de puntos. Si el archivo de fonts termina con el sufijo .sym o .xgsl , obien si el formato de font se cambia a graPHIGS_FORMAT o XGSL_FORMAT , se inicia el editor devectores.Pulse sobre la función Edit y luego pulse sobre el carácter que desea editar. Aparece la ventanacorrespondiente al editor adecuado y el carácter seleccionado aparece en el área de edición.

Mode

La opción Mode define la modalidad como POINT, AREA o TOTAL AREA . La modalidad seleccionadadetermina el funcionamiento de otras funciones. Puede conmutar entre estas tres modalidades pulsandosobre el botón Mode del panel de control. Cada vez que pulse, aparece la siguiente modalidad. Despuésde la modalidad TOTAL AREA , la selección vuelve a la modalidad POINT.

Undo

La función Undo deshace la última función seleccionada (por ejemplo, Copy o Move ). Esta opción sóloestá disponible cuando termina el último mandato especificado.

Cancel

La función Cancel cancela el mandato que se está ejecutando.

Área de visualización de fonts

Esta área es una cuadrícula de 10x10 en el centro de la ventana Font Utility. En esta área aparece laimagen correspondiente a cada código de carácter; se puede visualizar un máximo de 256 imágenes decaracteres simultáneamente. Cada tipo de carácter del recuadro de cuadrícula aparece después dehaberse convertido a un tamaño fijo.

Si se visualiza el código de carácter, los bits comprendidos entre el 0 y el 3 representan la línea vertical ylos bits comprendidos entre el 4 y el 7 representan la línea horizontal. Por ejemplo, si se define elCÓDIGO como 60, el número de línea vertical es 8 y el número de línea horizontal es A, el código delcarácter del font es 608A.

El área de visualización de fonts tiene una barra de desplazamiento situada justo debajo del juego decaracteres que se visualizan. Puede utilizar la barra de desplazamiento para moverse dentro del archivode fonts a fin de acceder a las imágenes de caracteres que desee editar.

118 Guía de programación de AIXwindows

Page 131: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Área de mensajes

El área de mensajes aparece en la parte inferior de la pantalla y tiene tres líneas. La línea superiorcontiene el nombre del archivo de fonts abierto. La segunda línea muestra el juego, el código y lamodalidad actuales. La línea inferior muestra los mensajes.

Utilización de la ventana Reference Font

En la barra de menús de la ventana Font Utility hay una opción denominada Refer . La opción Refer lepermite consultar un archivo de fonts distinto del que está editando o creando. La opción Refer le lleva ala ventana Reference Font, que muestra el juego de caracteres de un archivo de fonts. Puede copiar ymover caracteres individuales de esta ventana a la ventana Font Utility para combinar y personalizarcaracteres procedentes de distintos archivos de fonts dentro de un nuevo archivo.

Al seleccionar Refer , aparece la ventana File Selection Dialog. Especifique el archivo de fonts que deseaconsultar y pulse sobre OK o bien pulse la tecla Intro. Se muestra la ventana Reference Font, que es unacuadrícula de carácter del font actual. Ahora puede editar el archivo que aparece en la ventana Font Utilitymientras consulta el archivo de la ventana Reference Font. También puede copiar y mover caracteres dela ventana Reference Font en la ventana Font Utility. Esto le permite combinar caracteres procedentes dedistintos fonts dentro de un juego de caracteres.

La ventana Reference Font consta de una barra de menús en la parte superior, un área de visualizaciónde fonts y un área de mensajes. El área de visualización de fonts muestra cada carácter del archivo defonts especificado. El área de mensajes muestra el nombre del archivo y el juego del archivoespecificado. La barra de menús tiene dos opciones: Information y Exit .

La opción Information muestra la ventana Header Information correspondiente al juego de caracteres queestá consultando. Hay dos tipos distintos de archivos de fonts: fonts de barrido y fonts de vectores. Segúnel tipo de archivo de fonts que se consulte, se mostrará una ventana de información diferente en laventana Header Information.

La opción Exit tiene dos subopciones: Exit o Cancel . La subopción Exit le permite salir de la ventanaReference Font y volver a la ventana Font Utility. La subopción Cancel cancela el mandato Exit y le llevade nuevo a la ventana Reference Font.

Utilización de la ventana Raster Editor

La ventana Raster Editor (Editor de puntos) es la ventana que sirve para editar imágenes de caracterescon el editor de puntos. El programa de utilidad de fonts llama al editor de puntos para editar caracteresde los archivos de fonts que tienen el sufijo .snf o .bdf (definidos como SNF_FORMAT o BDF_FORMAT ).

Al seleccionar la función Edit y un carácter del área de visualización en la ventana Font Utility (y que estátrabajando con un archivo de fonts de barrido), se muestra la ventana Raster Editor. Consulte lossiguientes temas para obtener más información sobre la ventana Raster Editor y las cuatro áreasprincipales de la misma:

v Barra de menús

v Panel de control

v Área de edición

v Área de mensajes

Apéndice B. Programa de utilidad de fonts 119

Page 132: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Barra de menús

La barra de menús aparece en la parte superior de la ventana. Las opciones del menú en pantalla son,de izquierda a derecha, Extension (Extensión) , Information (Información) , Entry (Entrada) y Exit(Salir) .

Extension

La opción Extension tiene dos subopciones: Frame Edit y Refer Point . Al seleccionar Frame Editaparece la ventana Frame Edit. Frame Edit cambia el tamaño de la trama que comprende la imagen decarácter en el área de edición.

Se puede modificar la parte SUPERIOR (TOP), INFERIOR (BOTTOM), DERECHA (RIGHT), IZQUIERDA (LEFT) y laANCHURA (WIDTH) de la trama. Pulse sobre el elemento que desee cambiar y especifique el nuevo valor.Luego pulse sobre OK o pulse la tecla Intro. El área de edición se modifica consecuentemente. Paravolver a la ventana Raster Editor, pulse Cancel .

La subopción Refer Point define un punto de referencia del almacenamiento intermedio de edición. Elalmacenamiento intermedio de edición proporciona espacio adicional en el que se pueden crear y editarimágenes de caracteres. Utilice las barras de desplazamiento que rodean el área de edición para moverel recuadro de caracteres visible en el almacenamiento intermedio de edición. Coloque el recuadro decaracteres de modo que comprenda un área en blanco. El área comprendida en el área de caracteres esel área que aparece en el área de edición. De este modo, puede activar y desactivar pixels y utilizar todaslas demás funciones del panel de control para crear una nueva imagen del carácter. También puedeutilizar las funciones Pickup , < (código anterior) y > (código siguiente) para consultar un carácterestablecido que desea editar.

La subopción ReferPoint resulta útil para crear o editar caracteres nuevos en el almacenamientointermedio de edición. Por ejemplo, seleccione Refer Point (condición de activado) y aparecerá un puntogrande sobre la esquina izquierda del área de edición. Este punto también resulta visible en elalmacenamiento intermedio de edición. Si vuelve a seleccionar Refer Point, el punto desaparece(condición de desactivado). A medida que cree nuevos caracteres y se mueva por el almacenamientointermedio, puede utilizar puntos de referencia que le ayuden a guiar el recuadro de caracteres de modoque comprenda cada imagen de carácter, al igual que cuando lo creó o editó originalmente.

Information

Si pulsa sobre la opción Information , podrá consultar la información de carácter de la imagen de carácterque se muestra en el área de edición. Aparecen los campos STARTCHAR , ENCODING, SWIDTH,DWIDTH y BBX .

Entry

La opción Entry tiene una subopción, Image Entry .

La subopción Image Entry guarda la imagen del carácter del área de edición en la ventana Font Utility.

El código de la imagen de carácter que se muestra en el área de edición aparece automáticamente en elrecuadro Selection cuando se muestra la ventana. Especifique el código que aparece en el recuadroSelection pulsando OK o la tecla Intro. Para cancelar la función y volver a la ventana Raster Editor, pulseCancel . Si especifica el código, aparece una ventana que le pregunta si los datos de caráctercorrespondientes al carácter que está guardando se han modificado.

Seleccione Yes para guardar la versión editada de la imagen de carácter, o bien seleccione No paraguardar la imagen en su formato original.

120 Guía de programación de AIXwindows

Page 133: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Exit (Salir)

La opción Exit tiene dos subopciones: Exit y Cancel .

Con la subopción Exit se sale del editor de barrido. Si ha cambiado la imagen de carácter que apareceen el área de edición y no la ha guardado, se le solicitará que guarde los cambios efectuados.

Seleccione Yes para guardar los cambios, No para cerrar la ventana Raster Editor y perder el trabajorealizado, o Cancel para regresar a la ventana Raster Editor. Si selecciona Yes, se le solicitará queespecifique el código de la imagen de carácter alterada.

El código de la imagen de carácter que se muestra en el área de edición aparece automáticamente en elrecuadro Selection cuando se muestra la ventana. Especifique el código que aparece en el recuadroSelection pulsando OK o la tecla Intro. Para cancelar la función y volver a la ventana Raster Editor, pulseCancel .

Si especifica el código, se le solicitará que indique si los datos de carácter correspondientes al carácterque está guardando han cambiado. Seleccione Yes para guardar la versión editada de la imagen decarácter. Si selecciona No, vuelve a aparecer la ventana en la que ha especificado el código del carácter.Puede cancelar la opción Exit desde esta ventana.

La subopción Cancel cancela la opción Exit y le devuelve a la ventana Raster Editor.

Panel de control

El panel de control se ejecuta bajo la parte izquierda de la ventana Raster Editor y tiene varias funciones,que aparecen en el siguiente orden:

Clear

La función Clear borra un área del área de edición o del almacenamiento intermedio de edición. Lo quese borra depende de la modalidad definida. Si la opción Mode es AREA , seleccione y pulse sobre dospuntos (bit inicial y bit final) con el botón izquierdo del ratón.Pulse el botón izquierdo del ratón una terceravez y se borrará el recuadro cuya diagonal está definida por los bits inicial y final.Si la opción Mode esPOINT, pulse sobre cualquier bit del área de edición con el botón izquierdo del ratón y se borrará dichobit. Si la opción Mode es TOTAL AREA , pulse sobre cualquier bit del almacenamiento intermedio deedición con el botón izquierdo del ratón y se borrará todo el almacenamiento intermedio (así como el áreade edición).

Set

La función Set rellena un área del área de edición o del almacenamiento intermedio de edición. Lo que serellena depende de la modalidad definida. Si la opción Mode es AREA , seleccione y pulse sobre dospuntos (bit inicial y bit final) con el botón izquierdo del ratón. Pulse el botón izquierdo del ratón una terceravez y se rellenará el área cuya diagonal está definida por el bit inicial y el bit final. Si la opción Mode esPOINT, pulse sobre cualquier bit del área de edición con el botón izquierdo del ratón y se rellenará esebit.Si la opción Mode es TOTAL AREA , pulse sobre cualquier bit del almacenamiento intermedio deedición con el botón izquierdo del ratón y se rellenará todo el almacenamiento intermedio (así como elárea de edición).

Reverse

La función Reverse invierte el contraste de un área visualizada en el área de edición o en elalmacenamiento intermedio de edición. El área cuyo contraste se invierten depende de la modalidaddefinida. Si la opción Mode es AREA , seleccione y pulse sobre dos puntos (bit inicial y bit final) con elbotón izquierdo del ratón.Pulse el botón izquierdo del ratón una tercera vez y se invertirá el contraste del

Apéndice B. Programa de utilidad de fonts 121

Page 134: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

recuadro cuya diagonal está definida por el bit inicial y el bit final. Si la opción Mode es POINT, pulsesobre cualquier bit del área de edición con el botón izquierdo del ratón y se invertirá el contraste de dichobit.Si la opción Mode es TOTAL AREA , pulse cualquier bit del almacenamiento intermedio con el botónizquierdo del ratón y se invertirá el contraste del almacenamiento intermedio (así como del área deedición).

Copy

La función Copy copia el rango de bits especificado en el área de edición. Defina la opción Mode enAREA , seleccione y pulse sobre dos puntos (bit inicial y bit final) con el botón izquierdo del ratón.Pulse elbotón izquierdo del ratón por tercera vez en el punto en el que desee colocar el área seleccionada. Elárea cuyo rango está especificado por los puntos inicial y final se copia en el tercer punto (destino).

Overwrite

La función Overwrite copia y graba encima del rango especificado de bits del área de edición. Defina laopción Mode en AREA , seleccione y pulse sobre dos puntos (bit inicial y bit final) con el botón izquierdodel ratón.Pulse el botón izquierdo del ratón por tercera vez en el punto en el que desee colocar el áreaseleccionada. El área especificada por el bit inicial y el bit final se copia en el tercer punto (destino) ysobregraba lo que ya pueda haber en dicho destino.

Move

La función Move mueve el rango especificado de bits en el área de edición. Defina la opción Mode enAREA , seleccione y pulse sobre dos puntos (bit inicial y bit final) con el botón izquierdo del ratón.Pulse elbotón izquierdo del ratón por tercera vez sobre el punto en el que desea colocar el área seleccionada; elárea especificada por el bit inicial y el bit final se mueve al tercer punto (destino).

< (Código anterior)

La función < (código anterior) recupera el código anterior del font que está editando. Es decir, cada vezque pulse < (signo menor que) con el botón izquierdo del ratón, aparece el carácter que precede al queesté editando en el área de edición. Esta función le permite seguir editando imágenes de caracteresdentro del mismo archivo de fonts sin tener que volver a la ventana Font Utility para seleccionar cadacarácter individualmente.

Si ha cambiado la imagen de carácter visualizada y no realiza una Entrada de imagen antes deseleccionar la función < (código anterior), se le solicitará que guarde los cambios.

Si selecciona No, el carácter visualizado no se guarda y la imagen recupera su diseño original. Siselecciona Yes, aparece otra ventana que le indica que especifique el código correspondiente a la imagendel carácter. Cuando haya especificado el código y haya comprobado que los datos del carácter hancambiado, se guarda la versión editada de la imagen del carácter.

> (Código siguiente)

La función > (código siguiente) recupera el código siguiente del font que está editando. Es decir, cada vezque pulse el botón sobre > (signo mayor que) con el botón izquierdo del ratón, aparece el carácter quesigue al que está editando en el área de edición. Esta función le permite seguir editando imágenes decaracteres dentro del mismo archivo de fonts sin tener que volver a la ventana Font Utility paraseleccionar cada carácter individualmente.

Si ha cambiado la imagen de carácter visualizada y no realiza una Entrada de imagen antes deseleccionar la función > (código siguiente), se le solicitará que guarde los cambios.

Si selecciona No, el carácter visualizado no se guarda y la imagen recupera su diseño original. Siselecciona Yes, aparece otra ventana que le indica que especifique el código correspondiente a la imagen

122 Guía de programación de AIXwindows

Page 135: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

del carácter. Cuando haya especificado el código y haya comprobado que los datos del carácter hancambiado, se guarda la versión editada de la imagen del carácter.

Pickup

La función Pickup recupera el carácter especificado de la ventana Font Utility. Esto le permite utilizar uncarácter con características de font parecidas a las que desea y editar dicho carácter.

Para recoger un carácter de la ventana Font Utility, pulse sobre la función Pickup de la ventana RasterEditor y, a continuación, pulse sobre el carácter deseado en la ventana Font Utility. Se visualiza elcarácter en el área de edición.

Si ha efectuado cambios en la imagen de carácter que aparecía inicialmente y no realiza una Entrada deimagen antes de seleccionar la función Pickup , se le solicitará que guarde los cambios.

Si selecciona No, la imagen de carácter no se guarda y la imagen recupera su diseño original. Siselecciona Yes, aparece otra ventana que le indica que especifique el código correspondiente a la imagendel carácter. Cuando haya especificado el código y haya comprobado que los datos del carácter hancambiado, se guarda la versión editada de la imagen del carácter.

Mode

La opción Mode cambia la modalidad. La modalidad definida determina el funcionamiento de otrasfunciones. Se pueden definir tres valores: POINT, AREA o TOTAL AREA . Puede conmutar entre estastres modalidades pulsando las selecciones con el botón izquierdo del ratón. Cada vez que pulse, aparecela siguiente modalidad. Después de la modalidad TOTAL AREA , la selección vuelve a la modalidadPOINT.

Undo

La función Undo deshace la última función seleccionada (por ejemplo, Copy o Move ). Esta opción sóloestá disponible cuando termina el último mandato especificado.

Cancel

La función Cancel cancela el mandato que se está ejecutando.

Área de edición

Esta área es una cuadrícula semejante a un entramado que está situada en el centro de la ventanaRasterizer Editor. Cada cuadrícula puede contener un pixel, que puede ser de varios tamaños. El área deedición tiene dos barras de desplazamiento, botones de movimiento (situados al final de cada barra dedesplazamiento, una línea base, línea izquierda y línea derecha.

A la derecha del área de edición está el área de almacenamiento intermedio de edición. El área dealmacenamiento intermedio de edición proporciona espacio adicional en el que se pueden crear y editarimágenes de caracteres y muestra el tamaño real de las imágenes de caracteres. Utilice las barras dedesplazamiento que rodean el área de edición para mover el recuadro de caracteres visible en elalmacenamiento intermedio de edición. El área comprendida en el área de caracteres es el área queaparece en el área de edición.

Los botones de movimiento mueven el enfoque del área de edición hacia la derecha o hacia la izquierda,hacia arriba o hacia abajo, pixel por pixel. Esta función es importante cuando se editan caracteres queson demasiado grandes y no caben dentro de las limitaciones de pantalla del área de edición.

La línea base enfatiza los parámetros SNF ascendentes y descendentes. La línea izquierda enfatiza elparámetro SNF izquierdo y la línea derecha enfatiza el parámetro SNF derecho.

Apéndice B. Programa de utilidad de fonts 123

Page 136: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

En el área de edición, los botones del ratón funcionan del siguiente modo: el botón izquierdo activa elpixel (rellena el pixel), el botón del centro actúa como conmutador y el botón derecho desactiva el pixel(borra el pixel).

Área de mensajes

El área de mensajes está situada en la parte inferior de la pantalla y tiene dos líneas. La línea superiormuestra el juego, el código y la modalidad actuales. La línea inferior muestra los mensajes.

Utilización de la ventana Vector Editor

La ventana Vector Editor (Editor de vectores) es la ventana que sirve para editar imágenes de caracterescon el editor de vectores. El programa de utilidad de fonts llama al editor de vectores para editarcaracteres de los archivos de fonts que tienen un sufijo .sym o .xgsl (definidos comograPHIGS_FORMAT o XGSL_FORMAT ).

Al seleccionar la función Editar y un carácter del área de visualización de la ventana Font Utility (yfuncionan con un archivo de fonts de vectores), se muestra la ventana Vector Editor. Consulte lossiguientes temas para obtener más información sobre la ventana Vector Editor y las cuatro áreasprincipales que contiene.

v Barra de menús

v Panel de control

v Área de edición

v Área de mensajes

Barra de menús

La barra de menús aparece en la parte superior de la ventana. Las opciones de menús son (de izquierdaa derecha): Extension (Extensión) , Information (Información) , Entry (Entrada) y Exit (Salir) .

Extension

La opción Extension tiene una subopción, Frame Edit . La subopción Frame Edit cambia la informaciónde tramas correspondiente al carácter del área de edición.

Se puede modificar la parte SUPERIOR (TOP), INFERIOR (BOTTOM), DERECHA (RIGHT), IZQUIERDA(LEFT) y la ANCHURA (WIDTH) de la trama. Pulse sobre el elemento que desee cambiar y especifique elnuevo valor. Luego pulse OK o pulse la tecla Intro. Se efectuarán cambios los cambios correspondientesen el área de edición. Para volver a la ventana Vector Editor sin efectuar cambios, pulse Cancel .

Information

Pulse en la opción Information para ver la información de caracteres correspondiente a la imagen decarácter visualizada en el área de edición. Se muestran los campos FLAGS , TOP, BOTTOM, RIGHT,LEFT, ASCII Code y EBCDIC Code .

Entry

La opción Entry tiene una subopción, Image Entry . La subopción Image Entry guarda la imagen delcarácter del área de edición en la ventana Font Utility. El código de la imagen del carácter que aparece enel área de edición se muestra de forma automática en el recuadro Selection cuando aparece la ventana.Especifique el código que aparece en el recuadro Selection pulsando OK o la tecla Intro. Para cancelarla función y volver a la ventana Vector Editor, pulse Cancel . Si especifica el código, se le solicitará queguarde los datos de caracteres que puedan haber cambiado.

124 Guía de programación de AIXwindows

Page 137: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Seleccione Yes para guardar la versión editada de la imagen de carácter, o bien seleccione No paraguardar la imagen en su formato original.

Exit

La opción Exit tiene dos subopciones: Exit y Cancel .

Con la subopción Exit saldrá del editor de vectores. Si ha cambiado la imagen del carácter que apareceen el área de edición y no la ha guardado, se le solicitará que guarde los cambios.

Seleccione Yes para guardar los cambios, No para cerrar la ventana Vector Editor y perder el trabajorealizado, o Cancel para regresar a la ventana Vector Editor. Si selecciona Yes, se le solicitará queespecifique el código de la imagen de carácter alterada.

El código de la imagen de carácter que se muestra en el área de edición aparece automáticamente en elrecuadro Selection cuando se muestra la ventana. Especifique el código que aparece en el recuadroSelection pulsando OK o la tecla Intro. Para cancelar la función y volver a la ventana Vector Editor, pulseCancel .

Panel de control

El panel de control se ejecuta bajo la parte izquierda de la ventana y tiene varias funciones, que aparecenen el siguiente orden:

Line

La función Line da forma a una línea recta o la edita en el área de edición. El ratón funciona del siguientemodo:

v Si desea dibujar una línea, utilice el botón izquierdo para formar un punto final. Una línea sigue a estepunto final. Puede crear otro punto final al final de la línea con el botón izquierdo del ratón.

v Si ya no desea continuar dibujando la línea, pulse el botón central. El botón central finaliza la línea.

v Si desea cambiar la dirección de la línea que ha dibujado, pulse el botón derecho del ratón sobre elcentro de la línea. Por ejemplo, si una línea está angulada hacia la izquierda, se cambia el ángulo a laderecha.

Move

La función Move mueve el área especificada en el área de edición. Lo que se mueve depende de lamodalidad definida. Si la opción Mode es AREA , selecciona el área que desee mover manteniendopulsado el botón izquierdo del ratón y moviendo el ratón de modo que el área quede comprendida en elrecuadro que se muestra. Cuando tenga comprendida el área que desee mover, suelte el botón izquierdodel ratón y vuélvalo a pulsar. Ahora las líneas del área seleccionada se moverán cuando mueva el ratón.Pulse el botón izquierdo del ratón cuando las líneas estén en la posición que desee. Si la opción Mode esPOINT, pulse sobre cualquier punto final y mueva el ratón para recolocar el punto final.Pulse el botónizquierdo del ratón cuando el punto final se encuentre en la posición que desee.

Copy

La función Copy copia el área especificada en el área de edición. Lo que se copia depende de lamodalidad definida. Si la opción Mode es AREA , seleccione el área que desee copiar manteniendopulsado el botón izquierdo del ratón y moviendo el ratón de modo que el área quede comprendida en elrecuadro que se muestra. Cuando tenga comprendida el área que desee copiar, suelte el botón izquierdodel ratón y vuélvalo a pulsar. Ahora las líneas del área seleccionada se copian y se mueven a medida quemueve el ratón. Pulse el botón izquierdo del ratón cuando las líneas estén en la posición que desee.

Apéndice B. Programa de utilidad de fonts 125

Page 138: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Puede copiar líneas una por una, definiendo la opción Mode como POINT y pulsando sobre el centro decualquier línea con el botón izquierdo del ratón. La línea se copia y puede colocarla pulsando el botónizquierdo del ratón.

Delete

La función Delete elimina las líneas especificadas del área de edición. Lo que se borra depende de lamodalidad definida. Si la opción Mode es AREA , seleccione el área que desee suprimir manteniendopulsado el botón izquierdo del ratón y moviendo el ratón de modo que el área quede comprendida en elrecuadro que se muestra. Cuando tenga comprendida el área que desee suprimir, suelte el botónizquierdo del ratón y vuélvalo a pulsar. Se suprimen las líneas del área seleccionada. Si la opción Modees POINT, pulse sobre cualquier punto final de la pantalla del área de edición con el botón izquierdo delratón y se suprimirá ese punto final. Si la opción Mode es TOTAL AREA , pulse sobre el área dealmacenamiento intermedio con el botón izquierdo del ratón y se suprimirán las líneas que haya allí (asícomo las que haya en el área de edición).

Resize

La función Resize le permite reducir o aumentar las líneas especificadas del área de edición. Defina laopción Mode como AREA y seleccione el área que desee redimensionar manteniendo pulsado el botónizquierdo del ratón y moviendo el ratón de modo que el área quede comprendida en el recuadro que sevisualiza. Cuando tenga comprendida el área que desee redimensionar, suelte el botón izquierdo del ratóny vuélvalo a pulsar. Las líneas del área seleccionada se aumentan o reducen (en función del punto inicialseleccionado) a medida que mueve el ratón. Cuando las líneas tengan el tamaño que desee, pulse elbotón izquierdo del ratón para definirlas con dicho tamaño.

< (Código anterior)

La función < (código anterior) recupera el código anterior del font que está editando. Es decir, cada vezque pulse < (signo menor que) con el botón izquierdo del ratón, aparece el carácter que precede al queesté editando en el área de edición. Esta función le permite seguir editando imágenes de caracteresdentro del mismo archivo de fonts sin tener que volver a la ventana Font Utility para seleccionar cadacarácter individualmente.

Si ha cambiado la imagen de carácter visualizada y no realiza una Entrada de imagen antes deseleccionar la función < (código anterior), se le solicitará que guarde los cambios que haya efectuado.

Si selecciona No, el carácter visualizado no se guarda y la imagen recupera su diseño original. Siselecciona Yes, aparece otra ventana que le indica que especifique el código correspondiente a la imagendel carácter. Cuando haya especificado el código y haya comprobado que los datos del carácter hancambiado, se guarda la versión editada de la imagen del carácter.

> (Código siguiente)

La función > (código siguiente) recupera el código siguiente del font que está editando. Es decir, cada vezque pulse el botón sobre > (signo mayor que) con el botón izquierdo del ratón, aparece el carácter quesigue al que está editando en el área de edición. Esta función le permite seguir editando imágenes decaracteres dentro del mismo archivo de fonts sin tener que volver a la ventana Font Utility paraseleccionar cada carácter individualmente.

Si ha cambiado la imagen de carácter visualizada y no realiza una Entrada de imagen antes deseleccionar la función > (código siguiente), se le solicitará que guarde los cambios que haya efectuado.

Si selecciona No, el carácter visualizado no se guarda y la imagen recupera su diseño original. Siselecciona Yes, aparece otra ventana que le indica que especifique el código correspondiente a la imagendel carácter. Cuando haya especificado el código y haya comprobado que los datos del carácter hancambiado, se guarda la versión editada de la imagen del carácter.

126 Guía de programación de AIXwindows

Page 139: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Mode

La opción Mode cambia la modalidad. La modalidad definida determina el funcionamiento de otrasfunciones. Se pueden definir tres valores: POINT, AREA o TOTAL AREA . Puede conmutar entre estastres modalidades pulsando las selecciones con el botón izquierdo del ratón. Cada vez que pulse, aparecela siguiente modalidad. Después de la modalidad TOTAL AREA , la selección vuelve a la modalidadPOINT .

Undo

La función Undo deshace la última función seleccionada (por ejemplo, Copy o Move ). Esta opción sóloestá disponible cuando termina el último mandato especificado.

Cancel

La función Cancel cancela el mandato que se está ejecutando.

Área de edición

Esta área es una cuadrícula de coordenadas en el centro de la ventana Vector Editor. Los puntos finalespueden estar activados o desactivados para cada coordenada. El área de edición tiene dos barras dedesplazamiento, botones de movimiento (situados al final de cada barra de desplazamiento), una líneasuperior, una línea base y una línea central.

A la derecha del área de edición está el área de almacenamiento intermedio de edición. El área dealmacenamiento intermedio de edición proporciona espacio adicional en el que se pueden crear y editarimágenes de caracteres y muestra el tamaño real de las imágenes de caracteres. Este área dealmacenamiento intermedio de edición contiene un recuadro de caracteres. El área comprendida en elrecuadro de caracteres es la misma área que aparece en el área de edición.

Utilice las barras de desplazamiento que rodean el área de edición para mover el recuadro de caracteresen el almacenamiento intermedio de edición. También puede mover el recuadro de caracteres y cambiarasí el enfoque del área de edición pulsando la esquina superior izquierda del recuadro con el botónizquierdo del ratón. Ahora puede colocar el recuadro de caracteres en cualquier posición del área dealmacenamiento intermedio de edición pulsando el botón izquierdo del ratón. Después de colocar elrecuadro de caracteres siguiendo cualquiera de los dos métodos, puede volver al área de edición y crearo editar un nuevo carácter.

Los botones de movimiento mueven el enfoque del área de edición en incrementos sencillos hacia laderecha o la izquierda, o hacia arriba o hacia abajo. Esta función es importante cuando se editancaracteres que son demasiado grandes y no caben dentro de las limitaciones de pantalla del área deedición. La línea base, línea superior y línea central son parámetros de imágenes de caracteres de APIgraPHIGS.

Área de mensajes

El área de mensajes está situada en la parte inferior de la pantalla y tiene dos líneas. La línea superiormuestra el juego, el código y la modalidad actuales. La línea inferior muestra los mensajes.

Apéndice B. Programa de utilidad de fonts 127

Page 140: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

128 Guía de programación de AIXwindows

Page 141: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Apéndice C. Gestión de alimentación de la pantalla

Dispone de Gestión de alimentación de la pantalla (DPM) para los dispositivos de pantalla que cumplancon el estándar VESA Display Power Management Signaling y que se conecten a adaptadores depantallas gráficas que también den soporte a este estándar.

El estándar VESA define cuatro niveles de consumo de alimentación:

v Encendida

v En espera

v Suspendida

v Apagada

En modalidad encendida, la pantalla se encuentra en su estado de alimentación completa (normal) y noahorra energía. Los estados en espera, suspendida y apagada son estados en que se consume pocaalimentación a fin de aumentar el ahorro de energía.

Nota: Consulte la información sobre su pantalla y su adaptador de pantalla gráfica para determinarsi dichos productos dan soporte a la función DPM.

Puede definir el momento en que una pantalla que dé soporte a la DPM entra en cada estado de gestiónde alimentación mediante SMIT. Seleccione Dispositivos en el menú principal, luego Pantalla degráficos y luego Gestión de alimentación de la pantalla . En este diálogo hay tres valores de tiempo deespera correspondientes a cada uno de los estados de bajo consumo de alimentación. Estos tiempos deespera definen el intervalo de tiempo transcurrido desde la última entrada del operador hasta que se entraen el correspondiente estado de gestión de alimentación.

Los valores por omisión correspondientes a estos tiempos de espera son los siguientes:

En espera 20 minutosSuspendida 30 minutosApagada 40 minutos

Se da soporte a la función DPM en las modalidades LFT y de gráficos. En la modalidad AIXwindows, loscambios en los valores de tiempo de espera en ODM entran en vigor después de la siguiente vez que sedesactive el protector de pantalla, a menos que el usuario haya especificado las opciones de gestión dealimentación en la línea de mandatos de X Server. En el caso de la modalidad LFT, los cambiosefectuados en los valores de tiempo de espera entran en vigor después de que se vuelva a arrancar elsistema.

En el caso de pantallas que no den soporte a la gestión de alimentación VESA, la función del protector depantalla de AIXwindows siguen ofreciendo funciones de protección de pantalla. Se ha añadido a lamodalidad LFT una función de pantalla en blanco que reduce el calor y ayuda a alargar la vida de lapantalla.

Los usuarios de AIXwindows también puede alterar temporalmente los tiempos de espera de DPM con eldistintivo -pm cuando se inicie AIXwindows. El distintivo -pm permite tres parámetros, que corresponden alos tres valores de tiempo de espera; por ejemplo:

-pm t1 t2 t3

Los valores de tiempo de espera se especifican el minutos. El mandato:

xinit -s 10 -pm 20 30 40

© Copyright IBM Corp. 1997, 2001 129

Page 142: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

indica que AIXwindows se debe ejecutar con el protector de pantalla activado después de 10 minutos yque la pantalla debe ponerse en estado de espera al cabo de 20 minutos, en estado suspendido al cabode 3o minutos y apagarse al cabo de 40 minutos desde que se detectó el último suceso de entrada.

La función de tiempo de espera de DPM se inhabilita si el protector de pantalla está inhabilitado (-s 0) osi el primer tiempo de espera de DPM (en espera) se define como 0 (cero).

130 Guía de programación de AIXwindows

Page 143: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Apéndice D. Puesta a punto de los dispositivos de entrada degráficos X11 (teclas LPF, diales, tablero, Spaceball)

X11, GL, graPHIGS y OpenGL dan soporte a los dispositivos de entrada de gráficos X11. Para poner apunto los dispositivos de entrada de gráficos X11, consulte el procedimiento correspondiente al dispositivoadecuado.

Tablerov Conecte el tablero de gráficos a la puerta de tablero o a las puertas serie de la máquina. La puerta de

tablero no está disponible en todas las máquinas. Si existe una puerta de tablero, esta se encuentrajunto a las puertas del ratón y del teclado. En algunos sistemas, la puerta de tablero está marcada conuna T. Si conecta el tablero de gráficos a una puerta serie, es posible que tenga que añadir una tty alsistema. Para añadir una tty:

1. Entre smit devices

2. Seleccione TTY.

3. Seleccione Añadir una TTY .

4. Seleccione la puerta serie a la que está conectado el tablero de gráficos.

v Instale el siguiente paquete de software, que depende del dispositivo, correspondiente al tablero degráficos:

Software de adaptador de entrada de gráficos de AIXwindows

Diales y teclas LPFv Conecte los botones (teclas LPF, o ″lighted programmable function″, de función programable) y los

diales al adaptador de E/S de gráficos (GIO) o bien a las puertas serie de la máquina. Si los diales yteclas LPF se conectan a una puerta serie, es posible que tenga que añadir una tty al sistema. Paraañadir una tty:

1. Entre smit devices

2. Seleccione TTY.

3. Seleccione Añadir una TTY .

4. Seleccione la puerta serie a la que están conectados los diales y las teclas LPF.

v Instale los siguientes paquetes de software, que dependen del dispositivo, correspondientes a los dialesy a las teclas LPF:

– Software de adaptador de entrada de gráficos de AIXwindows

– Software de adaptador de gráficos serie de AIXwindows

v Cuando vuelva a arrancar la máquina, los diales y las teclas LPF conectados al adaptador GIO sedeben configurar de forma automática. También los puede configurar mediante SMIT.

Nota: Los diales y las teclas LPF conectados en serie se deben configurar mediante SMIT antesde utilizarlos por primera vez. Se configuran de forma automática en los siguientes arranques.

Para configurar diales y teclas LPF:

1. Entre smit devices

2. Seleccione Dispositivos de entrada de gráficos .

3. Seleccione Diales/TeclasLPF .

4. Seleccione Añadir un dial/teclaLPF .

5. Seleccione el tipo de dispositivo a configurar.

6. Seleccione la ubicación de conexión del dispositivo (por ejemplo, gio0 o tty0).

© Copyright IBM Corp. 1997, 2001 131

Page 144: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

SpaceballConecte el Spaceball a la puerta serie de la máquina. El Spaceball necesita un cable serie especial y unconector que proporcione la CA que necesita el Spaceball.

Nota: Algunos sistemas se pueden configurar de forma distinta. Consulte la información que vienecon el Spaceball.

v Después de conectar el Spaceball con el cable serie especial, es posible que tenga que añadir una ttyal sistema. Para añadir una tty:

1. Entre smit devices

2. Seleccione TTY.

3. Seleccione Añadir una TTY .

4. Seleccione la puerta serie a la que está conectada el Spaceball.

v Instale los siguientes paquetes de software, que dependen del dispositivo, correspondientes alSpaceball:

– Software de adaptador de entrada de gráficos de AIXwindows

– Software de dispositivo de entrada 3-D Spaceball 6094-030 de AIXwindows

v Para añadir el dispositivo Spaceball:

1. Entre smit devices

2. Seleccione Dispositivos de entrada de gráficos .

3. Seleccione Spaceball .

4. Seleccione Añadir Spaceball .

v Es posible que tenga que restablecer el Spaceball pulsando los siguientes botones en el Spaceball:1, 1, 2, 2, 3, 5, 6, 7, 8

132 Guía de programación de AIXwindows

Page 145: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Apéndice E. El almacenamiento intermedio de tramas virtualX

En este capítulo se describe el Almacenamiento intermedio de tramas virtual X, una característica de AIXque permite que una aplicación se renderice en la memoria principal del sistema en lugar de hacerlo en eladaptador de gráficos de hardware. Esta característica también está relacionada con el hardware, ya quepuede sustituirlo de forma completa o parcial.

Visión generalSe ha mejorado el servidor X de AIX para que dé soporte a la tecnología de Almacenamiento intermediode tramas virtual X. El Almacenamiento intermedio de tramas virtual X (XVFB) permite que el servidor Xse inicialice y se ejecute sin la presencia de ningún adaptador físico de gráficos. En el pasado, el servidorX necesitaba la presencia de uno o más adaptadores de gráficos para poder ejecutarse, y se cerraba conun error si no había ninguno presente.

Además, en un entorno estándar del sistema X Window, todas las aplicaciones 3D que se ejecutan en unsistema deben compartir el mismo almacenamiento intermedio de tramas de hardware. Aunque esto esaceptable para ver localmente a los clientes, no lo es para ver a los clientes de forma remota cuando lasventanas de gráficos se solapan en el espacio de la pantalla. Este solapamiento hace que la ejecución serealice en serie y que el rendimiento general sea más lento.

Con XVFB, cada aplicación tiene un área privada de ejecución en 3D. Dado que no hay solapamientos deventanas, la ejecución puede realizarse en paralelo. La desventaja para cualquier pantalla conectadalocalmente, es que el usuario no puede ver la imagen en la pantalla; debe visualizarse a través de la red.

En el entorno XVFB, una aplicación renderiza imágenes en una máquina servidor. Después, estasimágenes se distribuyen a las estaciones de visualización en una red, se guardan en una base de datos ose utilizan de otro modo. El entorno XVFB es útil para ver gráficos 3D en un sistema de gama baja parausuarios ocasionales.

El software XVFB está soportado por AIX 4.3 o releases posteriores. XVFB también está soportado enRS/6000 SP. Instale el paquete X11.vfb , que requiere aproximadamente 1 MB de espacio de disco.Asegúrese de rearrancar el sistema después de instalar este paquete.

Instalación de XVFBEsta sección describe cómo instalar el software de XFVB en diversas versiones de AIX.

AIX 4.3XVFB para AIX 4.3 se instala desde el siguiente conjunto de archivos:

v U454163 - OpenGL.OpenGL_X.dev.vfb.04.03.0000.0000

v U454162 - X11.vfb.04.03.0000.0000

Se necesitan dos PTF para arreglar un problema de redimensionamiento de ventanas, pero dado que noestán disponibles, debe migrar a AIX 4.3.1 o un release posterior para utilizar XVFB con AIX 4.3 .

Si está instalado el PTF U452591, CATweb Navigator Versión 1 se ejecutará satisfactoriamente.

v U452591 - OpenGL.OpenGL_X.rte.soft.4.3.0.1

© Copyright IBM Corp. 1997, 2001 133

Page 146: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

AIX 4.3.1XVFB para AIX 4.3.1 se instala desde los CD del producto de AIX 4.3.1. Instale los conjuntos de archivossiguientes:

v OpenGL.OpenGL_X.dev.vfb.04.03.0001.0000

v X11.vfb.04.03.0001.0000

Se necesitan dos PTF para arreglar un problema de redimensionamiento de ventanas, que estándisponibles en fixdist:

v U456096 - OpenGL.OpenGL_X.dev.vfb.4.3.1.1

v U456079 - OpenGL.OpenGL_X.rte.soft.4.3.1.1

AIX 4.3.2XVFB para AIX 4.3.2 se instala desde los CD del producto de AIX 4.3.2. Instale los conjuntos de archivossiguientes:

v OpenGL.OpenGL_X.dev.vfb.04.03.0002.0000

v X11.vfb.04.03.0001.0000

AIX 4.3.3XVFB para AIX 4.3.3 se instala desde los CD del producto de AIX 4.3.3. Instale los conjuntos de archivossiguientes:

v OpenGL.OpenGL_X.dev.vfb.04.03.0003.0000

v X11.vfb.04.03.0003.0000

Para obtener soporte de pseudocolores de 8 bits, instale el PTF siguiente, que está disponible en fixdist:

v U474006 - 4330-06 Mantenimiento recomendado para AIX 4.3.3

AIX 5.1XVFB para AIX 5.1 se instala desde los CD del producto de AIX 5.1. Instale los conjuntos de archivossiguientes:

v OpenGL.OpenGL_X.dev.vfb.05.01.0000.0000

v X11.vfb.05.01.0000.0000

Inicio de XVFBXVFB se carga en el servidor X con el distintivo -vfb :/usr/bin/X11/X -force -vfb -x abx -x dbe -x GLX :n &

donde n es el número de pantalla que desea asociar a esta instancia de XVFB. Esto inicia el servidor Xsin utilizar ningún adaptador de gráficos instalado y carga las extensiones OpenGL en el servidor X.

También puede utilizarse el mandato xinit , que inicia el servidor X y el gestor de ventanas:/usr/bin/X11/xinit -- -force -vfb -x abx -x dbe -x GLX :n &

El distintivo -vfb puede añadirse también a la línea EXTENSIONS del archivo .xserverrc .

Para que XVFB se active al arrancar el sistema, solicite al administrador del sistema que añada lasiguiente entrada en el archivo /etc/inittab :xvfb:2:respawn:/usr/bin/X11/X -force -vfb -x abx -x dbe -x GLX :n > /dev/null

Esta entrada hace que el servidor X se inicie durante el arranque del sistema y se reiniciaautomáticamente si el servidor se cierra o se desactiva.

134 Guía de programación de AIXwindows

Page 147: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Puede ejecutar más de un servidor X a la vez, con las siguientes limitaciones:

v No puede utilizar el Escritorio COSE.

v Puede utilizar varias instancias del servidor X XVFB.

v Sólo puede utilizar una única instancia del servidor X que se ejecute en un adaptador de gráficos.

Si tiene un sistema con un adaptador de gráficos y desea ejecutar uno o más servidores X XVFB ademásde un servidor X en el adaptador de gráficos, realice lo siguiente:

1. Inicie el servidor X en el adaptador de gráficos:/usr/bin/X11/xinit

2. Desde un xterm/aixterm, inicie el servidor XVFB:/usr/bin/X11/X -vfb -x GLX -x abx -x dbe -force :n &

Es preciso que el número de pantalla n sea distinto del que se utiliza con el adaptador de gráficos.

A partir del Nivel de mantenimiento 4330-06, XVFB puede iniciarse con una profundidad 8 ó 24 (24 esel valor por omisión). Para especificar la profundidad 8, incluya -d 8 en la línea de mandatos. Si laprofundidad es 8, colorclass será 3 (pseudocolor). Si la profundidad es 24, colorclass será 4(truecolor). Estos son los únicos valores de colorclass soportados para XVFB. La profundidad 8 noestá soportada para DirectSoft OpenGL.

Prueba de XVFBDado que no puede ver el almacenamiento intermedio de tramas cuando utiliza XVFB, es difícil confirmarque todo está funcionando correctamente. Por suerte, varios clientes X se envían con AIX, que puedeutilizarse para consultar y ver el contenido de las ventanas, y que también le ayudará a verificar queXVFB está renderizando las imágenes correctas. Estos clientes incluyen a xwininfo , xwd y xwud .

Verificación del uso de XVFBPara verificar que un servidor X se está ejecutando con XVFB, utilice el siguiente mandato:/usr/lpp/X11/Xamples/bin/xprop -display nombsist:n -root | grep VFBXVFB_SCREEN(STRING) = "TRUE" <== indica que XVFB se está utilizando

donde nombsist es el nombre del sistema y n es el número de pantalla para el que realiza la consulta.

Verificación del funcionamiento de XVFBSi no está seguro de si XVFB está instalado y se ha iniciado correctamente, utilice el siguiente métodopara probar XVFB. Su sistema debe estar en una red y ha de tener acceso a otro sistema (que tenga unapantalla) para ver el contenido de XVFB.

1. En el sistema XVFB, inicie el servidor X mediante el distintivo -vfb :/usr/lpp/X11/bin/X -force -vfb -x GLX -x abx -x dbe :n &

2. En el sistema XVFB, ejecute el programa cliente xclock :xclock -display :n &

3. En el otro sistema, asegúrese de que X se está ejecutando y de que los clientes pueden conectarse:xhost +

4. En el sistema XVFB, busque el ID de ventana del cliente xclock :xwininfo -root -tree | grep xclock

El primer número (0x12345678) es el ID de ventana.

5. En el sistema XVFB, utilice xwd/xwud para visualizar la ventana cliente del sistema XVFB en el otrosistema.xwd -id 0x12345678 | xwud -display otrosistema:0.0

Apéndice E. El almacenamiento intermedio de tramas virtual X 135

Page 148: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

En el otro sistema se visualiza una imagen del xclock que inició en el sistema XVFB.

Implementación de XVFB en el código de aplicaciónXVFB permite a los desarrolladores escribir aplicaciones de gráficos 3D basadas en la Web para unservidor RS/6000 sin necesitar un adaptador de gráficos 3D. En la mayoría de entornos, las aplicacionesmejoradas con XVFB pueden conseguir una escalabilidad casi lineal añadiendo procesadores a sistemasde varios procesadores, ya que cada cliente puede ejecutarse en su propio almacenamiento intermedio detramas sin interactuar con el servidor X. Los usuarios que ven los datos en los sistemas clientesconsiguen las ventajas del uso de XVFB sin efectuar cambios en el software ni aplicar métodos deinvocación a las aplicaciones. Para que una aplicación opere en un entorno XVFB, debe mejorarse laaplicación de la siguiente manera:

1. Extraer una imagen renderizada de un servidor de renderización:

Extraiga o recupere la imagen que debe visualizarse del servidor de renderización. Generalmente, unaaplicación ejecutará XGetImage para las aplicaciones X o glReadPixels para las aplicacionesOpenGL. La aplicación decide la frecuencia y el tipo de acciones que darán como resultado laextracción de la imagen del servidor de renderización. Un posible criterio es que cada vez que seintercambie el almacenamiento intermedio mediante la subrutina XdbeSwapBuffers oglXSwapBuffer .

2. Enviar mandatos a una aplicación remota en una plataforma de servidor:

Para dar entradas a la aplicación para su ejecución, como abrir archivos o transformar objetos, debehaber un método para enviar la entrada de la aplicación desde un origen remoto. Puede ser unlenguaje de mandatos, una conexión de zócalo, interacción con un servidor HTTP o algún otro tipo deservicios de comunicación. Pueden utilizarse las extensiones XRecord y XTest para enviar sucesos alservidor X y comunicarse con la aplicación mediante sucesos X tradicionales.

3. Visualizar una imagen en una estación de pantalla:

El entorno XVFB debe contener un método para visualizar la imagen renderizada en la estación depantalla. El método de visualización de la imagen extraída depende del criterio del programador. Si laestación de pantalla es una estación de pantalla AIX que ejecuta un servidor X de AIXwindows, podríavisualizarse la imagen extraída mediante el mandato xwud . El mandato xwud toma una imagen enformato xwd, crea una ventana y realiza XPutImage para visualizar la imagen extraída.

Unos métodos más sofisticados podrían ser la compresión de la imagen y las applets Java devisualización. La ventana de una applet Java de visualización es que la imagen puede visualizarse endiversos tipos de plataforma.

Las aplicaciones pueden asimismo comprobar el valor de la propiedad XVFB_SCREEN paradeterminar si se ejecutan con XVFB. El siguiente código muestra cómo puede realizarse esto:int isXVFB(Display *display,Screen screen){

Atom atom,actual_type;int actual_format,status;unsigned long nitems,bytes_after;unsigned char *prop;atom = XInternAtom(display,"XVFB_SCREEN",True);if (atom == None)

return False;status = XGetWindowProperty(display,RootWindow(display,screen),atom,0,100,False,atom,&actual_type,&actual_format,&nitems,&bytes_after,&prop);if (strcmp((char*)prop,"TRUE") == 0)

return True;return False;

}

136 Guía de programación de AIXwindows

Page 149: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Trabajo con XVFBXVFB funciona proporcionando una capa DDX (X dependiente del dispositivo) que dirige un adaptador degráficos de software. El almacenamiento intermedio de tramas se almacena en la memoria del sistema ytodo el proceso de gráficos (líneas, polígonos, texto, etc.) se realiza en el software utilizando la CPU delsistema.

XVFB está concebido para utilizarse en un entorno de ″servidor de renderización″. Con XVFB, lasaplicaciones X pueden ejecutarse y renderizar imágenes, y es posible consultar las imágenes de vuelta enla aplicación para guardarlas en un archivo, distribuirlas por la red, guardarlas en una base de datos, etc.En esta modalidad, un usuario no utiliza directamente la aplicación X de manera interactiva. En cambio, laaplicación X se dirige remotamente como servidor de renderización.

Si no hay ningún dispositivo físico de gráficos, no existe ningún RAMDAC (convertidor de digital aanalógico de la memoria de acceso aleatorio) para generar señales RGB. Por consiguiente, es imposibleconectar un monitor a su sistema y ver el contenido del Almacenamiento intermedio de tramas virtual delservidor X. Esta situación es una buena solución para renderizar entornos de servidor, donde no esnecesario el gesto adicional de un adaptador físico de gráficos y una pantalla. Cuando no puede versedirectamente el almacenamiento intermedio de tramas X, la depuración de la aplicación es más difícil. Sesugiere que se desarrollen aplicaciones con un adaptador físico de gráficos y se transporten luego aXVFB. Puede utilizar las herramientas de cliente X como xwininfo , xwd y xwud para ayudarle a verificarque la aplicación se ejecuta correctamente con XVFB.

Los dispositivos de entrada en el entorno XVFB no son necesarios. Dado que no puede ver elalmacenamiento intermedio de tramas, no es muy útil mover el ratón y escribir con el teclado. Lasaplicaciones de servidor de renderización se dirigen remotamente con la comunicación de zócalos directay la interacción con un servidor HTTP, a través de conexiones CORBA, la interfaz de paso de mensajes(MPI) u otros métodos. La mayoría de aplicaciones necesitan modificaciones para que se controlenremotamente para un entorno de servidor de renderización.

OpenGL está soportado actualmente con XVFB; sin embargo, PEX, GL 3.2 y graPHIGS no lo están.

DirectSoft OpenGL y XVFBDirectSoft OpenGL (DSO) se ha implementado para trabajar con XVFB y se ha diseñado específicamentepara mejorar el rendimiento de los servidores CATweb mediante:

v La eliminación de la comunicación interprocesos ajena

v La eliminación de la actividad de conmutación de contextos de procesos

v Una renderización y lectura de imágenes más directa y eficaz.

DSO es una implementación pura de software de OpenGL que se ejecuta como un Contexto OpenGLdirecto. Por consiguiente, todo el trabajo de OpenGL con uso intensivo de la CPU (renderización 3D)forma parte del proceso de aplicación y no del proceso del servidor X. Al ejecutarse de manera directa, seeliminan todas las comunicaciones interprocesos con el servidor X, lo que hace mucho más eficaz larenderización 3D. Como resultado, el sistema operativo AIX no tiene que realizar la conmutación decontexto entre el servidor X y las aplicaciones de renderización 3D, lo que hace más eficaz la utilizacióndel sistema.

DSO y XVFB permiten que las máquinas SMP sean servidores CATweb viables y escalables. DSO creaun área de renderización privada para cada aplicación de renderización 3D. Cuando llega el momento derenderizar una imagen nueva, la aplicación dibuja en su área de renderización privada. Si dos clientesCATweb solicitan imágenes nuevas al mismo tiempo, cada una de las aplicaciones de renderización 3Dpueden dibujar imágenes nuevas simultáneamente, cada una en su propia área de renderización privada.Dado que varias aplicaciones de renderización 3D pueden dibujar de manera simultánea, varias CPUpueden explotarse al mismo tiempo. Sin DSO y XVFB, la aplicaciones de renderización 3D dibujan en un

Apéndice E. El almacenamiento intermedio de tramas virtual X 137

Page 150: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

almacenamiento intermedio de tramas compartido, lo que significa que operan en serie y por turnos. Dadoque cada aplicación de renderización 3D sigue su turno para dibujar, sólo puede explotarse eficazmenteuna única CPU.

Si utiliza una aplicación OpenGL con DirectSoft OpenGL y XVFB, el escenario de prueba con xwd yxwud descrito anteriormente en este capítulo no funcionará. La causa es que, para aumentar elrendimiento, el comportamiento de OpenGL DirectSoft por omisión no realiza un BLIT (transferencia debloques de bits) al contenido del almacenamiento intermedio de tramas privado al Almacenamientointermedio de tramas virtual X. Este comportamiento es el adecuado para la mayoría de aplicaciones deservidor de renderización OpenGL, porque la imagen se consultará desde el almacenamiento intermediode tramas privado mediante glReadPixels . No obstante, la utilización de xwd y xwud sólo captura elcontenido de una ventana en blanco.

Para verificar que DirectSoft OpenGL está funcionando, defina la variable de entorno_OGL_MIXED_MODE_RENDERING como 1 y ejecute la aplicación OpenGL. Esto obligará a OpenGL arealizar una BLIT (transferencia de bloques de bits) de la imagen renderizada desde el almacenamientointermedio de tramas de software privado al Almacenamiento intermedio de tramas virtual X. Después derealizar esto, puede utilizar xwd y xwud para capturar y volcar el contenido de la ventana OpenGL.

Nota: Es recomendable que no mantenga la variable de entorno_OGL_MIXED_MODE_RENDERING definida todo el tiempo, ya que esto ralentizará la operacióngeneral de DirectSoft OpenGL.

Las aplicaciones pueden determinar si utilizan DirectSoft OpenGL comprobando la serie de renderizaciónde OpenGL mediante la subrutina glGetString y comprobando el contexto de OpenGL mediante lasubrutina glXIsDirect . Puede utilizarse el código siguiente:int isDirectSoftOpenGL(Display *display,GLXContext context){if (glXIsDirect(display,context) == FALSE)

return FALSE;if (strcmp(glGetString(GL_RENDERER),"SoftRaster") == 0)

return TRUE;return FALSE;

}

CATweb y XVFBCATweb Navigator permite a los usuarios de navegadores Web habilitados con Java que vean ynaveguen por la información del producto creada con CATIA Solutions. Mediante el conjunto intuitivo deapplets Java que componen el cliente CATweb Navigator, los usuarios pueden conectarse a la máquinaservidor de CATweb Navigator, selecciona modelos para su visualización y se pueden ver y navegar porlos modelos con un visor 3D, un visor esquemático 2D o un visor de estilo de informe. Una máquinaservidor de CATweb Navigator puede dar soporte a varios clientes de CATweb Navigator activossimultáneamente. Para cada cliente de CATweb que se conecta al servidor de CATweb, se inician uno omás procesos CATweb en el servidor de CATweb para manejar las peticiones de ese cliente CATweb enparticular. Uno de estos procesos CATweb es una aplicación de renderización 3D, que se ejecuta en elservidor de CATweb y es responsable de:

v La carga del modelo CATIA solicitado

v La renderización del modelo 3D cuando el cliente de CATweb solicita nuevas visualizaciones

v La compresión de la imagen finalmente renderizada

v La transferencia de la imagen al cliente Java de CATweb

Esta aplicación utiliza las bibliotecas del sistema X Window y OpenGL para renderizar imágenes 3D deforma rápida y exacta. XVFB y DirectSoft OpenGL permiten que las máquinas de servidor de CATwebNavigator operen sin adaptadores de gráficos caros y explotar las máquinas SMP (Proceso multisimétrico)de manera eficaz. Además, XVFB y DirectSoft OpenGL permiten que el servidor de CATweb Navigator

138 Guía de programación de AIXwindows

Page 151: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

sean utilizables durante el arranque sin requerir que un usuario se conecte de manera interactiva, lo quefacilita la puesta a punto y la administración de un servidor de CATweb Navigator.

Por omisión, CATweb Navigator no utiliza XVFB. La renderización del servidor de imágenes se realizamediante el almacenamiento intermedio de tramas X real y todas las renderizaciones simultáneas deCATweb se sincronizan para compartir este único recurso (bloqueo de renderización de CATweb). En lamodalidad XVFB, cada proceso de CATweb utiliza su propio Almacenamiento intermedio de tramas virtualX y la sincronización de la renderización ya no es necesaria, lo que mejora el rendimiento general en unentorno multiusuario.

Para desactivar el bloqueo de renderización CATweb por omisión, cambie el siguiente valor en el archivorunServerCATIA en el directorio .../CATwebNavigator/bin :VirtualFrameBufferOn=1(valor por omisión = 0)

El desbloqueo de renderización de CATweb entra en vigor en la siguiente conexión de CATweb.

Apéndice E. El almacenamiento intermedio de tramas virtual X 139

Page 152: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

140 Guía de programación de AIXwindows

Page 153: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Apéndice F. Avisos

Esta información se ha desarrollado para productos y servicios que se ofrecen en EE.UU.Es posible que IBM no ofrezca los productos, servicios o características que se describen en estedocumento en otros países. Consulte con el representante local de IBM para obtener información sobrelos productos y servicios que están actualmente disponibles en su área. Cualquier referencia a unproducto, programa o servicio IBM no pretende afirmar ni implica que sólo se pueda utilizar dichoproducto, programa o servicio IBM. En su lugar se puede utilizar cualquier producto, programa o serviciofuncionalmente equivalente que no infrinja los derechos de propiedad intelectual de IBM. Sin embargo, esresponsabilidad del usuario la evaluación y la verificación del funcionamiento de cualquier producto,programa o servicio que no sea de IBM.IBM puede tener patentes o solicitudes de patentes pendientes que afecten a los temas que se describenen este documento. El suministro de este documento no proporciona ninguna licencia sobre estaspatentes. Puede enviar consultas sobre patentes a:IBM Director of LicensingIBM CorporationNorth Castle DriveArmonk, NY 10504-1785EE.UU.

Para consultas sobre licencias relacionadas con información de doble byte (DBCS), póngase en contactocon el Departamento de Propiedad Intelectual de IBM de su país o envíe las consultas, por escrito a:IBM World Trade Asia CorporationLicensing2-31 Roppongi 3-chome, Minato-kuTokio 106, Japón

El párrafo siguiente no se aplica al Reino Unido ni a ningún otro país en el que tales disposicionesentren en contradicción con la ley local: INTERNATIONAL BUSINESS MACHINES CORPORATIONPROPORCIONA ESTA PUBLICACIÓN "TAL CUAL" SIN GARANTÍA DE NINGÚN TIPO, NI EXPLÍCITA NIIMPLÍCITA, INCLUYENDO, PERO SIN LIMITARSE A, LAS GARANTÍAS IMPLÍCITAS DE NOINCUMPLIMIENTO, COMERCIALIZACIÓN O ADECUACIÓN A UN PROPÓSITO DETERMINADO.Algunos países no permiten la exclusión de garantías expresas o implícitas en determinadas operacionescomerciales, por lo que es posible que este párrafo no se aplique en su caso.Esta información puede contener incorrecciones técnicas o errores tipográficos. Periódicamente serealizarán modificaciones en la información aquí contenida; dichos cambios se incorporarán en nuevasediciones de la publicación. IBM puede realizar en cualquier momento cambios y/o mejoras en el(los)producto(s) y/o programa(s) que se describen en esta publicación sin previo aviso.

IBM puede utilizar o distribuir cualquier información que se le suministre del modo que considere másadecuado sin incurrir por ello en ninguna obligación con el remitente.

Los titulares de una licencia de este programa que deseen obtener información sobre el mismo con lafinalidad de habilitar: (i) el intercambio de información entre programas creados independientemente yotros programas (incluido éste) y (ii) la utilización mutua de la información que se ha intercambiado,deben ponerse en contacto con:IBM CorporationDept. LRAS/Bldg. 00311400 Burnet RoadAustin, TX 78758-3498EE.UU.Esta información puede estar disponible, sujeta a los términos y condiciones apropiados, incluyendo enalgunos casos, el pago de una tarifa.El programa bajo licencia que se describe en este documento y todo el material bajo licencia disponible

© Copyright IBM Corp. 1997, 2001 141

Page 154: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

para el mismo los proporciona IBM bajo los términos del IBM Customer Agreement, el IBM InternationalProgram License Agreement o cualquier acuerdo entre IBM y el usuario.

La información sobre productos no IBM se ha obtenido de los suministradores de dichos productos, desus anuncios publicados u otras fuentes disponibles públicamente. IBM no ha probado dichos productos yno puede confirmar la exactitud del rendimiento, la compatibilidad o cualquier otra información relacionadacon productos no IBM. Las preguntas sobre las posibilidades de los productos no IBM deben dirigirse alos suministradores de dichos productos.

Esta información contiene ejemplos de datos e informes utilizados en operaciones comerciales diarias.Para ilustrarlas del modo más completo posible, los ejemplos incluyen nombres de personas, empresas,marcas y productos. Todos estos nombres son ficticios y cualquier semejanza con los nombres ydirecciones utilizados en una empresa real es una mera coincidencia.

142 Guía de programación de AIXwindows

Page 155: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Hoja de Comentarios

AIX 5L Versión 5.1Guía de programación de AIXwindows

Por favor, sírvase facilitarnos su opinión sobre esta publicación, tanto a nivel general (organización, contenido,utilidad, facilidad de lectura,...) como a nivel específico (errores u omisiones concretos). Tenga en cuenta que loscomentarios que nos envíe deben estar relacionados exclusivamente con la información contenida en este manualy a la forma de presentación de ésta.

Para realizar consultas técnicas o solicitar información acerca de productos y precios, por favor diríjase a susucursal de IBM, business partner de IBM o concesionario autorizado.

Para preguntas de tipo general, llame a ″IBM Responde″ (número de teléfono 901 300 000).

Al enviar comentarios a IBM, se garantiza a IBM el derecho no exclusivo de utilizar o distribuir dichos comentariosen la forma que considere apropiada sin incurrir por ello en ninguna obligación con el remitente.

Comentarios:

Gracias por su colaboración.

Para enviar sus comentarios:v Envíelos por correo a la dirección indicada en el reverso.v Envíelos por correo electrónico a: [email protected]

Si desea obtener respuesta de IBM, rellene la información siguiente:

Nombre Dirección

Compañía

Número de teléfono Dirección de e-mail

Page 156: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

Hoja de Comentarios IBM

IBM S.A.National Language Solutions CenterAvda. Diagonal 579, Edificio ″L’Illa″Barcelona 08028España

Page 157: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo
Page 158: Guía de programación de AIXwindows - Redes-Linux.comredes-linux.com/otros_sistemas/Aix/aixwnpgd.pdfEfecto de la dirección de diseño en los widgets y gadgets Motif.....105 Ejemplo

IBM