Allow min_width of a block in i3bar to be a string

With this change, min_width can either be an integer (as usual), or a
string. In the latter case, the width of the text given by min_width
determines the minimum width of the block. This way one does not have to
figure out a minimum width by trial and error, only to do it again every
time the font is changed.
This commit is contained in:
András Mohari 2013-02-25 11:41:02 +01:00 committed by Michael Stapelberg
parent 7ecdcb61f8
commit a0d5b744ab
2 changed files with 19 additions and 0 deletions

View File

@ -140,6 +140,10 @@ min_width::
will be padded to the left and/or the right side, according to the +align+ will be padded to the left and/or the right side, according to the +align+
key. This is useful when you want to prevent the whole status line to shift key. This is useful when you want to prevent the whole status line to shift
when value take more or less space between each iteration. when value take more or less space between each iteration.
The value can also be a string. In this case, the width of the text given
by +min_width+ determines the minimum width of the block. This is useful
when you want to set a sensible minimum width regardless of which font you
are using, and at what particular size.
align:: align::
Align text on the +center+ (default), +right+ or +left+ of the block, when Align text on the +center+ (default), +right+ or +left+ of the block, when
the minimum width of the latter, specified by the +min_width+ key, is not the minimum width of the latter, specified by the +min_width+ key, is not
@ -178,6 +182,17 @@ of the i3bar protocol.
} }
------------------------------------------ ------------------------------------------
In the following example, the longest (widest) possible value of the block is
used to set the minimum width:
------------------------------------------
{
"full_text": "CPU 4%",
"min_width": "CPU 100%",
"align": "left"
}
------------------------------------------
An example of a block which uses all possible entries follows: An example of a block which uses all possible entries follows:
*Example*: *Example*:

View File

@ -147,6 +147,10 @@ static int stdin_string(void *context, const unsigned char *val, unsigned int le
} else { } else {
ctx->block.align = ALIGN_CENTER; ctx->block.align = ALIGN_CENTER;
} }
} else if (strcasecmp(ctx->last_map_key, "min_width") == 0) {
i3String *text = i3string_from_utf8_with_length((const char *)val, len);
ctx->block.min_width = (uint32_t)predict_text_width(text);
i3string_free(text);
} }
return 1; return 1;
} }