XCB - XCB

XCB
Xcb logo.svg
Ursprüngliche Autor (en) Bart Massey
Entwickler Jamey Sharp, Josh Triplett und Bart Massey
Erstveröffentlichung 2001 ; vor 20 Jahren  ( 2001 )
Stabile Version
1.14 / Februar 2020 ; vor 1 Jahr  ( 2020-02 )
Repository Bearbeiten Sie dies bei Wikidata
Geschrieben in C.
Betriebssystem POSIX
Art X11-Clientbibliothek
Lizenz MIT-Lizenz
Webseite xcb .freedesktop .org
Image
X11-Clients verwenden XCB, um mit dem X-Server zu kommunizieren .
Image
Eine vollständigere Ansicht des Linux- Grafikstapels
Image
Programme verwenden häufig GTK oder FLTK oder Qt für ihre GUI-Widgets .
Image
Eine vollständigere Ansicht der Komponenten eines Betriebssystems für Heimcomputer.

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>

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

Externe Links