From a753684ac5cfe413324e707fe2aa623ea4135cc7 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 2 Aug 2009 21:32:35 +0200 Subject: [PATCH] cache text_width for named workspaces, fix memory leak --- include/data.h | 3 +++ src/layout.c | 9 +++------ src/workspace.c | 4 ++++ src/xcb.c | 2 ++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/include/data.h b/include/data.h index 5bca3ae7..4ced21f8 100644 --- a/include/data.h +++ b/include/data.h @@ -171,6 +171,9 @@ struct Workspace { /** Length of the workspace’s name (in glyphs) */ int name_len; + /** Width of the workspace’s name (in pixels) rendered in config.font */ + int text_width; + /** x, y, width, height */ Rect rect; diff --git a/src/layout.c b/src/layout.c index 2dbcf71c..d094ca42 100644 --- a/src/layout.c +++ b/src/layout.c @@ -436,21 +436,18 @@ static void render_internal_bar(xcb_connection_t *conn, Workspace *r_ws, int wid &(config.bar.unfocused)); 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 */ xcb_draw_rect(conn, screen->bar, screen->bargc, color->border, drawn, /* x */ 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 */); /* Draw the background of this rect */ xcb_draw_rect(conn, screen->bar, screen->bargc, color->background, drawn + 1, 2, - text_width + 4 + 4, + ws->text_width + 4 + 4, height - 4); 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 */, font->height + 1 /* Y = baseline of font */, (xcb_char2b_t*)ws->name); - drawn += text_width + 12; + drawn += ws->text_width + 12; } LOG("done rendering internal\n"); diff --git a/src/workspace.c b/src/workspace.c index 40a5692a..d3de73e4 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -16,6 +16,9 @@ #include "util.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 @@ -38,6 +41,7 @@ void workspace_set_name(Workspace *ws, const char *name) { FREE(ws->name); 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); } diff --git a/src/xcb.c b/src/xcb.c index ff0c32d0..3f5d4280 100644 --- a/src/xcb.c +++ b/src/xcb.c @@ -357,5 +357,7 @@ int predict_text_width(xcb_connection_t *conn, const char *font_pattern, char *t width += info->character_width; } + free(font_info); + return width; } -- 2.39.5