XCB - XCB

XCB
Xcb logo.svg
Autor (es) original (is) Bart Massey
Desenvolvedor (s) Jamey Sharp, Josh Triplett, Bart Massey
lançamento inicial 2001 ; 20 anos atras  ( 2001 )
Versão estável
1.14 / fevereiro de 2020 ; 1 ano atrás  ( 2020-02 )
Repositório Edite isso no Wikidata
Escrito em C
Sistema operacional POSIX
Modelo Biblioteca cliente X11
Licença Licença MIT
Local na rede Internet xcb .freedesktop .org
Image
X11-clientes usam XCB se comunicar com o servidor X .
Image
Uma visão mais completa da pilha de gráficos do Linux
Image
Os programas geralmente usam GTK ou FLTK ou Qt para seus widgets GUI .
Image
Uma visão mais completa dos componentes de um sistema operacional para computadores domésticos.

XCB ( vinculação da linguagem C do protocolo X ) é uma biblioteca que implementa o lado do cliente do protocolo de servidor de exibição X11 . XCB é escrito na linguagem de programação C e distribuído sob a licença MIT . O projeto foi iniciado em 2001 por Bart Massey e visa substituir o Xlib .

Visão geral

O XCB foi projetado como um substituto menor e modernizado do Xlib, anteriormente a biblioteca C principal para comunicação com o sistema X window, coincidindo com uma revisão mais completa da implementação do X que ocorreu durante o início dos anos 2000. Os principais objetivos do XCB são:

  • reduzir o tamanho e a complexidade da biblioteca
  • fornecer acesso direto ao protocolo X11

A redução de tamanho necessária é alcançada principalmente restringindo o escopo do XCB para lidar com o protocolo X e omitindo a funcionalidade do Xlib, como sua extensa biblioteca de utilitários, muitos dos quais viram pouco uso pelos aplicativos. Isso resulta em uma redução de fator trinta do tamanho da biblioteca compilada (em 2004). Os objetivos secundários incluem tornar a interface C assíncrona , facilitando melhor multithreading e facilitando a implementação de extensões (por meio de descrições de protocolo XML ).

As descrições do protocolo principal e de extensão estão em XML , com um programa escrito em Python criando as ligações C. (As versões anteriores usavam XSLT e M4 .)

Outro objetivo é poder usar essas descrições de protocolo para criar documentação de protocolo, mais ligações de linguagem e stubs do lado do servidor.

Massey e outros têm trabalhado para provar porções principais de XCB formalmente correta usando a notação Z . (Sabe-se há muito tempo que o Xlib contém erros.)

Compatibilidade Xlib

Xlib / XCB fornece compatibilidade de interface binária de aplicativo com Xlib e XCB, fornecendo um caminho de portabilidade incremental. O Xlib / XCB usa a camada de protocolo do Xlib, mas substitui a camada de transporte do Xlib pelo XCB e fornece acesso à conexão XCB subjacente para uso direto do XCB. O Xlib / XCB permite que um aplicativo abra uma única conexão com o servidor de exibição X e use tanto o XCB quanto o Xlib, possivelmente por meio de uma mistura de bibliotecas projetadas para um ou outro.

Exemplo

// 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);
}

O XCB tem uma API de nível comparável, mas um pouco inferior, do que o Xlib , como pode ser visto neste exemplo.

Descrição do protocolo

Os criadores do XCB inventaram uma linguagem de descrição de interface especializada para modelar o protocolo X11 de maneira neutra em relação à linguagem e facilitar a geração de ligações para outras linguagens de programação. A própria libxcb é implementada como um gerador de código e um pequeno esboço C de funções utilitárias.

Um exemplo:

<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>

O logotipo do XCB foi produzido por Gearóid Molloy, autor do web comic Neko the Kitty , e doado ao projeto.

Outras ligações de linguagem

  • XCB.pm - Módulo Perl que implementa ligações ao XCB.
  • xpyb - A ligação Python ao X Window System usando XCB. Em junho de 2013, ele não era compatível com Python 3. Fornecido por freedesktop.org .
  • xcffib - Outra ligação Python que suporta Python 2 e 3, bem como várias outras extensões X do que xpyb.

Notas

Referências

links externos