/** 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); }
static void _e_alert_draw_button_text(void) { xcb_char2b_t *str = NULL; xcb_query_text_extents_cookie_t cookie; xcb_query_text_extents_reply_t *reply; int x = 0, w = 0, bw = 0; bw = (WINDOW_WIDTH / 2) - 40 - 1; /* draw button1 text */ str = _e_alert_build_string(str1); cookie = xcb_query_text_extents_unchecked(conn, font, strlen(str1), str); reply = xcb_query_text_extents_reply(conn, cookie, NULL); if (reply) { w = reply->overall_width; free(reply); } free(str); x = (5 + ((bw - w) / 2)); xcb_image_text_8(conn, strlen(str1), btn1, gc, x, (10 + fa), str1); /* draw button2 text */ str = _e_alert_build_string(str2); cookie = xcb_query_text_extents_unchecked(conn, font, strlen(str2), str); reply = xcb_query_text_extents_reply(conn, cookie, NULL); if (reply) { w = reply->overall_width; free(reply); } free(str); x = (5 + ((bw - w) / 2)); xcb_image_text_8(conn, strlen(str2), btn2, gc, x, (10 + fa), str2); }
/** 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; }
static void _e_alert_display(void) { xcb_char2b_t *str = NULL; xcb_query_text_extents_cookie_t cookie; xcb_query_text_extents_reply_t *reply; int x = 0, w = 0; tainted = _e_alert_root_tainted_get(); str = _e_alert_build_string(title); cookie = xcb_query_text_extents_unchecked(conn, font, strlen(title), str); reply = xcb_query_text_extents_reply(conn, cookie, NULL); if (reply) { fa = reply->font_ascent; fh = (fa + reply->font_descent); fw = reply->overall_width; free(reply); } free(str); /* move buttons */ x = 20; w = (WINDOW_WIDTH / 2) - 40; _e_alert_button_move_resize(btn1, x, WINDOW_HEIGHT - 20 - (fh + 20), w, (fh + 20)); x = ((WINDOW_WIDTH / 2) + 20); _e_alert_button_move_resize(btn2, x, WINDOW_HEIGHT - 20 - (fh + 20), w, (fh + 20)); comp_win = _e_alert_comp_win_get(); if (comp_win) { xcb_rectangle_t rect; int wx = 0, wy = 0; wx = ((sw - WINDOW_WIDTH) / 2); wy = ((sh - WINDOW_HEIGHT) / 2); rect.x = wx; rect.y = wy; rect.width = WINDOW_WIDTH; rect.height = WINDOW_HEIGHT; xcb_shape_rectangles(conn, XCB_SHAPE_SO_SET, XCB_SHAPE_SK_INPUT, XCB_CLIP_ORDERING_UNSORTED, comp_win, 0, 0, 1, &rect); xcb_reparent_window(conn, win, comp_win, wx, wy); } /* map and raise main window */ xcb_map_window(conn, win); _e_alert_window_raise(win); /* grab pointer & keyboard */ xcb_grab_pointer_unchecked(conn, 0, win, (XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE), XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_NONE, XCB_NONE, XCB_CURRENT_TIME); xcb_grab_keyboard_unchecked(conn, 0, win, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, win, XCB_CURRENT_TIME); /* flush screen */ xcb_flush(conn); /* sync */ _e_alert_sync(); }