Articulo de referencia

XCB

Los clientes X11 utilizan XCB para comunicarse con el servidor X. Una visión más completa de la pila gráfica de Linux Los programas suelen utilizar GTK , FLTK o Qt para sus widg...

Los clientes X11 utilizan XCB para comunicarse con el servidor X.
Una visión más completa de la pila gráfica de Linux
Los programas suelen utilizar GTK , FLTK o Qt para sus widgets de interfaz gráfica de usuario (GUI) .
Una visión más completa de los componentes de un sistema operativo para ordenadores domésticos.

XCB ( X protocol C-language Binding ) es una biblioteca que implementa el lado del cliente del protocolo de servidor de visualización X11 . XCB está escrita 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 .

Descripción general

XCB fue diseñado como un reemplazo más pequeño y modernizado para Xlib, que anteriormente era la principal biblioteca C 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:

  • reducir el tamaño y la complejidad de la biblioteca
  • proporcionar acceso directo al protocolo X11

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 fue poco utilizada por las aplicaciones. Esto resulta en 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 , facilitar un mejor procesamiento multihilo y simplificar la implementación de extensiones (a través de descripciones de protocolo XML ).

Las descripciones de los protocolos principales y de extensión están en XML , y un programa escrito en Python crea las interfaces C. (Las versiones anteriores utilizaban XSLT y M4 ).

Otro objetivo es poder utilizar estas descripciones de protocolo para crear documentación de protocolo, más enlaces de lenguaje y funciones auxiliares del lado del servidor.

Massey y otros han trabajado para demostrar formalmente la corrección de partes clave de XCB utilizando la notación Z. [ 4 ] (Se sabe desde hace tiempo que Xlib contiene errores. [ 5 ] )

Compatibilidad con Xlib

Xlib/XCB proporciona compatibilidad de interfaz binaria de aplicación con Xlib y XCB, ofreciendo 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 subyacente de XCB 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 mediante una combinación de bibliotecas diseñadas para una u otra. [ 7 ] [ 8 ]

Ejemplo

// Aplicación XCB sencilla para abrir una ventana y dibujar un cuadro en ella.// Para compilarlo usando GNU, use: // gcc xc -lxcb#include <stdio.h> #include <stdlib.h> #include <xcb/xcb.h>int main ( void ) { xcb_connection_t * connection ; xcb_screen_t * screen ; xcb_window_t window ; xcb_gcontext_t context ; xcb_generic_event_t * event ; uint32_t mask ; uint32_t values ​​[ 2 ]; int done = 0 ; xcb_rectangle_t r = { 20 , 20 , 60 , 60 };// abrir conexión al servidor connection = xcb_connect ( NULL , NULL ); if ( xcb_connection_has_error ( connection )) { printf ( "No se puede abrir la pantalla \n " ); exit ( EXIT_FAILURE ); } // obtener la primera pantalla screen = xcb_setup_roots_iterator ( xcb_get_setup ( connection ) ). data ;// crear contexto de gráficos negros contexto = xcb_generate_id ( conexión ); ventana = pantalla -> raíz ; máscara = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES ; valores [ 0 ] = pantalla -> píxel_negro ; valores [ 1 ] = 0 ; xcb_create_gc ( conexión , contexto , ventana , máscara , valores );// crear ventana ventana = xcb_generate_id ( conexión ); máscara = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK ; valores [ 0 ] = pantalla -> píxel_blanco ; valores [ 1 ] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS ; xcb_create_window ( conexión , pantalla -> profundidad_raíz , ventana , pantalla -> raíz , 10 , 10 , 100 , 100 , 1 , XCB_WINDOW_CLASS_INPUT_OUTPUT , pantalla -> imagen_raíz , máscara , valores );// mapear (mostrar) la ventana xcb_map_window ( conexión , ventana );xcb_flush ( conexión );// bucle de eventos while ( ! done && ( event = xcb_wait_for_event ( connection ))) {switch ( event -> response_type & ~ 0x80 ) { case XCB_EXPOSE : // dibujar o redibujar la ventana xcb_poly_fill_rectangle ( connection , window , context , 1 , & r ); xcb_flush ( connection ); break ; case XCB_KEY_PRESS : // salir al presionar una tecla done = 1 ; break ; } free ( event ); } // cerrar la conexión con el servidor xcb_disconnect ( connection );salir ( SALIDA_ÉXITO ); }

La operación AND bit a bit elimina un bit que indica de dónde provino el evento. [ 9 ]a->response_type&~0x80

