/** Draws a black background with white text. Should be calld when an expose event is received. */ void redraw() { // convert the text to be displayed. xcb_char2b_t *str = char2b(text); // get the dimensions of the text xcb_query_text_extents_cookie_t cookie = xcb_query_text_extents(con, font, text.size(), str); delete[] str; xcb_generic_error_t *error; xcb_query_text_extents_reply_t *reply = xcb_query_text_extents_reply(con, cookie, &error); if(error) { std::cerr << "Could not query text extents." << std::endl; exit(1); } // draw the text in the middle of the window. xcb_image_text_8(con, text.size(), win, txt_gc, width/2 - reply->overall_width/2, height/2, text.c_str()); free(reply); xcb_flush(con); }
/** Predict text width */ int cal_text_width(const char *text, int len) { xcb_query_text_extents_cookie_t cookie; xcb_query_text_extents_reply_t *reply; cookie = xcb_query_text_extents(nil_.con, nil_.font.id, len, (xcb_char2b_t*)text); reply = xcb_query_text_extents_reply(nil_.con, cookie, 0); if (!reply) { NIL_ERR("get text extents %s", text); return 7; /* minimum */ } len = reply->overall_width; free(reply); return len; }