XCB
XCB | |
---|---|
Logo | |
Entwickler | Jamey Sharp, Josh Triplett, Bart Massey |
Aktuelle Version | 1.11 (1. August 2014<ref>http://lists.x.org/archives/xorg-announce/2014-August/002469.html</ref>) |
Betriebssystem | POSIX |
Kategorie | X-Window Kernprotokoll Entwicklerbibliothek |
Lizenz | MIT |
Deutschsprachig | nein |
xcb.freedesktop.org |
XCB (X C Binding) ist eine Programmbibliothek, die auf einfache und direkte Weise Transaktionen des X-Window-Protokolls über Funktionsaufrufe in der Programmiersprache C zur Verfügung stellt.<ref>Bart Massey,J amey Sharp: XCB: An X Protocol C Binding. (PDF; 53 kB) 19. September 2001 (englisch)</ref> Damit versucht sie, die bisherige Xlib durch eine leichtgewichtigere Bibliothek zu ersetzen.
Mittlerweile ist mit Xlib/XCB eine Xlib erhältlich, deren Transportschicht durch XCB ersetzt wurde. Durch die mit der herkömmlichen Xlib binär kompatible Schnittstelle kann es von bestehenden Programmen anstelle der herkömmlichen Xlib verwendet werden.
Inhaltsverzeichnis
Ziele
XCB strebt folgende Ziele an:
- kleiner und weniger komplex
- direkter Zugriff auf das X11-Protokoll
- asynchron, um nebenläufige Programme besser zu unterstützen
- leicht zu erweitern
Beispiel
Während in Xlib bzw. in Xlib/XCB die Ereignisschleife immer noch in Xlib-Funktionsaufrufen gemacht wird, sieht man hier ein Programmstück ohne Xlib-Aufrufe. Die Aufrufe sind etwas systemnaher, als man es von Xlib gewohnt ist.
<syntaxhighlight lang="c">
/* einfache XCB-Applikation, die ein Rechteck in ein Fenster zeichnet. Kompilierbar beispielsweise mit: gcc -o xcbtest xcbtest.c -lxcb */
#include <xcb/xcb.h> #include <stdio.h> #include <stdlib.h>
int main() { 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 };
/* Verbindung zum X-Server öffnen */ if((c = xcb_connect(NULL,NULL)) == NULL) { printf("Cannot open display\n"); exit(1); } /* get the first screen */ s = xcb_setup_roots_iterator( xcb_get_setup(c) ).data;
/* schwarzen Grafikkontext erzeugen */ 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);
/* Fenster erzeugen */ 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);
/* Anzeigen (einblenden, "map") des Fensters */ xcb_map_window(c, w);
xcb_flush(c);
/* event loop, Ereignisschleife */ 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: /* beenden, wenn eine Taste gedrückt wird */ done = 1; break; } free(e); } /* Verbindung zum X-Server trennen */ xcb_disconnect(c);
return 0; }
</syntaxhighlight>
Weblinks
- xcb.freedesktop.org Wiki
- XCB API Referenz (englisch)
- Weitere Publikationen (englisch)
Einzelnachweise
<references />