cache text_width for named workspaces, fix memory leak
This commit is contained in:
parent
188629ddcd
commit
a753684ac5
|
@ -171,6 +171,9 @@ struct Workspace {
|
||||||
/** Length of the workspace’s name (in glyphs) */
|
/** Length of the workspace’s name (in glyphs) */
|
||||||
int name_len;
|
int name_len;
|
||||||
|
|
||||||
|
/** Width of the workspace’s name (in pixels) rendered in config.font */
|
||||||
|
int text_width;
|
||||||
|
|
||||||
/** x, y, width, height */
|
/** x, y, width, height */
|
||||||
Rect rect;
|
Rect rect;
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue