XCB


aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
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.

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

Einzelnachweise

<references />