XCB - XCB
| Ursprüngliche Autor (en) | Bart Massey |
|---|---|
| Entwickler | Jamey Sharp, Josh Triplett und Bart Massey |
| Erstveröffentlichung | 2001 |
| Stabile Version | 1.14 / Februar 2020
|
| Repository |
|
| Geschrieben in | C. |
| Betriebssystem | POSIX |
| Art | X11-Clientbibliothek |
| Lizenz | MIT-Lizenz |
| Webseite | xcb |
XCB ( X-Protokoll C-Language Binding ) ist eine Bibliothek, die die Clientseite des X11- Anzeigeserverprotokolls implementiert . XCB ist in der Programmiersprache C geschrieben und wird unter der MIT-Lizenz vertrieben . Das Projekt wurde 2001 von Bart Massey gestartet und soll Xlib ersetzen .
Überblick
XCB wurde als kleinerer, modernisierter Ersatz für Xlib entwickelt, zuvor die primäre C-Bibliothek für die Kommunikation mit dem X-Fenstersystem, was mit einer umfassenderen Überarbeitung der X-Implementierung in den frühen 2000er Jahren zusammenfiel. Die Hauptziele von XCB sind:
- Reduzieren Sie die Größe und Komplexität der Bibliothek
- bieten direkten Zugriff auf das X11-Protokoll
Die erforderliche Größenreduzierung wird hauptsächlich dadurch erreicht, dass der Umfang von XCB auf die Handhabung des X-Protokolls beschränkt wird und Xlib-Funktionen wie die umfangreiche Dienstprogrammbibliothek weggelassen werden, von denen viele von Anwendungen nur wenig genutzt wurden. Dies führt zu einer Reduzierung der kompilierten Bibliotheksgröße um den Faktor 30 (Stand 2004). Zu den sekundären Zielen gehört es, die C-Schnittstelle asynchron zu machen , ein besseres Multithreading zu ermöglichen und die Implementierung von Erweiterungen (über XML- Protokollbeschreibungen) zu vereinfachen .
Die Kern- und Erweiterungsprotokollbeschreibungen sind in XML , wobei ein in Python geschriebenes Programm die C-Bindungen erstellt. (Frühere Versionen verwendeten XSLT und M4 .)
Ein weiteres Ziel besteht darin, diese Protokollbeschreibungen verwenden zu können, um Protokolldokumentation, mehr Sprachbindungen und serverseitige Stubs zu erstellen.
Massey und andere haben daran gearbeitet, wichtige Teile von XCB unter Verwendung der Z-Notation formal korrekt zu beweisen . (Es ist seit langem bekannt, dass Xlib Fehler enthält.)
Xlib-Kompatibilität
Xlib / XCB bietet Kompatibilität mit binären Schnittstellen für Anwendungen mit Xlib und XCB und bietet einen inkrementellen Portierungspfad. Xlib / XCB verwendet die Protokollschicht von Xlib, ersetzt jedoch die Xlib-Transportschicht durch XCB und bietet Zugriff auf die zugrunde liegende XCB-Verbindung für die direkte Verwendung von XCB. Mit Xlib / XCB kann eine Anwendung eine einzelne Verbindung zum X- Anzeigeserver herstellen und sowohl XCB als auch Xlib verwenden, möglicherweise über eine Mischung von Bibliotheken, die für die eine oder andere entwickelt wurden.
Beispiel
// 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>
int main(void)
{
xcb_connection_t *c;
xcb_screen_t *s;
xcb_window_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 };
// open connection to the server
c = xcb_connect(NULL,NULL);
if (xcb_connection_has_error(c)) {
printf("Cannot open display\n");
exit(EXIT_FAILURE);
}
// get the first screen
s = xcb_setup_roots_iterator( xcb_get_setup(c) ).data;
// create black graphics context
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);
// create window
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);
// map (show) the window
xcb_map_window(c, w);
xcb_flush(c);
// event loop
while (!done && (e = xcb_wait_for_event(c))) {
switch (e->response_type & ~0x80) {
case XCB_EXPOSE: // draw or redraw the window
xcb_poly_fill_rectangle(c, w, g, 1, &r);
xcb_flush(c);
break;
case XCB_KEY_PRESS: // exit on key press
done = 1;
break;
}
free(e);
}
// close connection to server
xcb_disconnect(c);
exit(EXIT_SUCCESS);
}
XCB hat eine vergleichbare, aber etwas niedrigere API als Xlib , wie in diesem Beispiel zu sehen ist.
Protokollbeschreibung
Die Entwickler von XCB haben eine spezielle Schnittstellenbeschreibungssprache erfunden , um das X11-Protokoll sprachneutral zu modellieren und die Erzeugung von Bindungen an andere Programmiersprachen zu erleichtern. libxcb selbst ist als Codegenerator und winziger C-Stub von Dienstprogrammfunktionen implementiert.
Ein Beispiel:
<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>
Logo
Das XCB-Logo wurde von Gearóid Molloy, Autor des Webcomics Neko the Kitty , produziert und dem Projekt gespendet.
Andere Sprachbindungen
- XCB.pm - Perl-Modul, das Bindungen an XCB implementiert.
- xpyb - Die Python-Bindung an das X Window System mithilfe von XCB. Ab Juni 2013 wird Python 3 nicht unterstützt. Wird von freedesktop.org bereitgestellt .
- xcffib - Eine weitere Python-Bindung, die Python 2 & 3 sowie mehrere weitere X-Erweiterungen als xpyb unterstützt.
Anmerkungen
Verweise
- Massey, Bart; Sharp, Jamey (19.09.2001). "XCB: Eine X-Protokoll-C-Bindung" (PDF) . Tagungsband der XFree86 Technical Conference . Oakland, Kalifornien: USENIX . Abgerufen am 2012-03-12 .
- Massey, Bart; Bauer, Robert (2002). "X trifft Z: Überprüfung der Richtigkeit bei Vorhandensein von POSIX-Threads" . Proceedings of the FREENIX Track: 2002 USENIX Annual Technical Conference . Monterey, Kalifornien: USENIX . S. 221–234 . Abgerufen am 07.11.2008 .
- Scharf, Jamey; Massey, Bart (2002). "XCL: Eine Kompatibilitätsschicht für XCB" . Proceedings of the FREENIX Track: 2002 USENIX Annual Technical Conference . Monterey, Kalifornien: USENIX . S. 71–83 . Abgerufen am 07.11.2008 .