stringtranslate.com

xlib

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

Xlib (también conocido como libX11 ) es una biblioteca cliente de protocolo del sistema X Window 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; más bien, emplean otras bibliotecas que utilizan funciones Xlib para proporcionar kits de herramientas de widgets :

Xlib apareció alrededor de 1985, [ cita necesaria ] y se utiliza en GUI para muchos sistemas operativos tipo Unix . En 2007 se introdujo una reimplementació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 visualización, pero lo más importante es que 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 usando la ConnectionNumbermacro). La mayoría de las funciones Xlib tienen una Displayestructura como argumento porque operan en el canal o son relativos a un canal específico. En particular, todas las funciones de 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 con datos relativos a un canal específico. Las operaciones de este tipo incluyen, por ejemplo, operaciones en la cola de eventos, que se describen a continuación.

Windows, mapas de colores, etc. son administrados por el servidor, lo que significa que todos 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, solo puede solicitar al servidor que realice la operación especificando el identificador del objeto.

Los tipos Windows, Pixmap, Font, Colormapetc. 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. El cliente puede utilizar este identificador para solicitar al servidor otras operaciones en la misma ventana.

Los identificadores son únicos para el 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 soliciten operaciones sobre el mismo identificador, estas operaciones se realizarán sobre el mismo objeto.

Protocolo y eventos

Las funciones Xlib que envían solicitudes al servidor generalmente no envían estas solicitudes inmediatamente, sino que las almacenan en un búfer, llamado búfer de solicitudes . El término solicitud en este caso se refiere a la solicitud del cliente que se dirige al servidor: el búfer de solicitudes puede contener todo tipo de solicitudes al servidor, no solo aquellas que tienen un efecto visible en la pantalla. Se garantiza que el búfer de solicitudes se vaciará (es decir, todas las solicitudes 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 la respuesta se recibe), 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. Si bien el servidor X envía eventos de forma asíncrona, las aplicaciones que utilizan la biblioteca Xlib deben llamar explícitamente a las funciones 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á cada vez 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 no se hacen visibles. En este caso, la aplicación recibe un Exposeevento cuando la ventana o una parte de ella vuelve a ser visible. Luego se supone que la aplicación vuelve a dibujar 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 sobre 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 administrador de ventanas IceWM .

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

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

El cliente crea una conexión con el servidor llamando XOpenDisplay. Luego solicita la creación de una ventana con XCreateSimpleWindow. Es necesaria una llamada separada 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, realizarlo una vez puede no ser suficiente. De hecho, no siempre se garantiza la conservación del contenido de la ventana. Por ejemplo, si la ventana se cubre y luego se vuelve a descubrir, es posible que sea necesario volver a dibujar su contenido. Se informa al programa que la ventana o una parte de ella debe ser dibujada por la recepción de un Exposeevento.

Por lo tanto, el dibujo del contenido de la ventana se realiza dentro del bucle que gestiona 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 presionar una 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 solicitudes si no hay ningún evento en la cola.

Otras bibliotecas

Xlib no proporciona soporte para botones, menús, barras de desplazamiento, etc. Dichos widgets los proporcionan otras bibliotecas, que a su vez utilizan Xlib. Hay 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 volver a dibujar el contenido de la ventana.

La biblioteca XCB es una alternativa a Xlib. Sus dos objetivos principales son: reducción del tamaño de la biblioteca y 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 de XDC2007". 9 de febrero de 2007.
  3. ^ "Estructura de visualización en CVS de escritorio gratuito". Consejo de búsqueda para: typedef struct _XDisplay Display .

enlaces externos