Zum Inhalt springen

XCB

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 3. Dezember 2007 um 20:00 Uhr durch Soloturn (Diskussion | Beiträge) (Beispiel). Sie kann sich erheblich von der aktuellen Version unterscheiden.
XCB

Basisdaten

Entwickler Jamey Sharp, Josh Triplett, Bart Massey
Aktuelle Version 1.1
(4. November 2007)
Betriebssystem POSIX
Programmier­sprache C[1]
Kategorie X-Windows Kernprotokoll Entwicklerbibliothek
Lizenz MIT
deutschsprachig nein
http://xcb.freedesktop.org/

XCB (X C Binding) stellt auf einfache und direkte Weise Transaktionen des X-Windows-Protokolls über C Funktionsaufrufe zur Verfügung [2].

Mittlerweile ist mit Xlib/XCB ein Xlib erhältlich, dessen Transportschicht durch XCB ersetzt wurde. Durch die mit dem herkömmlichen Xlib binär kompatible Schnittstelle kann es von bestehenden Programmen anstatt 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 Ereignnisschleife immer noch in Xlib Funktionsaufrufen gemacht wird, sieht man hier ein Programmstück ohne Xlib Aufrufe. Die Aufrufe sind etwas systemnäher als man es von Xlib gewohnt ist.

/* einfache XCB applikation die ein rechteck in ein fenster zeichnet */

#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 mit dem server aufmache */
  c = xcb_connect(NULL,NULL);
  if (xcb_connection_has_error(c)) {
    printf("Cannot open display\n");
    exit(1);
  }
                       /* 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);

                       /* 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 beenden */
  xcb_disconnect(c);

  return 0;
}

Quellen

  1. The xcb Open Source Project on Open Hub: Languages Page. In: Open Hub. (abgerufen am 18. Juli 2018).
  2. XCB: An X Protocol C Binding, Bart Massey Jamey Sharp, 2001-09-19 (en)