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:
committed by
Michael Stapelberg
parent
70151ea238
commit
5c2088c87e
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
26
src/xcb.c
26
src/xcb.c
@ -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
|
||||
*
|
||||
|
Reference in New Issue
Block a user