XCB - XCB
| Autor (es) original (is) | Bart Massey |
|---|---|
| Desenvolvedor (s) | Jamey Sharp, Josh Triplett, Bart Massey |
| lançamento inicial | 2001 |
| Versão estável | 1.14 / fevereiro de 2020
|
| Repositório |
|
| Escrito em | C |
| Sistema operacional | POSIX |
| Modelo | Biblioteca cliente X11 |
| Licença | Licença MIT |
| Local na rede Internet | xcb |
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>
Logotipo
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
- Massey, Bart; Sharp, Jamey (2001-09-19). "XCB: uma ligação do protocolo X C" (PDF) . Procedimentos da Conferência Técnica XFree86 . Oakland, Califórnia: USENIX . Página visitada em 2012-03-12 .
- Massey, Bart; Bauer, Robert (2002). "X encontra Z: Verificando a correção na presença de threads POSIX" . Proceedings of the FREENIX Track: 2002 USENIX Annual Technical Conference . Monterey, Califórnia: USENIX . pp. 221–234 . Página visitada em 2008-11-07 .
- Sharp, Jamey; Massey, Bart (2002). "XCL: uma camada de compatibilidade para XCB" . Proceedings of the FREENIX Track: 2002 USENIX Annual Technical Conference . Monterey, Califórnia: USENIX . pp. 71-83 . Página visitada em 2008-11-07 .