XCB ( X protocol C-language Binding ) es una biblioteca que implementa el protocolo de servidor de pantalla X11 del lado del cliente. XCB está escrito en el lenguaje de programación C y se distribuye bajo la licencia MIT . El proyecto fue iniciado en 2001 por Bart Massey y tiene como objetivo reemplazar a Xlib .
XCB fue diseñado como un reemplazo más pequeño y modernizado para Xlib, anteriormente la biblioteca C principal para comunicarse con el sistema de ventanas X, coincidiendo con una revisión más completa de la implementación de X que tuvo lugar a principios de la década de 2000. [2] Los principales objetivos de XCB son:
La reducción de tamaño requerida se logra principalmente restringiendo el alcance de XCB al manejo del protocolo X y omitiendo la funcionalidad de Xlib, como su extensa biblioteca de utilidades, gran parte de la cual vio poco uso por parte de las aplicaciones. Esto da como resultado una reducción de treinta veces el tamaño de la biblioteca compilada (a partir de 2004). [3] Los objetivos secundarios incluyen hacer que la interfaz C sea asíncrona , facilitando un mejor multihilo y haciendo más fácil la implementación de extensiones (a través de descripciones de protocolo XML ).
Las descripciones del protocolo principal y de extensión están en XML , con un programa escrito en Python que crea los enlaces en C. (Las versiones anteriores usaban XSLT y M4 ).
Otro objetivo es poder utilizar estas descripciones de protocolo para crear documentación de protocolo, más enlaces de lenguaje y stubs del lado del servidor.
Massey y otros han trabajado para demostrar que partes clave de XCB son formalmente correctas utilizando la notación Z. [4] (Desde hace tiempo se sabe que Xlib contiene errores. [5] )
Xlib/XCB proporciona compatibilidad de interfaz binaria de aplicación con Xlib y XCB, lo que proporciona una ruta de portabilidad incremental. [6] Xlib/XCB utiliza la capa de protocolo de Xlib, pero reemplaza la capa de transporte de Xlib con XCB y proporciona acceso a la conexión XCB subyacente para el uso directo de XCB. Xlib/XCB permite que una aplicación abra una única conexión al servidor de visualización X y utilice tanto XCB como Xlib, posiblemente a través de una mezcla de bibliotecas diseñadas para uno u otro. [7] [8]
// Aplicación XCB sencilla para abrir una ventana y dibujar un cuadro en ella// Para compilarlo usando GNU, use: // gcc xc -lxcb#incluir <stdio.h> #incluir <stdlib.h> #incluir <xcb/xcb.h> int principal ( void ) { xcb_conexión_t * c ; xcb_pantalla_t * s ; xcb_ventana_t w ; xcb_gcontext_t g ; xcb_evento_genérico_t * e ; uint32_t máscara ; uint32_t valores [ 2 ]; int hecho = 0 ; xcb_rectángulo_t r = { 20 , 20 , 60 , 60 }; // abrir conexión al servidor c = xcb_connect ( NULL , NULL ); if ( xcb_connection_has_error ( c )) { printf ( "No se puede abrir la pantalla \n " ); exit ( EXIT_FAILURE ); } // obtener la primera pantalla s = xcb_setup_roots_iterator ( xcb_get_setup ( c ) ). data ; // crear contexto de gráficos negros g = xcb_generate_id ( c ); w = s -> root ; mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES ; values [ 0 ] = s -> black_pixel ; values [ 1 ] = 0 ; xcb_create_gc ( c , g , w , mask , values ); // crear ventana w = xcb_generate_id ( c ); máscara = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK ; valores [ 0 ] = s -> píxel_blanco ; valores [ 1 ] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS ; xcb_create_window ( c , s -> profundidad_raíz , w , s -> raíz , 10 , 10 , 100 , 100 , 1 , XCB_WINDOW_CLASS_INPUT_OUTPUT , s -> raíz_visual , máscara , valores ); // mapea (muestra) la ventana xcb_map_window ( c , w ); xcb_flush ( c ); // bucle de eventos while ( ! done && ( e = xcb_wait_for_event ( c ))) { switch ( e -> response_type & ~ 0x80 ) { case XCB_EXPOSE : // dibuja o vuelve a dibujar la ventana xcb_poly_fill_rectangle ( c , w , g , 1 , & r ); xcb_flush ( c ); break ; case XCB_KEY_PRESS : // sale al presionar una tecla done = 1 ; break ; } free ( e ); } // cierra la conexión al servidor xcb_disconnect ( c ); salir ( SALIDA_EXITO ); }
La operación bit a bit elimina un bit que indica de dónde proviene el evento. [9]a->response_type & ~0x80
XCB tiene una API comparable, pero de nivel ligeramente inferior a Xlib , [10] como se puede ver con este ejemplo.
Los creadores de XCB han inventado un lenguaje de descripción de interfaz especializado para modelar el protocolo X11 de forma neutral respecto del lenguaje y facilitar la generación de enlaces a otros lenguajes de programación. [ dudoso – discutir ] libxcb en sí mismo se implementa como un generador de código y un pequeño fragmento de C de funciones de utilidad.
Un ejemplo:
<xcb header= "bigreq" extension-xname= "BIG-REQUESTS" extension-name= "BigRequests" extension-multiword= "true" major-version= "0" minor-version= "0" > < nombre de solicitud= "Habilitar" código de operación= "0" > <respuesta> < bytes de pad = "1" /> < tipo de campo = "CARD32" nombre= "longitud_máxima_de_solicitud" /> </respuesta> </solicitud> </xcb>
El logotipo de XCB fue producido por Gearóid Molloy, autor del cómic web Neko the Kitty , y donado al proyecto. [11]
Cada evento contiene un código de tipo de 8 bits. El bit más significativo de este código se establece si el evento se generó a partir de una solicitud SendEvent.
{{cite web}}
: Mantenimiento de CS1: ubicación ( enlace )