This articlerelies excessively onreferences toprimary sources. Please improve this article by addingsecondary or tertiary sources. Find sources: "XCB" – news ·newspapers ·books ·scholar ·JSTOR(November 2009) (Learn how and when to remove this message) |
![]() | |
Original author(s) | Bart Massey |
---|---|
Developer(s) | Jamey Sharp, Josh Triplett, Bart Massey |
Initial release | 2001; 24 years ago (2001) |
Stable release | |
Repository | |
Written in | C |
Operating system | POSIX |
Type | X11 client library |
License | MIT License |
Website | xcb |
XCB (X protocol C-language Binding) is alibrary implementing the client-side of theX11 display server protocol. XCB is written in theC programming language and distributed under theMIT License. The project was started in 2001 by Bart Massey and aims to replaceXlib.
XCB was designed as a smaller, modernized replacement for Xlib, previously the primary C library for communicating with the X window system, coinciding with a more complete overhaul of the X implementation that took place during the early 2000s.[2] The main goals of XCB are to:
The required size reduction is achieved primarily by restricting XCB's scope to handling the X protocol and omitting Xlib functionality such as its extensive utility library, much of which saw little use by applications. This results in a factor thirty reduction of the compiled library size (as of 2004).[3]Secondary goals include making the C interfaceasynchronous, facilitating bettermultithreading and making it easier to implement extensions (viaXML protocol descriptions).
The core and extension protocol descriptions are inXML, with a program written inPython creating the C bindings. (Previous versions usedXSLT andM4.)
A further goal is to be able to use these protocol descriptions to create protocol documentation, more language bindings, and server-side stubs.
Massey and others have worked to prove key portions of XCBformally correct usingZ notation.[4] (Xlib has long been known to contain errors.[5])
Xlib/XCB providesapplication binary interface compatibility with both Xlib and XCB, providing an incremental porting path.[6] Xlib/XCB uses the protocol layer of Xlib, but replaces the Xlib transport layer with XCB, and provides access to the underlying XCB connection for direct use of XCB. Xlib/XCB allows an application to open a single connection to the Xdisplay server and use both XCB and Xlib, possibly through a mixture of libraries designed for one or the other.[7][8]
// Simple XCB application for opening a window and drawing a box in it// To compile it using GNU, use:// gcc x.c -lxcb#include<stdio.h>#include<stdlib.h>#include<xcb/xcb.h>intmain(void){xcb_connection_t*c;xcb_screen_t*s;xcb_window_tw;xcb_gcontext_tg;xcb_generic_event_t*e;uint32_tmask;uint32_tvalues[2];intdone=0;xcb_rectangle_tr={20,20,60,60};// open connection to the serverc=xcb_connect(NULL,NULL);if(xcb_connection_has_error(c)){printf("Cannot open display\n");exit(EXIT_FAILURE);}// get the first screens=xcb_setup_roots_iterator(xcb_get_setup(c)).data;// create black graphics contextg=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);// create windoww=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);// map (show) the windowxcb_map_window(c,w);xcb_flush(c);// event loopwhile(!done&&(e=xcb_wait_for_event(c))){switch(e->response_type&~0x80){caseXCB_EXPOSE:// draw or redraw the windowxcb_poly_fill_rectangle(c,w,g,1,&r);xcb_flush(c);break;caseXCB_KEY_PRESS:// exit on key pressdone=1;break;}free(e);}// close connection to serverxcb_disconnect(c);exit(EXIT_SUCCESS);}
Thebitwise and operationa->response_type&~0x80
removes a bit that indicates where the event came from.[9]
XCB has a comparable, but slightly lower-level API thanXlib,[10] as can be seen with this example.
Creators of XCB have invented a specializedinterface description language to model X11 protocol in language-neutral way and facilitate generation of bindings to other programming languages.[dubious –discuss] libxcb itself is implemented as a code generator and a tiny C stub of utility functions.
An example:
<xcbheader="bigreq"extension-xname="BIG-REQUESTS"extension-name="BigRequests"extension-multiword="true"major-version="0"minor-version="0"><requestname="Enable"opcode="0"><reply><padbytes="1"/><fieldtype="CARD32"name="maximum_request_length"/></reply></request></xcb>
The XCB logo was produced by Gearóid Molloy, author of theweb comicNeko the Kitty, and donated to the project.[11]
Every event contains an 8-bit type code. The most significant bit in this code is set if the event was generated from a SendEvent request.
{{cite web}}
: CS1 maint: location (link)