X 視窗程式設計/XCB
外觀
< X 視窗程式設計
XCB(X C 繫結)是 C 語言繫結,用於 X 視窗系統。它的目標是取代 XLib。該專案由 Bart Massey 於 2001 年啟動。
Xlib/XCB 提供了與 Xlib 和 XCB 的應用程式二進位制介面相容性,提供了一個增量移植路徑。
XCB 的主要目標是
- 減少庫的大小和複雜性;
- 直接訪問 X11 協議。
次要目標包括使 C 介面非同步,促進更好的多執行緒,並使擴充套件更容易實現(透過 XML 協議描述)。
核心和擴充套件協議描述位於 XML 中,C 繫結透過 XSLT 建立。第三個目標是將這些協議描述重新用於建立協議文件、其他語言繫結和伺服器端存根。
Massey 致力於使用 Z 符號正式證明 XCB 的正確性。(Xlib 長期以來一直被認為包含錯誤。)
/* Simple XCB application drawing a box in a window */
#include <xcb/xcb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int
main (int argc, char **argv)
{
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;
xcb_rectangle_t r = { 20, 20, 60, 60 };
/* open connection with the server */
c = xcb_connect (NULL, NULL);
if (xcb_connection_has_error(c) > 0)
{
printf ("Cannot open display\n");
exit (1);
}
s = xcb_setup_roots_iterator (xcb_get_setup (c)).data;
/* create window */
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;
w = xcb_generate_id (c);
xcb_create_window (c, XCB_COPY_FROM_PARENT, w, s->root,
10, 10, 100, 100, 1,
XCB_WINDOW_CLASS_INPUT_OUTPUT,
s->root_visual,
mask, values);
/* create black graphics context */
mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
values[0] = s->black_pixel;
values[1] = 0;
g = xcb_generate_id (c);
xcb_create_gc (c, g, w, mask, values);
/* map (show) the window */
xcb_map_window (c, w);
xcb_flush (c);
/* event loop */
done = 0;
while (!done && (e = xcb_wait_for_event (c)))
{
switch (e->response_type)
{
/* (re)draw the window */
case XCB_EXPOSE:
printf ("EXPOSE\n");
xcb_poly_fill_rectangle (c, w, g, 1, &r);
xcb_flush (c);
break;
/* exit on keypress */
case XCB_KEY_PRESS:
done = 1;
break;
}
free (e);
}
/* close connection to server */
xcb_disconnect (c);
return 0;
}
/* Simple XCB application drawing a box in a window */
/* note that this is old code, modern XCB has dropped
* CamelCase, eg XCBConnection -> xcb_connection_t
*/
#include <X11/XCB/xcb.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
XCBConnection *c;
XCBSCREEN *s;
XCBDRAWABLE w;
XCBGCONTEXT g;
XCBGenericEvent *e;
CARD32 mask;
CARD32 values[2];
int done = 0;
XCBRECTANGLE r = { 20, 20, 60, 60 };
/* open connection with the server */
c = XCBConnect(NULL,NULL);
if (c == NULL) {
printf("Cannot open display\n");
exit(1);
}
/* get the first screen */
s = XCBSetupRootsIter( XCBGetSetup(c) ).data;
/* create black graphics context */
g = XCBGCONTEXTNew(c);
w.window = s->root;
mask = XCBGCForeground | XCBGCGraphicsExposures;
values[0] = s->black_pixel;
values[1] = 0;
XCBCreateGC(c, g, w, mask, values);
/* create window */
w.window = XCBWINDOWNew(c);
mask = XCBCWBackPixel | XCBCWEventMask;
values[0] = s->white_pixel;
values[1] = XCBEventMaskExposure | XCBEventMaskKeyPress;
XCBCreateWindow(c, s->root_depth, w.window, s->root,
10, 10, 100, 100, 1,
XCBWindowClassInputOutput, s->root_visual,
mask, values);
/* map (show) the window */
XCBMapWindow(c, w.window);
XCBFlush(c);
/* event loop */
while (!done && (e = XCBWaitForEvent(c))) {
switch (e->response_type & ~0x80) {
case XCBExpose: /* draw or redraw the window */
XCBPolyFillRectangle(c, w, g, 1, &r);
XCBFlush(c);
break;
case XCBKeyPress: /* exit on key press */
done = 1;
break;
}
free(e);
}
/* close connection to server */
XCBDisconnect(c);
return 0;
}
XCB 具有與 XLib 相當但略微底層的 API,可以透過這些示例看到。
- XCB:X 協議 C 繫結 (
)(Bart Massey 和 Jamey Sharp,2001 年 9 月 19 日,在 XFree86 技術大會 2001 上發表) - XCL:XCB 的 Xlib 相容性層(Jamey Sharp 和 Bart Massey,2002 年 4 月 15 日,在美國 USENIX 2002 上發表)
- X 遇上 Z:在 POSIX 執行緒存在的情況下驗證正確性(Bart Massey 和 Robert Bauer,2002 年 4 月 15 日,在美國 USENIX 2002 上發表)