Previous Next Table of Contents

2. Introducción a la programación en X Window

2.1 Un programa X simple


#include <X11/Xlib> /* A */
#include <X11/Xutil.h>
#include <stdio.h>

main()
{
    Display *display; /* B */
    Window ventana;

    display = XOpenDisplay( NULL ); /* C */
    ventana = XCreateSimpleWindow(display, RootWindow( display, 0 ), /* D */
                50, 50, 500, 400, 2, 0, 1 );
    XMapWindow( display, ventana ); /* E */
    XFlush( display ); /* F */
    getchar(); /* G */
}

A

incluye los ficheros de cabecera necesarios para usar la Xlib. En ellos se definen estructuras, macros y constantes.

B

declara las variables de los tipos necesarios para las llamadas a la Xlib.

C

contruye la conexion entre el programa (el cliente) y el servidor especificado.

D

crea una ventana.

E

mapea la ventana. Esto es necesario porque una ventana creada no es visible hasta que no se mapea.

F

vacia el buffer de peticiones del cliente para que se transmitan al servidor.

G

espera a que se pulse una tecla. Cuando el programa termina, se ejecuta automaticamente el procedimiento de cierre y la ventana desaparece.

2.2 Ficheros de cabecera de la Xlib

X11/Xlib.h

Define estructuras y macros usados en muchas llamadas a la Xlib.

X11/X.h

Define constantes usadas en muchas llamadas a la Xlib.

X11/Xutil.h

Define constantes y estructuras usadas junto con los gestores de ventanas X.

X11/Xutil.h

está incluido en X11/Xlib.h por lo que no es necesario incluirlo explícitamente.

2.3 Como compilar, enlazar y ejecutar

Para compilar un programa cuyo fichero fuente sea xprog.c el comando es el siguiente:

cc -o xprog xprog.c -lX11

y para ejecutarlo

xprog

Siempre hay que usar la biblioteca 'usr/lib/libX11.a'

2.4 Abrir el display

El sistema X Window esta construido sobre el modelo cliente-servidor para funcionar en un entorno de trabajo en red. Antes de que el programa de aplicacion empiece a enviar sus peticiones al servidor, hay que decidir con que servidor se va a comunicar. Los siguientes son terminos clave para especificar un servidor: El host es un ordenador en la red. El display tiene un significado diferente del usual; en el sistema X Window, un display es una unidad que incluye uno o mas de los siguientes objetos: pantalla, teclado y/o un dispositivo de señalamiento, tal como un raton. Asi que display significa casi lo mismo que estacion de trabajo. La pantalla es una pantalla que pertenece a un display (o estacion de trabajo). Es necesario distinguir entre una pantalla y un display en el mundo del sistema X Window. Un host puede tener mas de un display. Cada display puede identificarse mediante un numero de display o numero de servidor de display. Un display puede tener mas de una pantalla. Cada pantalla puede identificarse por un numero de pantalla. En la mayoria de los casos cada host tiene un display y una pantalla. El servidor es el software que gestiona un display. Un servidor puede manejar solo un display. El servidor tambien se llama servidor de display porque la relacion entre un servidor y un display es 1:1. Para establecer una conexion entre un programa de aplicacion y un servidor de display hay que usar la llamada XOpenDisplay.

2.5 Llamada Xlib: XOpenDisplay

Display *XOpenDisplay( char *nombreDisplay )

El nombreDisplay es una cadena con el formato: nombreHost:numero.numeroPantalla. El 'nombreHost' es el nombre del host en el que reside el servidor. El 'numero' es el numero del display, y el 'numeroPantalla' es el numero de la pantalla. La conexion con el display se hace entre un cliente y un servidor de display (o un display), no entre un cliente y una pantalla; por eso, el numero de pantalla puede omitirse, tomandose la pantalla cero por defecto, por ejemplo: host3:0.2 se usaria para conectar el servidor de display 0 del host3 con la pantalla 2. host2:1 se usaria oara conectar el servidor de display 1 del host2 con la pantalla por defecto, la 0. El 'nombreDisplay' puede ser NULL, en cuyo caso el valor de 'nombreDisplay' se reemplaza por la cadena almacenada en la variable de entorno DISPLAY. Cuando la conexion se ha establecido con exito, la llamada a XOpenDisplay devuelve un puntero a una estructura Display, en la que el servidor envia una gran cantidad de informacion sobre el display.

2.6 Obtener informacion sobre el Display

Para obtener informacion sobre el display conectado o sobre el servidor de display a partir de la estructura devuelta por XOpenDisplay se pueden usar macros especiales en C o sus correspondientes funciones equivalentes en otros lenguajes.

2.7 Macros y sus correspondientes funciones

La sintaxis incluye las macros y sus correspondientes funciones. En C pueden usarse ambas versiones, en otros lenguajes solo se pueden usar las funciones. Para saber que vendedor proporciona el servidor pueden usarse:

ServerVendor( display )

char *XServerVendor( Display *display )

Para conocer el tamaño de la pantalla:

DisplayWidth( display, numeroPantalla )

DisplayHeight( display, numeroPantalla )

int XDisplayWidth( Display *display, int numeroPantalla )

int XDisplayHeight( Display *display, int numeroPantalla )

Para conocer los valores de pixel para el blanco y el negro:

WhitePixel( display, numeroPantalla )

BlackPixel( display, numeroPantalla )

estos valores pueden usarse para especificar los colores de las ventanas o de los graficos. Para conocer el numero de la pantalla por defecto (normalmente 0):

DefaultScreen( display )

int XDefaultScreen( Display *display )

Para conocer el ID de la ventana raiz por defecto en la pantalla por defecto:

DefaultRootWindow( display )

Para conocer el ID de la ventana raiz por defecto en la pantalla especificada:

RootWindow( display, numeroPantalla )

2.8 LAB: Obtener informacion sobre el display

Escribir un programa que haga lo siguiente: Construir la conexion con el display Obtener el numero de pantalla por defecto Obtener el fabricante que proporciona el servidor Obtener la siguiente informacion de la pantalla por defecto La anchura de la pantalla La altura de la pantalla El valor de pixel para blanco El valor de pixel para negro

2.9 Cerrando el display

Para cerrar la conexion con el display se usa la siguiente funcion:

XCloseDisplay( Display *display )

XCloseDisplay cierra la conexion con el servidor de display especificado y destruye todas las ventanas, todos los IDs de los recursos creados por el programa. Este procedimiento de cierre de conexion puede cambiarse mediante XSetCloseDownMode. XCloseDisplay se llama automaticamente cuando el programa termina.

2.10 LAB: solución


#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>

main()
{
    Display *d;
    char *vendedor;
    int pantalla, anchura, altura;
    unsigned long blanco, negro;

    d = XOpenDisplay( NULL );

    pantalla = DefaultScreen( d );

    vendedor = ServerVendor( d );
    anchura  = DisplayWidth( d, pantalla );
    altura  = DisplayHeight( d, pantalla );
    blanco  = WhitePixel( d, pantalla );
    negro = BlackPixel( d, pantalla );
 
    printf( '= %s', vendedor );
    printf( '= %d', pantalla );
    printf( '= %d', anchura );
    printf( '= %d', altura );
    printf( '= %u', blanco );
    printf( '= %u', negro );
    printf( ');
}


Previous Next Table of Contents