XCB tiene una API comparable, pero de nivel ligeramente inferior a la de Xlib , [ 10 ] como se puede ver en este ejemplo.

Descripción del protocolo

Los creadores de XCB han inventado un lenguaje de descripción de interfaz especializado para modelar el protocolo X11 de forma independiente del lenguaje y facilitar la generación de enlaces a otros lenguajes de programación. La propia biblioteca libxcb está implementada como un generador de código y un pequeño fragmento de código C con funciones de utilidad.

Un ejemplo:

<xcb header= "bigreq" extension-xname= "BIG-REQUESTS" extension-name= "BigRequests" extension-multiword= "true" major-version= "0" minor-version= "0" ><request name= "Enable" opcode= "0" > <reply> <pad bytes= "1" /> <field type= "CARD32" name= "maximum_request_length" /> </reply> </request> </xcb>

El logotipo de XCB fue creado por Gearóid Molloy, autor del webcómic Neko the Kitty , y donado al proyecto. [ 11 ]

Otras vinculaciones de idiomas

  • XCB.pm - Módulo Perl que implementa enlaces a XCB.
  • xpyb : la interfaz de Python para el sistema X Window mediante XCB. A fecha de junio de 2013, no es compatible con Python 3. Proporcionado por freedesktop.org .
  • xcffib : otra biblioteca de Python que admite Python 2 y 3, así como varias extensiones X adicionales en comparación con xpyb.
  • guile-xcb : módulo de Guile que implementa un lenguaje para tratar la definición xcb como código fuente.

Notas

  1. "libxcb-1.17.0" .
  2. Gettys, James; Packard, Keith (2004). La (Re)arquitectura del sistema X Window (PDF) . Actas del Simposio Linux. Vol. 1. 
  3. Sharp, Jamey (2004). Cómo se implementa Xlib (y qué estamos haciendo al respecto) (PDF) . Actas de la Conferencia Técnica Anual de Usenix, Pista Freenix.
  4. Massey y Bauer, 2002 .
  5. Sharp y Massey, 2002 , §2.4. "Si bien Xlib fue diseñado para admitir aplicaciones multihilo, y si bien esa compatibilidad no es inutilizable, existen condiciones de carrera conocidas que no pueden eliminarse sin modificar la interfaz de Xlib."
  6. Maloney, Ross J. (31 de marzo de 2018). Programación de bajo nivel para X Window: una introducción mediante ejemplos . Springer. págs. 225–244 . ISBN  978-3-319-74250-2Consultado el 17 de mayo de 2022 .
  7. "Xlib/XCB: Xlib con transporte XCB" . 11 de enero de 2008. Consultado el 11 de septiembre de 2009 .
  8. Jamey Sharp y Josh Triplett (26-11-2006). "libx11 con Xlib/XCB ahora en experimental; por favor, pruébelo con sus paquetes" . debian-devel-announce (Lista de correo) . Recuperado el 11-09-2009 .
  9. "Protocolo del sistema X Window" . X.Org . Capítulo 1. Formatos de protocolo . Consultado el 22 de marzo de 2024. 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.
  10. Jamey Sharp; Bart Massey (2002), XCL : Una capa de compatibilidad de Xlib para XCB , Conferencia Técnica Anual USENIX 2002, Pista Freenix 
  11. Logotipo de Kitty (xcb.freedesktop.org)

Referencias

  • Massey, Bart; Sharp, Jamey (19 de septiembre de 2001). "XCB: Un enlace C del protocolo X" (PDF) . Actas de la Conferencia Técnica XFree86 . Oakland, California: USENIX . Recuperado el 12 de marzo de 2012 .
  • Massey, Bart; Bauer, Robert (2002). "X Meets Z: Verifying Correctness In The Presence Of POSIX Threads" . Actas de la sesión FREENIX: Conferencia Técnica Anual USENIX 2002. Monterey, California: USENIX . págs. 221–234 . Consultado el 7 de noviembre de 2008 . 
  • Sharp, Jamey; Massey, Bart (2002). "XCL: Una capa de compatibilidad para XCB" . Actas de la sesión FREENIX: Conferencia Técnica Anual USENIX 2002. Monterey, California: USENIX . págs. 71–83 . Consultado el 7 de noviembre de 2008 . 
  • Wiki de XCB ( freedesktop.org )
  • Referencia y tutorial de la API de XCB
  • Tutorial de libxcb
  • Publicaciones adicionales
  • La guía para nuevos desarrolladores de X: Xlib y XCB