Diferencia entre revisiones de «Xlib»

De Wikipedia, la enciclopedia libre
Contenido eliminado Contenido añadido
m Revertidos los cambios de Shooke (disc.) a la última edición de Alexbot
Línea 1: Línea 1:
[[Archivo:X-client-libraries.svg|frame|Xlib y otras bibliotecas que la utilizan.]]
== Bibliografía ==
'''Xlib''' son un conjunto de funciones y [[macros]] realizadas en [[C (lenguaje de programación)|C]] y utilizadas por un 'cliente' como el interfaz con la versión 11 de [[X Window System]]. En resumen, es un interfaz de programación de bajo nivel para X. Xlib esta basada en la filosofía de eventos (o mensajes). La [[biblioteca (programación)|biblioteca]] apareció alrededor del 1985. Algunas aplicaciones utilizan directamente Xlib, sin embargo es muy común que se utilicen bibliotecas que a la vez la utilizan, entre ellas se encuentran:


* [[Intrinsics]] (Xt)
*{{cita libro |autor=[http://www.oreillynet.com/pub/au/267 Adrian Nye]|editor= |otros= |título=The Definitive Guide oto the X Window System Volume Two: Xlib Reference Manual for Version 11 |url=http://www.archive.org/details/xlibrefmanv115ed02nyemiss|edición=5 |año=1990 |mes=Julio |editorial=O'Reilly & Associated, Inc. |ubicación=Internet Archive |idioma=inglés |isbn=0-937175-12-9 |páginas=765 |cita=[http://oreilly.com/openbook/ Libro completo donado a Internet Archive]}}
* [[Xaw]]
* [[Motif]]
* [[GTK+]]
* [[Qt (biblioteca)|Qt]] (versión para X11)
* [[Tk]]

Xlib proporciona un método relativamente sencillo para realizar peticiones de protocolo X al servidor. Incluye funciones para realizar más livianamente las tareas más frecuentes, permitiendo al programador no usar el protocolo X para dichas tareas. Proporciona rutinas para facilitar la labor de crear y manipular recursos básicos (ventanas, contextos gráficos,...), el dibujo de elementos gráficos (botones, líneas,...) o generar la entrada y salida de texto, entre otros.

== Características de las funciones de Xlib ==


Proporcionan a una aplicación la posibilidad de: abrir una presentación X, crear ventanas y escribir en ellas, recuperar eventos y cerrar la presentación.

Casi todas las funciones se ejecutan de forma asíncrona, son peticiones enviadas a un buffer de salida. Si queremos trabajar de modo síncrono se necesitará de Xsync tras la función de Xlib que queramos ejecutar de modo síncrono.


==== Archivos de encabezados ====

'''Ficheros de encabezado mínimos:'''
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>

==== Convenios de nombres de funciones y estructura de datos ====

===== Funciones y Macros =====
Se encadenan palabras, la primera letra de cada una de ellas en mayúsculas. Ejemplo: NumeroDias.
El nombre de las funciones empiezan con X mayúsculas. El nombre de las macros jamás lo hace.
===== Símbolos externos de X =====
''Variables:'' en minúsculas. Los nombres compuestos se separan con el símbolo ‘_’

''Macros:'' sólo mayúsculas

===== Órdenes de los argumentos en las llamadas a funciones =====
'''1º- Presentación.''' El argumento Display, si aparece, siempre es el primero en la lista de los argumentos.

'''2º- Ventanas, fuentes y otros recursos X.''' El contexto Gráfico siempre va detrás de todos los de este tipo.

'''3º- Fuente y destino.''' Algunas funciones toman algo de uno o más argumentos (fuentes), y depositan el resultado en otros (destino). Las fuentes van antes del destino.

'''4º- x, y anchura y altura.''' (x, y son las coordenadas) El orden de aparición es tal cual se muestra.

'''5º- Máscara de bits.''' Para cambiar algún miembro de la estructura se debe utilizar una máscara de bits. Si una función tiene una máscara de bits como argumento, la máscara precede al puntero de la estructura.

== Interacción con el Protocolo X ==


El protocolo X tiene una arquitectura cliente/servidor.
Se pueden transferir cuatro tipos de paquetes mediante este protocolo:

'''1-. Peticiones:''' el cliente solicita algo al servidor.

'''2-. Réplicas:''' las envía el servidor al cliente para responderle a determinadas peticiones.

'''3-. Eventos:''' el servidor se los envía al cliente y el cliente indicará para cada ventana que eventos quieren recibir.

'''4-. Errores:''' los envía el servidor


Casi todas las rutinas en Xlib son peticiones. Xlib encola dichas peticiones con lo que el cliente puede continuar ejecutándose. Esto se debe a que la gran parte de las llamadas a Xlib no requieren de una respuesta inmediata. Si hay algún problema: buffer lleno, petición de evento,… las peticiones que quedarán en el buffer y no se enviarán al servidor.


Xlib '''envía el buffer''' al completo en las siguientes situaciones:

1º- Cuando una aplicación llama a una rutina que espera un evento y la cola de eventos no contiene ninguno del tipo que se solicitó

2º- En los caso de las rutinas Query, Fetch o Get. Pues se requiere la información del servidor inmediatamente.

3º- Se envía manualmente el buffer con: Xflush (Display *d) (vacía el buffer de peticiones y las envía al servidor) o Xsync (Display *d Bool discardEvents) (vacía el buffer de salida y espera a que las peticiones sean atendidas por el servidor X)


== Errores ==
Hay funciones en Xlib que devuelven un entero (resourceID), este referencia a objetos del servidor X (Window, Font, Pixmap, Colormap, Cursor y Gcontext)

Hay funciones que devuelven un entero, si se encuentra a cero puede considerarse un error.

== Funciones ==
Las funciones de la biblioteca Xlib pueden agruparse en:

# operaciones de conexión (<code>XOpenDisplay</code>, <code>XCloseDisplay</code>, ...);
# requerimientos al servidor, incluyendo requerimientos para operaciones (<code>XCreateWindow</code>, <code>XCreateGC</code>,...) y requerimientos de información (<code>XGetWindowProperty</code>, ...); y
# operaciones del cliente: de eventos (<code>XNextEvent</code>, <code>XPeekEvent</code>, ...) y otras operaciones de datos locales (<code>XLookupKeysym</code>, <code>XParseGeometry</code>, <code>XSetRegion</code>, <code>XCreateImage</code>, <code>XSaveContext</code>, ...)

== Ejemplo ==
El siguiente programa crea una ventana con un pequeño cuadrado negro dentro:

<source lang=C>
/*
Aplicación simple que usa Xlib, una ventana con un vuadrado negro en su interior
*/

#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
Display *d;
Window w;
XEvent e;
char *msg = "¡Hola, Mundo!";
int s;

/* abrir la conexión con el servidor gráfico*/
d = XOpenDisplay(NULL);
if (d == NULL) {
fprintf(stderr, "No se pudo conectar al servidor gráfico\n");
exit(1);
}

s = DefaultScreen(d);

/* crea la ventana */
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
BlackPixel(d, s), WhitePixel(d, s));

/* selecciona la clase de eventos que interesan */
XSelectInput(d, w, ExposureMask | KeyPressMask);

/* muestra la ventana */
XMapWindow(d, w);

/* lazo de eventos */
while (1) {
XNextEvent(d, &e);
/* dibujar o redibujar la ventana */
if (e.type == Expose) {
XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg));
}
/* salir si se presionó una tecla */
if (e.type == KeyPress)
break;
}

