Enhance libi3 and use it in i3bar.

Abstracted draw_text and predict_text_width into libi3. Use
predict_text_width from libi3 in i3 too. This required tracking
xcb_connection in a xcb_connection_t *conn variable that libi3
expects to be available in i3bar.
This commit is contained in:
Fernando Tarlá Cardoso Lemos
2011-11-13 17:19:42 -02:00
committed by Michael Stapelberg
parent 70151ea238
commit 5c2088c87e
11 changed files with 307 additions and 262 deletions

View File

@ -1546,6 +1546,7 @@ font:
TOKFONT STR
{
config.font = load_font($2, true);
set_font(&config.font);
printf("font %s\n", $2);
FREE(font_pattern);
font_pattern = $2;

View File

@ -371,6 +371,7 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
if (config.font.id == 0) {
ELOG("You did not specify required configuration option \"font\"\n");
config.font = load_font("fixed", true);
set_font(&config.font);
}
#if 0

View File

@ -152,7 +152,7 @@ void handle_signal(int sig, siginfo_t *info, void *data) {
/* calculate width for longest text */
int text_len = strlen(crash_text[crash_text_longest]);
xcb_char2b_t *longest_text = convert_utf8_to_ucs2(crash_text[crash_text_longest], &text_len);
int font_width = predict_text_width(longest_text, text_len);
int font_width = predict_text_width((char *)longest_text, text_len, true);
int width = font_width + 20;
/* Open a popup window on each virtual screen */

View File

@ -130,32 +130,6 @@ void xcb_raise_window(xcb_connection_t *conn, xcb_window_t window) {
xcb_configure_window(conn, window, XCB_CONFIG_WINDOW_STACK_MODE, values);
}
/*
* Query the width of the given text (16-bit characters, UCS) with given real
* length (amount of glyphs) using the given font.
*
*/
int predict_text_width(const xcb_char2b_t *text, int length) {
xcb_query_text_extents_cookie_t cookie;
xcb_query_text_extents_reply_t *reply;
xcb_generic_error_t *error;
int width;
cookie = xcb_query_text_extents(conn, config.font.id, length, text);
if ((reply = xcb_query_text_extents_reply(conn, cookie, &error)) == NULL) {
ELOG("Could not get text extents (X error code %d)\n",
error->error_code);
/* We return the rather safe guess of 7 pixels, because a
* rendering error is better than a crash. Plus, the user will
* see the error in his log. */
return 7;
}
width = reply->overall_width;
free(reply);
return width;
}
/*
* Configures the given window to have the size/position specified by given rect
*