#include #include #include #include #include #include #include #include #include void draw_text(cairo_t *, const char *); xcb_visualtype_t * find_visual(xcb_screen_t *); static const int MARGIN = 20; static const int WIDTH = 800; static const int HEIGHT = 1131; static const char * FONT = "Serif 34"; int main(int argc, const char ** argv) { const char * text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; if (2 == argc) text = argv[2]; xcb_connection_t * c = xcb_connect(NULL, NULL); if (xcb_connection_has_error(c)) { dprintf(2, "Could not connect to X11 server"); return 1; } xcb_screen_t * s = xcb_setup_roots_iterator(xcb_get_setup(c)).data; xcb_window_t w = xcb_generate_id(c); const uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; const uint32_t values[] = {s->white_pixel, XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_KEY_PRESS}; xcb_visualtype_t * visual = find_visual(s); xcb_create_window( c, XCB_COPY_FROM_PARENT, w, s->root, 0, 0, WIDTH, HEIGHT, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, s->root_visual, mask, values); xcb_map_window(c, w); cairo_surface_t * surface = cairo_xcb_surface_create(c, w, visual, WIDTH, HEIGHT); cairo_t * ctx = cairo_create(surface); xcb_flush(c); int done = 0; xcb_generic_event_t * e; while (!done) { e = xcb_wait_for_event(c); if (NULL == e) break; switch (XCB_EVENT_RESPONSE_TYPE(e)) { default: break; case XCB_KEY_PRESS: done = 1; break; case XCB_EXPOSE: cairo_set_source_rgb(ctx, 1., 1., 1.); cairo_paint(ctx); cairo_set_source_rgb(ctx, 0., 0., 0.); draw_text(ctx, text); cairo_surface_flush(surface); xcb_flush(c); break; } free(e); } cairo_destroy(ctx); cairo_surface_destroy(surface); xcb_disconnect(c); } xcb_visualtype_t * find_visual(xcb_screen_t * s) { xcb_depth_iterator_t d = xcb_screen_allowed_depths_iterator(s); for (; d.rem; xcb_depth_next(&d)) { xcb_visualtype_iterator_t v = xcb_depth_visuals_iterator(d.data); for (; v.rem; xcb_visualtype_next(&v)) if (v.data->visual_id == s->root_visual) return v.data; } return NULL; } void draw_text(cairo_t * ctx, const char * text) { cairo_move_to(ctx, MARGIN, MARGIN); PangoLayout * layout = pango_cairo_create_layout(ctx); PangoFontDescription * desc = pango_font_description_from_string(FONT); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_layout_set_text(layout, text, -1); pango_layout_set_wrap(layout, PANGO_WRAP_WORD); pango_layout_set_width(layout, (WIDTH - 2 * MARGIN) * PANGO_SCALE); pango_cairo_update_layout(ctx, layout); pango_cairo_show_layout(ctx, layout); g_object_unref(layout); }