/* cerrar la conexión al servidor gráfico */
XCloseDisplay(d);

return 0;
}
</source>

El cliente crea una conexión con el servidor llamando a la función <code>XOpenDisplay</code>. Luego pide la creación de la ventana con <code>XCreateSimpleWindow</code>. Una llamada más, a <code>XMapWindow</code>, se necesita para mapear la ventana en la pantalla, es decir para que sea visible.

El cuadrado se dibuja llamando a <code>XFillRectangle</code>. Esta operación solo puede realizarse cuando la ventana se crea. Sin embargo una vez realizado esto no es suficiente, de hecho, el contenido de la ventana no siempre está garantizado que se preserve. Por ejemplo, si la ventanta es cubierta o descubierta, se necesita que su contenido sea redibujado. El programa está informado de que la ventana o parte de ella debe dibujarse o redibujarse mediante la recepción de un evento <code>Expose</code>.

El redibujado del contenido está dentro de un lazo para eventos. Antes que entre a este lazo, se establece la clase de eventos de la aplicación, en este caso se realiza con la llamada a <code>XSelectInput</code>. El lazo de evento espera por la llegada de un evento: si el evento es una tecla presionada, la aplicación termina; si el evento es ''Expose'', se redibuja el contenido de la ventana. La función <code>XNextEvent</code> bloquea y vuelca el buffer requerido si no hay ningún evento en la cola.

