Xlib - Xlib

Xlib
Desarrollador (es) Fundación X.Org
Versión inicial ~ 1985
Repositorio Edita esto en Wikidata
Escrito en C
Tipo Biblioteca
Sitio web www .x .org , documentación: www .x .org / releases / current / doc / libX11 / libX11 / libX11 .html
Los clientes X11 utilizan xlib para comunicarse con el servidor de visualización .

Xlib (también conocido como libX11 ) es un sistema de ventanas X cliente del protocolo de la biblioteca por escrito en el lenguaje de programación C . Contiene funciones para interactuar con una X servidor . Estas funciones permiten a los programadores escribir programas sin conocer los detalles del protocolo . Pocas aplicaciones usan Xlib directamente; más bien, emplean otras bibliotecas que usan funciones de Xlib para proporcionar kits de herramientas de widgets :

Xlib apareció alrededor de 1985 y actualmente se usa en GUI para muchos sistemas operativos similares a Unix . La biblioteca XCB es un intento de reemplazar Xlib. Si bien Xlib todavía se usa en algunos entornos, las versiones modernas del servidor X.org implementan Xlib sobre XCB .

Tipos de datos

El rol de KMS (configuración del modo de kernel), ejemplo de Linux
La pila de gráficos de Linux
Ilustra la pila de gráficos de Linux actual a partir del 24-08-2013
Esquema: interacción humana-máquina
XCB y Xlib son bibliotecas cliente que implementan un protocolo de comunicaciones del servidor de pantalla.
El lugar de ciertos módulos del kernel de Linux
El servidor de visualización se encuentra entre el kernel ( aquí: kernel de Linux ) y sus clientes. Se comunica con sus clientes a través de un protocolo determinado.
El lugar de ciertos módulos del kernel de Linux
Simple DirectMedia Layer puede eludir Xlib y escribir directamente en framebuffer . También está disponible un puerto adicional para EGL

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

De manera informal, una pantalla es un dispositivo físico o virtual donde se realizan operaciones gráficas. La Display estructura de la biblioteca Xlib contiene información sobre la pantalla, 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 similar a Unix, la Display estructura contiene el identificador de archivo del socket de este canal (esto se puede recuperar usando la ConnectionNumber macro). La mayoría de las funciones de Xlib tienen una Display estructura como argumento porque operan en el canal o en son relativas 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 color, 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, solo puede solicitar al servidor que realice la operación especificando el identificador del objeto.

Los tipos Windows , Pixmap , Font , Colormap , etc., son todos los identificadores, que son enteros de 32 bits (como en el protocolo X11 sí mismo). 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 otras operaciones en la misma ventana al servidor.

Los identificadores son únicos para el servidor. La mayoría de ellos pueden ser utilizados por diferentes aplicaciones para referirse a los mismos objetos. Por ejemplo, dos aplicaciones que se conectan con el mismo servidor utilizan el mismo identificador para referirse 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 en el mismo identificador, estas operaciones se realizarán en el mismo objeto.

Protocolo y eventos

Las funciones de 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 las 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 XSync o XFlush , después de una llamada a una función que devuelve un valor del servidor (estas funciones se bloquean hasta que 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. Mientras que el servidor X envía eventos de forma asincrónica, las aplicaciones que usan 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 al 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, a la aplicación se le envía un Expose evento cuando la ventana de una parte de la misma se vuelve a hacer visible. Se supone que la aplicación debe volver a dibujar el contenido de la ventana.

Funciones

Las funciones de la biblioteca Xlib se pueden agrupar en:

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

Ejemplo

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

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

/*
    Simple Xlib application for creating a window and drawing a box in it.
    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 = "Hello, World!";
    int s;
 
    // open connection to the server
    display = XOpenDisplay(NULL);
    if (display == NULL)
    {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }
 
    s = DefaultScreen(display);
 
    // create window
    window = XCreateSimpleWindow(display, RootWindow(display, s), 10, 10, 200, 200, 1,
                                 BlackPixel(display, s), WhitePixel(display, s));
 
    // select kind of events we are interested in
    XSelectInput(display, window, ExposureMask | KeyPressMask);
 
    // map (show) the window
    XMapWindow(display, window);
 
    // event loop
    for (;;)
    {
        XNextEvent(display, &event);
 
        // draw or redraw the window
        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));
        }
        // exit on key press
        if (event.type == KeyPress)
            break;
    }
 
    // close connection to the server
    XCloseDisplay(display);
 
    return 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 XMapWindow para mapear la ventana, es decir, para hacerla visible en la pantalla.

El cuadrado se dibuja llamando XFillRectangle . Esta operación solo se puede realizar después de que se crea 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 descubre nuevamente, es posible que sea necesario volver a dibujar su contenido. Se informa al programa que la ventana o una parte de ella tiene que ser dibujada por la recepción de un Expose evento.

Por 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 una pulsación de tecla, la aplicación se cierra; si es un evento de exposición, se dibuja el contenido de la ventana. La función XNextEvent bloquea 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. Estos widgets son proporcionados por otras bibliotecas, que a su vez usan Xlib. Hay dos tipos de bibliotecas de este tipo:

  • bibliotecas creadas sobre la biblioteca intrínseca de X Toolkit (Xt), que proporciona soporte para widgets pero no proporciona ningún widget en particular; Las bibliotecas de conjuntos de widgets que utilizan Xt proporcionan widgets específicos , como Xaw y Motif ;
  • bibliotecas que proporcionan conjuntos de widgets usando Xlib directamente, sin la biblioteca Xt, como las versiones X de GTK , Qt , FLTK y fpGUI .

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 Expose eventos explícitamente y 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

enlaces externos