XCB
XCB (pour X C Binding) est une bibliothèque logicielle en langage C offrant une implémentation du protocole X Window System. Son objectif est de remplacer la Xlib, jugée vieillissante et inadaptée à certains usages. Le projet a démarré en 2001, sous l'impulsion de Bart Massey.
Développé par | Jamey Sharp, Josh Triplett, Bart Massey |
---|---|
Dernière version | 1.13 () |
Dépôt | gitlab.freedesktop.org/xorg/lib/libxcb |
Écrit en | C |
Système d'exploitation | GNU/Linux et BSD (d) |
Environnement | POSIX |
Type | X Window core protocol development library |
Licence | MIT |
Site web | http://xcb.freedesktop.org/ |
XCL (pour Xlib Compatibility Layer, « couche de compatibilité Xlib ») est une implémentation de l'API Xlib basée sur XCB, afin de fournir une couche de compatibilité aux applications basées sur la Xlib. Produite plus tard, la bibliothèque XLib/XCB fournit une ABI compatible aussi bien avec la Xlib qu'avec XCB, afin d'adoucir les difficultés de portage d'une bibliothèque à l'autre.
Objectifs de XCB
Les principaux objectifs de XCB sont :
- La réduction de la taille et de la complexité de la bibliothèque ;
- fournir un accès direct au protocole X11.
Les objectifs secondaires sont notamment de mettre en œuvre une interface en C complètement asynchrone, de faciliter l'amélioration du multi-threading et de rendre les extensions plus simples à implémenter (par une description des protocoles en XML).
Bart Massey a passé du temps afin de prouver que XCB est formellement correct en utilisant la notation Z (la Xlib est connue pour contenir des erreurs).
Exemple
/*
* Exemple simple avec XCB dessinant un carré dans une fenêtre
*/
#include <xcb/xcb.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
xcb_connection_t *c;
xcb_screen_t *s;
xcb_drawable_t w;
xcb_gcontext_t g;
xcb_generic_event_t *e;
uint32_t mask;
uint32_t values[2];
int done = 0;
xcb_rectangle_t r = { 20, 20, 60, 60 };
/* ouvre la connexion avec le serveur */
c = xcb_connect (NULL, NULL);
if (xcb_connection_has_error(c)) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}
/* récupérer le premier écran */
s = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
/* créer un contexte graphique pour le noir */
g = xcb_generate_id (c);
w = s->root;
mask = XCB_GC_FOREGROUND | XCB_GRAPHICS_EXPOSURE;
values[0] = s->black_pixel;
values[1] = 0;
xcb_create_gc (c, g, w, mask, values);
/* créer une fenêtre */
w = xcb_generate_id (c);
mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
values[0] = s->white_pixel;
values[1] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS;
xcb_create_window (c, s->root_depth, w, s->root,
10, 10, 100, 100, 1,
XCB_WINDOW_CLASS_INPUT_OUTPUT, s->root_visual,
mask, values);
/* afficher la fenêtre sur l'écran sélectionné */
xcb_map_window (c, w);
xcb_flush (c);
/* boucle événementielle */
while (!done && (e = xcb_wait_for_event(c))) {
switch (e->response_type & ~0x80) {
case XCB_EXPOSE: /* dessiner ou redessiner la fenêtre */
xcb_poly_fill_rectangle(c, w, g, 1, &r);
xcb_flush(c);
break;
case XCB_KEY_PRESS: /* stopper la boucle lorsqu'une touche est enfoncée */
done = 1;
break;
}
free(e);
}
/* fermer la connexion avec le serveur */
xcb_disconnect (c);
return 0;
}
Cet exemple illustre la similarité entre XCB et la Xlib. Certains programmeurs considèrent toutefois que XCB est légèrement plus bas niveau que la Xlib à l'heure actuelle.[réf. souhaitée]
Voir aussi
Articles connexes
Références
- (en) XCB: An X Protocol C Binding (PDF) (Bart Massey et Jamey Sharp, , présenté à la XFree86 Technical Conference en 2001) ;
- (en) XCL: An Xlib Compatibility Layer For XCB (Jamey Sharp et Bart Massey, , présenté à USENIX 2002) ;
- (en) X Meets Z: Verifying Correctness In The Presence Of POSIX Threads (Bart Massey et Robert Bauer, , présenté à USENIX 2002).
Liens externes
- (en) Wiki XCB (freedesktop.org) ;
- (en) Manuel de référence de l'API XCB ;
- (en) Autres publications.
- Portail des logiciels libres