cache text_width for named workspaces, fix memory leak

This commit is contained in:
Michael Stapelberg 2009-08-02 21:32:35 +02:00
parent 188629ddcd
commit a753684ac5
4 changed files with 12 additions and 6 deletions

View File

@ -171,6 +171,9 @@ struct Workspace {
/** Length of the workspaces name (in glyphs) */ /** Length of the workspaces name (in glyphs) */
int name_len; int name_len;
/** Width of the workspaces name (in pixels) rendered in config.font */
int text_width;
/** x, y, width, height */ /** x, y, width, height */
Rect rect; Rect rect;

View File

@ -436,21 +436,18 @@ static void render_internal_bar(xcb_connection_t *conn, Workspace *r_ws, int wid
&(config.bar.unfocused)); &(config.bar.unfocused));
Workspace *ws = &workspaces[c]; Workspace *ws = &workspaces[c];
/* Calculate the length of a string in a given font */
int text_width = predict_text_width(conn, config.font, ws->name, ws->name_len);
/* Draw the outer rect */ /* Draw the outer rect */
xcb_draw_rect(conn, screen->bar, screen->bargc, color->border, xcb_draw_rect(conn, screen->bar, screen->bargc, color->border,
drawn, /* x */ drawn, /* x */
1, /* y */ 1, /* y */
text_width + 5 + 5, /* width = text width + 5 px left + 5px right */ ws->text_width + 5 + 5, /* width = text width + 5 px left + 5px right */
height - 2 /* height = max. height - 1 px upper and 1 px bottom border */); height - 2 /* height = max. height - 1 px upper and 1 px bottom border */);
/* Draw the background of this rect */ /* Draw the background of this rect */
xcb_draw_rect(conn, screen->bar, screen->bargc, color->background, xcb_draw_rect(conn, screen->bar, screen->bargc, color->background,
drawn + 1, drawn + 1,
2, 2,
text_width + 4 + 4, ws->text_width + 4 + 4,
height - 4); height - 4);
xcb_change_gc_single(conn, screen->bargc, XCB_GC_FOREGROUND, color->text); xcb_change_gc_single(conn, screen->bargc, XCB_GC_FOREGROUND, color->text);
@ -458,7 +455,7 @@ static void render_internal_bar(xcb_connection_t *conn, Workspace *r_ws, int wid
xcb_image_text_16(conn, ws->name_len, screen->bar, screen->bargc, drawn + 5 /* X */, xcb_image_text_16(conn, ws->name_len, screen->bar, screen->bargc, drawn + 5 /* X */,
font->height + 1 /* Y = baseline of font */, font->height + 1 /* Y = baseline of font */,
(xcb_char2b_t*)ws->name); (xcb_char2b_t*)ws->name);
drawn += text_width + 12; drawn += ws->text_width + 12;
} }
LOG("done rendering internal\n"); LOG("done rendering internal\n");

View File

@ -16,6 +16,9 @@
#include "util.h" #include "util.h"
#include "data.h" #include "data.h"
#include "i3.h"
#include "config.h"
#include "xcb.h"
/* /*
* Sets the name (or just its number) for the given workspace. This has to * Sets the name (or just its number) for the given workspace. This has to
@ -38,6 +41,7 @@ void workspace_set_name(Workspace *ws, const char *name) {
FREE(ws->name); FREE(ws->name);
ws->name = convert_utf8_to_ucs2(label, &(ws->name_len)); ws->name = convert_utf8_to_ucs2(label, &(ws->name_len));
ws->text_width = predict_text_width(global_conn, config.font, ws->name, ws->name_len);
free(label); free(label);
} }

View File

@ -357,5 +357,7 @@ int predict_text_width(xcb_connection_t *conn, const char *font_pattern, char *t
width += info->character_width; width += info->character_width;
} }
free(font_info);
return width; return width;
} }