stringtranslate.com

Xlib

Los clientes X11 utilizan xlib para comunicarse con el servidor de visualización .

Xlib (también conocida como libX11 ) es una biblioteca cliente del protocolo X Window System escrita en el lenguaje de programación C. Contiene funciones para interactuar con un servidor X. Estas funciones permiten a los programadores escribir programas sin conocer los detalles del protocolo X.

Pocas aplicaciones utilizan Xlib directamente; en su lugar, emplean otras bibliotecas que utilizan funciones de Xlib para proporcionar kits de herramientas de widgets :

Xlib apareció alrededor de 1985, [ cita requerida ] y se utiliza en GUI para muchos sistemas operativos tipo Unix . En 2007 se introdujo una nueva implementación de Xlib utilizando XCB . [2]

Tipos de datos

El papel de KMS (configuración del modo kernel), ejemplo de Linux

Los principales tipos de datos en Xlib son la estructura Display[3] y los tipos de identificadores.

De manera informal, una pantalla es un dispositivo físico o virtual donde se realizan operaciones gráficas. La Displayestructura de la biblioteca Xlib contiene información sobre la pantalla, pero más importante aún, contiene información relativa al canal entre el cliente y el servidor. Por ejemplo, en un sistema operativo tipo UnixDisplay , la estructura contiene el identificador de archivo del socket de este canal (esto se puede recuperar mediante la ConnectionNumbermacro). La mayoría de las funciones Xlib tienen una Displayestructura como argumento porque operan en el canal o son relativas a un canal específico. En particular, todas las funciones Xlib que interactúan con el servidor necesitan esta estructura para acceder al canal. Algunas otras funciones necesitan esta estructura, incluso si operan localmente, porque operan sobre datos relativos a un canal específico. Las operaciones de este tipo incluyen, por ejemplo, operaciones en la cola de eventos, que se describe a continuación.

Las ventanas, los mapas de colores, etc. son administrados por el servidor, lo que significa que los datos sobre su implementación real se almacenan en el servidor. El cliente opera sobre estos objetos utilizando sus identificadores . El cliente no puede operar directamente sobre un objeto, sino que solo puede solicitar al servidor que realice la operación especificando el identificador del objeto.

Los tipos Windows, Pixmap, Font, Colormap, etc. son todos identificadores, que son números enteros de 32 bits (como en el propio protocolo X11). Un cliente "crea" una ventana solicitando que el servidor cree una ventana. Esto se hace mediante una llamada a una función Xlib que devuelve un identificador para la ventana, es decir, un número. Este identificador puede ser utilizado por el cliente para solicitar al servidor otras operaciones en la misma ventana.

Los identificadores son exclusivos del servidor. La mayoría de ellos pueden ser utilizados por diferentes aplicaciones para hacer referencia a los mismos objetos. Por ejemplo, dos aplicaciones que se conectan con el mismo servidor utilizan el mismo identificador para hacer referencia a la misma ventana. Estas dos aplicaciones utilizan dos canales diferentes y, por lo tanto, tienen dos estructuras de visualización diferentes ; sin embargo, cuando solicitan operaciones sobre el mismo identificador, estas operaciones se realizarán sobre el mismo objeto.

Protocolo y eventos

Las funciones Xlib que envían peticiones al servidor normalmente no envían estas peticiones inmediatamente sino que las almacenan en un buffer, llamado buffer de peticiones . El término petición en este caso se refiere a la petición del cliente que se dirige al servidor: el buffer de peticiones puede contener todo tipo de peticiones al servidor, no sólo las que tienen un efecto visible en la pantalla. Se garantiza que el buffer de peticiones se vacíe (es decir, todas las peticiones realizadas hasta el momento se envían al servidor) después de una llamada a las funciones XSynco XFlush, después de una llamada a una función que devuelve un valor del servidor (estas funciones se bloquean hasta que se recibe la respuesta), y en algunas otras condiciones.

Xlib almacena los eventos recibidos en una cola. La aplicación cliente puede inspeccionar y recuperar eventos de la cola. Mientras que el servidor X envía eventos de forma asincrónica, las aplicaciones que utilizan la biblioteca Xlib deben llamar explícitamente a las funciones de Xlib para acceder a los eventos en la cola. Algunas de estas funciones pueden bloquearse; en este caso, también vacían el búfer de solicitudes.

En cambio, los errores se reciben y tratan de forma asincrónica: la aplicación puede proporcionar un controlador de errores que se llamará siempre que se reciba un mensaje de error del servidor.

No se garantiza que el contenido de una ventana se conserve si la ventana o una de sus partes se vuelven invisibles. En este caso, se envía un Exposeevento a la aplicación cuando la ventana o una parte de ella se vuelve visible nuevamente. La aplicación debe dibujar nuevamente el contenido de la ventana.

Funciones

Las funciones de la biblioteca Xlib se pueden agrupar en:

  1. operaciones sobre la conexión ( XOpenDisplay, XCloseDisplay, ...);
  2. solicitudes al servidor, incluidas solicitudes de operaciones ( XCreateWindow, XCreateGC,...) y solicitudes de información ( XGetWindowProperty, ...); y
  3. operaciones que son locales para el cliente: operaciones en la cola de eventos ( XNextEvent, XPeekEvent, ...) y otras operaciones en datos locales ( XLookupKeysym, XParseGeometry, XSetRegion, XCreateImage, XSaveContext, ...)

Ejemplo

Aplicación Xlib sencilla que dibuja un cuadro y texto en una ventana. Sin decoraciones del administrador de ventanas .
Aplicación Xlib sencilla que dibuja un cuadro y texto en una ventana. Con decoraciones del gestor de ventanas IceWM .

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

/*  Aplicación Xlib simple para crear una ventana y dibujar un cuadro en ella.  gcc input.c -o output -lX11 */ #include <X11/Xlib.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main ( void ) { Display * display ; Window window ; XEvent event ; char * msg = "¡Hola, mundo!" ; int s ; // abrir conexión con el servidor display = XOpenDisplay ( NULL ); if ( display == NULL ) { fprintf ( stderr , "No se puede abrir display \n " ); exit ( 1 ); } s = DefaultScreen ( display ); // crear ventana window = XCreateSimpleWindow ( display , RootWindow ( display , s ), 10 , 10 , 200 , 200 , 1 , BlackPixel ( display , s ), WhitePixel ( display , s )); // seleccionar el tipo de eventos que nos interesan XSelectInput ( display , window , ExposureMask | KeyPressMask ); // mapear (mostrar) la ventana XMapWindow ( display , window ); // bucle de eventos for ( ;;) { XNextEvent ( display , & event ) ; // dibujar o redibujar la ventana if ( event.type == Expose ) { XFillRectangle ( display , window , DefaultGC ( display , s ), 20,20,10,10 ) ;                                                                                       XDrawString ( display , window , DefaultGC ( display , s ), 50,50 , msg , strlen ( msg ) ); } // salir al presionar una tecla if ( event.type == KeyPress ) break ; } // cerrar la conexión con el servidor XCloseDisplay ( display ) ; return 0 ; }                      

El cliente crea una conexión con el servidor llamando a XOpenDisplay. A continuación, solicita la creación de una ventana con XCreateSimpleWindow. Se necesita una llamada independiente a XMapWindowpara mapear la ventana, es decir, para hacerla visible en la pantalla.

El cuadrado se dibuja llamando a XFillRectangle. Esta operación solo se puede realizar después de crear la ventana. Sin embargo, realizarla una vez puede no ser suficiente. De hecho, no siempre se garantiza que se conserve el contenido de la ventana. Por ejemplo, si se cubre la ventana y luego se descubre nuevamente, es posible que sea necesario volver a dibujar su contenido. El programa recibe un evento que informa que la ventana o una parte de ella debe dibujarse Expose.

Por lo tanto, el dibujo del contenido de la ventana se realiza dentro del bucle que maneja los eventos . Antes de entrar en este bucle, se seleccionan los eventos que interesan a la aplicación, en este caso con XSelectInput. El bucle de eventos espera un evento entrante: si este evento es una pulsación de tecla, la aplicación sale; si es un evento de exposición, se dibuja el contenido de la ventana. La función XNextEventbloquea y vacía el búfer de solicitud si no hay ningún evento en la cola.

Otras bibliotecas

Xlib no ofrece compatibilidad con botones, menús, barras de desplazamiento, etc. Dichos widgets los proporcionan otras bibliotecas, que a su vez utilizan Xlib. Existen dos tipos de bibliotecas de este tipo:

Las aplicaciones que utilizan cualquiera de estas bibliotecas de widgets normalmente especifican el contenido de la ventana antes de ingresar al bucle principal y no necesitan manejar Exposeeventos explícitamente ni redibujar el contenido de la ventana.

La biblioteca XCB es una alternativa a Xlib. Sus dos objetivos principales son la reducción del tamaño de la biblioteca y el acceso directo al protocolo X11. Se ha producido una modificación de Xlib para utilizar XCB como capa de bajo nivel.

Referencias

  1. ^ Alan Coopersmith. «[ANUNCIO] libX11 1.8.10» . Consultado el 29 de julio de 2024 .
  2. ^ "Notas del XDC2007". 9 de febrero de 2007.
  3. ^ "Estructura de visualización en CVS de freedesktop". Sugerencia de búsqueda: typedef struct _XDisplay Display .

Enlaces externos