== Problemas ==

Xlib provee lo fundamental para interactuar con el servidor X, pero utilizar sólo Xlib puede llegar a ser muy complicado. Por ello, se han ido construyendo interfaces de más alto nivel como: [[Xt]] (X Toolkit) y sus derivados ([[Motif]] y [[Xaw]]), [[Qt]] o [[Gtk]].

La biblioteca de [[XCB]] es una posible alternativa a Xlib. XCB cuenta con una biblioteca más reducida, Xlib incluye muchas funciones aunque estas no se utilicen en muchos casos.

== Bibliografía ==
*N.Adrian. Xlib Programming Manual for Version 11. X Window System. Vol 1. O'Reilly and ASS, 1992.
*N.Adrian. Xlib Programming Manual for Version 11. X Window System. Vol 1. O'Reilly and ASS, 1992.
*Barkakati, Naba. Los secretos de LINUX. Anaya Multimedia, 1997.
*Barkakati, Naba. Los secretos de LINUX. Anaya Multimedia, 1997.

== Enlaces externos ==
''' Referencias y Manuales en Inglés'''
*[http://tronche.com/gui/x/xlib/ Manual de programación con Xlib]
*[http://www.sbin.org/doc/Xlib/ Manual de programación con Xlib]
*[http://en.wikipedia.org/wiki/Xlib Artículo Wikipedia en Inglés]
*[http://www.linuxshowcase.org/2001/full_papers/massey/massey.pdf Artículo sobre xLib y XCB]

''' Referencias y Manuales en Español'''

*[http://decsai.ugr.es/~acu/NTP/archivos/transxlib.pdf Texto sobre XWindow System y Xlib (enlace roto)]
*[http://www.humbertocervantes.net/homepage/itzamna/TUTORIAL/tutorial.html Tutoríal de programación]
*[http://www.sromero.org/articulos/xwin/ Artículos sobre X Window System]
*[http://www.lsi.us.es/cursos/xlib.html Programación en X Window System]

[[Categoría:Bibliotecas gráficas]]
[[Categoría:Bibliotecas de C]]
[[Categoría:Software libre]]

[[en:Xlib]]
[[fi:Xlib]]
[[fr:Xlib]]
[[ja:Xlib]]
[[pl:Xlib]]
[[ru:Xlib]]
[[zh:Xlib]]

Revisión del 17:25 12 jul 2009

Xlib y otras bibliotecas que la utilizan.

Xlib son un conjunto de funciones y macros realizadas en C y utilizadas por un 'cliente' como el interfaz con la versión 11 de X Window System. En resumen, es un interfaz de programación de bajo nivel para X. Xlib esta basada en la filosofía de eventos (o mensajes). La biblioteca apareció alrededor del 1985. Algunas aplicaciones utilizan directamente Xlib, sin embargo es muy común que se utilicen bibliotecas que a la vez la utilizan, entre ellas se encuentran:

Xlib proporciona un método relativamente sencillo para realizar peticiones de protocolo X al servidor. Incluye funciones para realizar más livianamente las tareas más frecuentes, permitiendo al programador no usar el protocolo X para dichas tareas. Proporciona rutinas para facilitar la labor de crear y manipular recursos básicos (ventanas, contextos gráficos,...), el dibujo de elementos gráficos (botones, líneas,...) o generar la entrada y salida de texto, entre otros.

Características de las funciones de Xlib

Proporcionan a una aplicación la posibilidad de: abrir una presentación X, crear ventanas y escribir en ellas, recuperar eventos y cerrar la presentación.

Casi todas las funciones se ejecutan de forma asíncrona, son peticiones enviadas a un buffer de salida. Si queremos trabajar de modo síncrono se necesitará de Xsync tras la función de Xlib que queramos ejecutar de modo síncrono.


Archivos de encabezados

Ficheros de encabezado mínimos:

  1. include <X11/Xlib.h>
  2. include <X11/Xutil.h>
  3. include <X11/Xos.h>

Convenios de nombres de funciones y estructura de datos

Funciones y Macros

Se encadenan palabras, la primera letra de cada una de ellas en mayúsculas. Ejemplo: NumeroDias. El nombre de las funciones empiezan con X mayúsculas. El nombre de las macros jamás lo hace.

Símbolos externos de X

Variables: en minúsculas. Los nombres compuestos se separan con el símbolo ‘_’

Macros: sólo mayúsculas

Órdenes de los argumentos en las llamadas a funciones

1º- Presentación. El argumento Display, si aparece, siempre es el primero en la lista de los argumentos.

2º- Ventanas, fuentes y otros recursos X. El contexto Gráfico siempre va detrás de todos los de este tipo.

3º- Fuente y destino. Algunas funciones toman algo de uno o más argumentos (fuentes), y depositan el resultado en otros (destino). Las fuentes van antes del destino.

4º- x, y anchura y altura. (x, y son las coordenadas) El orden de aparición es tal cual se muestra.

5º- Máscara de bits. Para cambiar algún miembro de la estructura se debe utilizar una máscara de bits. Si una función tiene una máscara de bits como argumento, la máscara precede al puntero de la estructura.

Interacción con el Protocolo X

El protocolo X tiene una arquitectura cliente/servidor. Se pueden transferir cuatro tipos de paquetes mediante este protocolo:

1-. Peticiones: el cliente solicita algo al servidor.

2-. Réplicas: las envía el servidor al cliente para responderle a determinadas peticiones.

3-. Eventos: el servidor se los envía al cliente y el cliente indicará para cada ventana que eventos quieren recibir.

4-. Errores: los envía el servidor


Casi todas las rutinas en Xlib son peticiones. Xlib encola dichas peticiones con lo que el cliente puede continuar ejecutándose. Esto se debe a que la gran parte de las llamadas a Xlib no requieren de una respuesta inmediata. Si hay algún problema: buffer lleno, petición de evento,… las peticiones que quedarán en el buffer y no se enviarán al servidor.


Xlib envía el buffer al completo en las siguientes situaciones:

1º- Cuando una aplicación llama a una rutina que espera un evento y la cola de eventos no contiene ninguno del tipo que se solicitó

2º- En los caso de las rutinas Query, Fetch o Get. Pues se requiere la información del servidor inmediatamente.

3º- Se envía manualmente el buffer con: Xflush (Display *d) (vacía el buffer de peticiones y las envía al servidor) o Xsync (Display *d Bool discardEvents) (vacía el buffer de salida y espera a que las peticiones sean atendidas por el servidor X)


Errores

Hay funciones en Xlib que devuelven un entero (resourceID), este referencia a objetos del servidor X (Window, Font, Pixmap, Colormap, Cursor y Gcontext)

Hay funciones que devuelven un entero, si se encuentra a cero puede considerarse un error.

Funciones

Las funciones de la biblioteca Xlib pueden agruparse en:

  1. operaciones de conexión (XOpenDisplay, XCloseDisplay, ...);
  2. requerimientos al servidor, incluyendo requerimientos para operaciones (XCreateWindow, XCreateGC,...) y requerimientos de información (XGetWindowProperty, ...); y
  3. operaciones del cliente: de eventos (XNextEvent, XPeekEvent, ...) y otras operaciones de datos locales (XLookupKeysym, XParseGeometry, XSetRegion, XCreateImage, XSaveContext, ...)

Ejemplo

El siguiente programa crea una ventana con un pequeño cuadrado negro dentro:

 /*
   Aplicación simple que usa Xlib, una ventana con un vuadrado negro en su interior
 */

 #include <X11/Xlib.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

 int main(void) {
   Display *d;
   Window w;
   XEvent e;
   char *msg = "¡Hola, Mundo!";
   int s;

                        /* abrir la conexión con el servidor gráfico*/
   d = XOpenDisplay(NULL);
   if (d == NULL) {
     fprintf(stderr, "No se pudo conectar al servidor gráfico\n");
     exit(1);
   }

   s = DefaultScreen(d);

                        /* crea la ventana */
   w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1,
                           BlackPixel(d, s), WhitePixel(d, s));

                        /* selecciona la clase de eventos que interesan */
   XSelectInput(d, w, ExposureMask | KeyPressMask);

                        /* muestra la ventana */
   XMapWindow(d, w);

                        /* lazo de eventos */
   while (1) {
     XNextEvent(d, &e);
                        /* dibujar o redibujar la ventana */
     if (e.type == Expose) {
       XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
       XDrawString(d, w, DefaultGC(d, s), 50, 50, msg, strlen(msg));
     }
                        /* salir si se presionó una tecla */
     if (e.type == KeyPress)
       break;
   }

                        /* cerrar la conexión al servidor gráfico */
   XCloseDisplay(d);

   return 0;
 }

El cliente crea una conexión con el servidor llamando a la función XOpenDisplay. Luego pide la creación de la ventana con XCreateSimpleWindow. Una llamada más, a XMapWindow, se necesita para mapear la ventana en la pantalla, es decir para que sea visible.

El cuadrado se dibuja llamando a XFillRectangle. Esta operación solo puede realizarse cuando la ventana se crea. Sin embargo una vez realizado esto no es suficiente, de hecho, el contenido de la ventana no siempre está garantizado que se preserve. Por ejemplo, si la ventanta es cubierta o descubierta, se necesita que su contenido sea redibujado. El programa está informado de que la ventana o parte de ella debe dibujarse o redibujarse mediante la recepción de un evento Expose.

El redibujado del contenido está dentro de un lazo para eventos. Antes que entre a este lazo, se establece la clase de eventos de la aplicación, en este caso se realiza con la llamada a XSelectInput. El lazo de evento espera por la llegada de un evento: si el evento es una tecla presionada, la aplicación termina; si el evento es Expose, se redibuja el contenido de la ventana. La función XNextEvent bloquea y vuelca el buffer requerido si no hay ningún evento en la cola.

Problemas

Xlib provee lo fundamental para interactuar con el servidor X, pero utilizar sólo Xlib puede llegar a ser muy complicado. Por ello, se han ido construyendo interfaces de más alto nivel como: Xt (X Toolkit) y sus derivados (Motif y Xaw), Qt o Gtk.

La biblioteca de XCB es una posible alternativa a Xlib. XCB cuenta con una biblioteca más reducida, Xlib incluye muchas funciones aunque estas no se utilicen en muchos casos.

Bibliografía

  • N.Adrian. Xlib Programming Manual for Version 11. X Window System. Vol 1. O'Reilly and ASS, 1992.
  • Barkakati, Naba. Los secretos de LINUX. Anaya Multimedia, 1997.

Enlaces externos

Referencias y Manuales en Inglés

Referencias y Manuales en Español