From c9019ada4e489402eff68b799c817c8c28ab6a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sat, 21 Mar 2015 21:36:15 +0100 Subject: [PATCH] Add support for short_text When the statusline is too long, try to use the short_text property of each status block before falling back to truncating it. fixes #1092 --- i3bar/src/xcb.c | 23 ++++++++++++++++------- libi3/string.c | 7 +++---- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index 96fcb3fa..06eac7ea 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -159,7 +159,7 @@ int get_tray_width(struct tc_head *trayclients) { * Redraws the statusline to the buffer * */ -void refresh_statusline(void) { +void refresh_statusline(bool use_short_text) { struct status_block *block; uint32_t old_statusline_width = statusline_width; @@ -167,6 +167,12 @@ void refresh_statusline(void) { /* Predict the text width of all blocks (in pixels). */ TAILQ_FOREACH(block, &statusline_head, blocks) { + /* Try to use the shorter text if necessary and possible. */ + if (use_short_text && block->short_text != NULL) { + I3STRING_FREE(block->full_text); + block->full_text = i3string_copy(block->short_text); + } + if (i3string_get_num_bytes(block->full_text) == 0) continue; @@ -1760,7 +1766,7 @@ void draw_bars(bool unhide) { DLOG("Drawing bars...\n"); int workspace_width = 0; - refresh_statusline(); + refresh_statusline(false); i3_output *outputs_walk; SLIST_FOREACH(outputs_walk, outputs, slist) { @@ -1904,14 +1910,17 @@ void draw_bars(bool unhide) { if (!TAILQ_EMPTY(&statusline_head)) { DLOG("Printing statusline!\n"); + int tray_width = get_tray_width(outputs_walk->trayclients); + int max_statusline_width = outputs_walk->rect.w - workspace_width - tray_width - 2 * logical_px(sb_hoff_px); + + /* If the statusline is too long, try to use short texts. */ + if (statusline_width > max_statusline_width) + refresh_statusline(true); + /* Luckily we already prepared a seperate pixmap containing the rendered * statusline, we just have to copy the relevant parts to the relevant * position */ - int tray_width = get_tray_width(outputs_walk->trayclients); - - int visible_statusline_width = MIN(statusline_width, - outputs_walk->rect.w - workspace_width - tray_width - 2 * logical_px(sb_hoff_px)); - + int visible_statusline_width = MIN(statusline_width, max_statusline_width); xcb_copy_area(xcb_connection, statusline_pm, outputs_walk->buffer, diff --git a/libi3/string.c b/libi3/string.c index a28cc899..88fd1986 100644 --- a/libi3/string.c +++ b/libi3/string.c @@ -114,10 +114,9 @@ i3String *i3string_from_ucs2(const xcb_char2b_t *from_ucs2, size_t num_glyphs) { * Note that this will not free the source string. */ i3String *i3string_copy(i3String *str) { - if (str->is_markup) - return i3string_from_markup(i3string_as_utf8(str)); - else - return i3string_from_utf8(i3string_as_utf8(str)); + i3String *copy = i3string_from_utf8(i3string_as_utf8(str)); + copy->is_markup = str->is_markup; + return copy; } /*