]> git.sur5r.net Git - i3/i3/commitdiff
i3bar: set markup per block 1564/head
authorTony Crisci <tony@dubstepdish.com>
Tue, 24 Mar 2015 06:27:38 +0000 (02:27 -0400)
committerTony Crisci <tony@dubstepdish.com>
Tue, 24 Mar 2015 06:27:38 +0000 (02:27 -0400)
Add `markup` to the i3bar protocol as a block member.

This is a string that determines how the block should be parsed as
markup. "pango" indicates the block should be parsed as Pango markup.
"none" indicates the block should not be parsed as markup.

docs/i3bar-protocol
i3bar/include/common.h
i3bar/src/child.c
include/libi3.h
libi3/string.c

index 8fd51ae9359cfe92ae1fd6f45a2057bf0a591b1a..ccc763460ced1db2108fcbee593c3840b111c736 100644 (file)
@@ -172,6 +172,10 @@ separator_block_width::
        this gap, a separator line will be drawn unless +separator+ is
        disabled. Normally, you want to set this to an odd value (the default
        is 9 pixels), since the separator line is drawn in the middle.
+markup::
+       A string that indicates how the text of the block should be parsed. Set to
+       +"pango"+ to use https://developer.gnome.org/pango/stable/PangoMarkupFormat.html[Pango markup]
+       (default). Set to +"none"+ to not use any markup.
 
 If you want to put in your own entries into a block, prefix the key with an
 underscore (_). i3bar will ignore all keys it doesn’t understand, and prefixing
index 3744df27e58c05e4c104570bf427879f580c4312..22b9a28ac81d39e9d7a3a24cf40f2ba900839fe7 100644 (file)
@@ -38,11 +38,18 @@ struct status_block {
     i3String *short_text;
 
     char *color;
+
+    /* min_width can be specified either as a numeric value (in pixels) or as a
+     * string. For strings, we set min_width to the measured text width of
+     * min_width_str. */
     uint32_t min_width;
+    char *min_width_str;
+
     blockalign_t align;
 
     bool urgent;
     bool no_separator;
+    bool is_markup;
 
     /* The amount of pixels necessary to render a separater after the block. */
     uint32_t sep_block_width;
index 894bd4a3e2a492bab8173da2ba816893e0530048..402e6351bd3fd085134278c066b4a50d7ddf9307 100644 (file)
@@ -74,6 +74,7 @@ static void clear_statusline(struct statusline_head *head, bool free_resources)
             FREE(first->color);
             FREE(first->name);
             FREE(first->instance);
+            FREE(first->min_width_str);
         }
 
         TAILQ_REMOVE(head, first, blocks);
@@ -163,6 +164,9 @@ static int stdin_start_map(void *context) {
     /* Default width of the separator block. */
     ctx->block.sep_block_width = logical_px(9);
 
+    /* Use markup by default */
+    ctx->block.is_markup = true;
+
     return 1;
 }
 
@@ -195,6 +199,9 @@ static int stdin_string(void *context, const unsigned char *val, size_t len) {
     if (strcasecmp(ctx->last_map_key, "color") == 0) {
         sasprintf(&(ctx->block.color), "%.*s", len, val);
     }
+    if (strcasecmp(ctx->last_map_key, "markup") == 0) {
+        ctx->block.is_markup = (len == strlen("pango") && !strncasecmp((const char *)val, "pango", strlen("pango")));
+    }
     if (strcasecmp(ctx->last_map_key, "align") == 0) {
         if (len == strlen("center") && !strncmp((const char *)val, "center", strlen("center"))) {
             ctx->block.align = ALIGN_CENTER;
@@ -204,9 +211,10 @@ static int stdin_string(void *context, const unsigned char *val, size_t len) {
             ctx->block.align = ALIGN_LEFT;
         }
     } else if (strcasecmp(ctx->last_map_key, "min_width") == 0) {
-        i3String *text = i3string_from_markup_with_length((const char *)val, len);
-        ctx->block.min_width = (uint32_t)predict_text_width(text);
-        i3string_free(text);
+        char *copy = (char *)malloc(len + 1);
+        strncpy(copy, (const char *)val, len);
+        copy[len] = 0;
+        ctx->block.min_width_str = copy;
     }
     if (strcasecmp(ctx->last_map_key, "name") == 0) {
         char *copy = (char *)malloc(len + 1);
@@ -248,6 +256,17 @@ static int stdin_end_map(void *context) {
         new_block->full_text = i3string_from_utf8("SPEC VIOLATION: full_text is NULL!");
     if (new_block->urgent)
         ctx->has_urgent = true;
+
+    if (new_block->min_width_str) {
+        i3String *text = i3string_from_utf8(new_block->min_width_str);
+        i3string_set_markup(text, new_block->is_markup);
+        new_block->min_width = (uint32_t)predict_text_width(text);
+        i3string_free(text);
+    }
+
+    i3string_set_markup(new_block->full_text, new_block->is_markup);
+    i3string_set_markup(new_block->short_text, new_block->is_markup);
+
     TAILQ_INSERT_TAIL(&statusline_buffer, new_block, blocks);
     return 1;
 }
index b60dda5c64ee2cc1a533b441ee11b5500bac36a6..c8d2e9561ad7b334cf421e70eef5fc1ce9cd3203 100644 (file)
@@ -217,6 +217,11 @@ size_t i3string_get_num_bytes(i3String *str);
  */
 bool i3string_is_markup(i3String *str);
 
+/**
+ * Set whether the i3String should use Pango markup.
+ */
+void i3string_set_markup(i3String *str, bool is_markup);
+
 /**
  * Returns the number of glyphs in an i3String.
  *
index 88fd198639bd377a9c40d57dc12f6ac944333a09..e6297f9eed89b0282a2b104fab360921eb723b07 100644 (file)
@@ -178,6 +178,13 @@ bool i3string_is_markup(i3String *str) {
     return str->is_markup;
 }
 
+/*
+ * Set whether the i3String should use Pango markup.
+ */
+void i3string_set_markup(i3String *str, bool is_markup) {
+    str->is_markup = is_markup;
+}
+
 /*
  * Returns the number of glyphs in an i3String.
  *