#include <stdlib.h> #include <stdio.h> #include <xcb/xcb.h>
int main() {
// 幾何圖元定義
xcb_point_t points[] = {{40,40},{40,80},{80,40},{80,80}};
xcb_point_t polyline[] = {{200,40},{20,80},{100,-80},{40,40}}; // 相對座標
xcb_segment_t segments[] = {{400,40,560,120},{440,100,520,240}};
xcb_rectangle_t rects[] = {{40,200,160,80},{320,200,40,160}};
xcb_arc_t arcs[] = {{40,400,240,160,0,90<<6},{360,400,220,160,0,270<<6}}; // 角度單位 1/64 度
xcb_connection_t *conn = xcb_connect(NULL, NULL);
xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
// 建立 GC(黑色前景)
xcb_drawable_t drawable = screen->root;
xcb_gcontext_t gc = xcb_generate_id(conn);
uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
uint32_t vals[2] = {screen->black_pixel, 0};
xcb_create_gc(conn, gc, drawable, mask, vals);
// 建立視窗(白底)
xcb_window_t win = xcb_generate_id(conn);
mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
vals[0] = screen->white_pixel; vals[1] = XCB_EVENT_MASK_EXPOSURE;
xcb_create_window(conn, XCB_COPY_FROM_PARENT, win, screen->root, 0, 0,
800, 600, 10, XCB_WINDOW_CLASS_INPUT_OUTPUT,
screen->root_visual, mask, vals);
xcb_map_window(conn, win); xcb_flush(conn);
// 事件迴圈:EXPOSE 事件觸發繪圖
xcb_generic_event_t *ev;
while ((ev = xcb_wait_for_event(conn))) {
if ((ev->response_type & ~0x80) == XCB_EXPOSE) {
xcb_poly_point(conn, XCB_COORD_MODE_ORIGIN, win, gc, 4, points);
xcb_poly_line(conn, XCB_COORD_MODE_PREVIOUS, win, gc, 4, polyline);
xcb_poly_segment(conn, win, gc, 2, segments);
xcb_poly_rectangle(conn, win, gc, 2, rects);
xcb_poly_arc(conn, win, gc, 2, arcs);
xcb_flush(conn);
}
free(ev);
}
return 0;
}

僅在 XCB_EXPOSE 事件(視窗初次顯示、從遮蔽恢復、需重繪)中呼叫繪圖函式。符合 MVC 模式:資料變更標記需重繪,實際繪製延遲至 EXPOSE,兼顧正確性與效能。
xcb_create_gc() 使用 mask + values[] 陣列指定屬性。常用 XCB_GC_* 列舉:


XCB_CW_* 列舉控制視窗屬性:


本範例指定 XCB_CW_BACK_PIXEL 設白底,故視窗有背景色。
xcb_poly_point:多點(模式 ORIGIN 絕對座標 / PREVIOUS 相對座標)xcb_poly_line:折線xcb_poly_segment:獨立線段xcb_poly_rectangle:矩形xcb_poly_arc:弧形(角度單位 1/64 度)