XCB

XCB
Tiedot
Ohjelmistotyyppi kirjasto
Ohjelmointikielet C
Lisenssi X11-lisenssi
Aiheesta muualla
Verkkosivusto

XCB (X protocol C-language Binding) on kirjasto, joka on suunniteltu korvaajaksi Xlib-kirjastolle. XCB:n tavoitteina ovat pieni koko, suora pääsy protokollaan, latenssin piilottaminen, parempi tuki säikeistykselle ja laajennettavuus. XCB käyttää XML-pohjaista kuvausta X11-protokollasta.

Xlib-kirjastoa ei aikoinaan suunniteltu monisäkeisien ohjelmien käyttöön ja suuri osa toiminnoista on saatavilla järjestelmä- ja työkalukirjastoissa. Tämän johdosta sille aloitettiin yksinkertaisempi korvaaja XCB. Koska XCB:n ohjelmointirajapinta ei ole yhteensopiva Xlibin kanssa sille tehtiin XCL-yhteensopivuuskerros (Xlib Compatibility Layer), jonka on tarkoitus olla ABI-yhteensopiva Xlibin kanssa.

Esimerkki

Esimerkki XCB-rajapinnan käytöstä.

// 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    *connection;
  xcb_screen_t        *screen;
  xcb_window_t         window;
  xcb_gcontext_t       context;
  xcb_generic_event_t *event;
  uint32_t             mask;
  uint32_t             values[2];
  int                  done = 0;
  xcb_rectangle_t      r = { 20, 20, 60, 60 };

  // open connection to the server
  connection = xcb_connect(NULL, NULL);
  if (xcb_connection_has_error(connection)) {
    printf("Cannot open display\n");
    exit(EXIT_FAILURE);
  }
  // get the first screen
  screen = xcb_setup_roots_iterator( xcb_get_setup(connection) ).data;

  // create black graphics context
  context = xcb_generate_id(connection);
  window = screen->root;
  mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
  values[0] = screen->black_pixel;
  values[1] = 0;
  xcb_create_gc(connection, context, window, mask, values);

  // create window
  window = xcb_generate_id(connection);
  mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
  values[0] = screen->white_pixel;
  values[1] = XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS;
  xcb_create_window(connection, screen->root_depth, window, screen->root,
                    10, 10, 100, 100, 1,
                    XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
                    mask, values);

  // map (show) the window
  xcb_map_window(connection, window);

  xcb_flush(connection);

  // event loop
  while (!done && (event = xcb_wait_for_event(connection))) {

    switch (event->response_type & ~0x80) {
    case XCB_EXPOSE:    // draw or redraw the window
      xcb_poly_fill_rectangle(connection, window, context,  1, &r);
      xcb_flush(connection);
      break;
    case XCB_KEY_PRESS:  // exit on key press
      done = 1;
      break;
    }
    free(event);
  }
  // close connection to server
  xcb_disconnect(connection);

  exit(EXIT_SUCCESS);
}

Lähteet

  1. ↑ xcb xcb.freedesktop.org. Viitattu 30.10.2026. (englanniksi)
  2. ↑ James Gettys; Keith Packard: The (Re)Architecture of the X Window System (PDF) keithp.com. Viitattu 30.10.2026. (englanniksi)
  3. ↑ Jamey Sharp; Bart Massey: XCL : An Xlib Compatibility Layer For XCB usenix.org. 2002. Viitattu 30.10.2026. (englanniksi)