diff --git a/include/menu/menu.h b/include/menu/menu.h
index e0e39cf5..3d546efa 100644
--- a/include/menu/menu.h
+++ b/include/menu/menu.h
@@ -27,6 +27,7 @@ struct menuitem {
struct menu *parent;
struct menu *submenu;
bool selectable;
+ bool use_markup;
enum menuitem_type type;
int native_width;
struct wlr_scene_tree *tree;
diff --git a/include/scaled-buffer/scaled-font-buffer.h b/include/scaled-buffer/scaled-font-buffer.h
index a5e95087..a76fe03f 100644
--- a/include/scaled-buffer/scaled-font-buffer.h
+++ b/include/scaled-buffer/scaled-font-buffer.h
@@ -15,6 +15,7 @@ struct scaled_font_buffer {
/* Private */
char *text;
+ bool use_markup;
int max_width;
float color[4];
float bg_color[4];
@@ -71,6 +72,6 @@ scaled_font_buffer_create_for_titlebar(struct wlr_scene_tree *parent,
*/
void scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
int max_width, struct font *font, const float *color,
- const float *bg_color);
+ const float *bg_color, bool use_markup);
#endif /* LABWC_SCALED_FONT_BUFFER_H */
diff --git a/src/cycle/osd-classic.c b/src/cycle/osd-classic.c
index 7e5abfb6..685b58b8 100644
--- a/src/cycle/osd-classic.c
+++ b/src/cycle/osd-classic.c
@@ -58,8 +58,8 @@ create_fields_scene(struct view *view,
struct scaled_font_buffer *font_buffer =
scaled_font_buffer_create(parent);
scaled_font_buffer_update(font_buffer,
- buf.data, field_width,
- &rc.font_osd, text_color, bg_color);
+ buf.data, field_width, &rc.font_osd,
+ text_color, bg_color, false);
node = &font_buffer->scene_buffer->node;
height = font_height(&rc.font_osd);
}
@@ -143,7 +143,7 @@ cycle_osd_classic_init(struct cycle_osd_output *osd_output)
wlr_scene_node_set_position(&font_buffer->scene_buffer->node,
x, y + (switcher_theme->item_height - font_height(&font)) / 2);
scaled_font_buffer_update(font_buffer, workspace_name, 0,
- &font, text_color, bg_color);
+ &font, text_color, bg_color, false);
y += switcher_theme->item_height;
}
diff --git a/src/cycle/osd-thumbnail.c b/src/cycle/osd-thumbnail.c
index 623708a0..eba0249e 100644
--- a/src/cycle/osd-thumbnail.c
+++ b/src/cycle/osd-thumbnail.c
@@ -112,7 +112,7 @@ create_label(struct wlr_scene_tree *parent, struct view *view,
scaled_font_buffer_create(parent);
scaled_font_buffer_update(buffer, buf.data,
switcher_theme->item_width - 2 * switcher_theme->item_padding,
- &rc.font_osd, text_color, bg_color);
+ &rc.font_osd, text_color, bg_color, false);
buf_reset(&buf);
wlr_scene_node_set_position(&buffer->scene_buffer->node,
(switcher_theme->item_width - buffer->width) / 2, y);
diff --git a/src/menu/menu.c b/src/menu/menu.c
index 372f662f..58a2b96a 100644
--- a/src/menu/menu.c
+++ b/src/menu/menu.c
@@ -155,22 +155,16 @@ item_create(struct menu *menu, char *text, const char *icon_name, bool show_arro
size_t bytes = mbrtoc32(&codepoint, it + 1,
MB_CUR_MAX, &state);
if (bytes > 0 && bytes <= 4) {
- accelerator =
- (uint32_t)towlower((wint_t)codepoint);
+ accelerator = (uint32_t)towlower((wint_t)codepoint);
}
if (*(it + 1) != '\0') {
int underscore_index = it - text;
- new_text = malloc(strlen(text) + 8);
- if (!new_text) {
- break;
- }
- memcpy(new_text, text, underscore_index);
- sprintf(new_text + underscore_index, "%c%s",
- *(it + 1), it + 2);
+ new_text = strdup_printf("%.*s%.*s%s",
+ underscore_index, text, (int)bytes,
+ it + 1, it + 1 + bytes);
+ break;
}
-
- break;
}
it++;
}
@@ -189,8 +183,10 @@ item_create(struct menu *menu, char *text, const char *icon_name, bool show_arro
menuitem->accelerator = accelerator;
if (new_text) {
menuitem->text = xstrdup(new_text);
+ menuitem->use_markup = true;
} else {
menuitem->text = xstrdup(text);
+ menuitem->use_markup = false;
}
#if HAVE_LIBSFDO
@@ -263,7 +259,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
struct scaled_font_buffer *label_buffer = scaled_font_buffer_create(tree);
assert(label_buffer);
scaled_font_buffer_update(label_buffer, item->text, label_max_width,
- &rc.font_menuitem, text_color, bg_color);
+ &rc.font_menuitem, text_color, bg_color, item->use_markup);
/* Vertically center and left-align label */
int x = theme->menu_items_padding_x + icon_width;
int y = (theme->menu_item_height - label_buffer->height) / 2;
@@ -277,7 +273,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
struct scaled_font_buffer *arrow_buffer = scaled_font_buffer_create(tree);
assert(arrow_buffer);
scaled_font_buffer_update(arrow_buffer, item->arrow, -1,
- &rc.font_menuitem, text_color, bg_color);
+ &rc.font_menuitem, text_color, bg_color, false);
/* Vertically center and right-align arrow */
x += label_max_width + theme->menu_items_padding_x;
y = (theme->menu_item_height - label_buffer->height) / 2;
@@ -416,7 +412,7 @@ title_create_scene(struct menuitem *menuitem, int *item_y)
scaled_font_buffer_create(menuitem->normal_tree);
assert(title_font_buffer);
scaled_font_buffer_update(title_font_buffer, menuitem->text,
- text_width, &rc.font_menuheader, text_color, bg_color);
+ text_width, &rc.font_menuheader, text_color, bg_color, false);
int title_x = 0;
switch (theme->menu_title_text_justify) {
diff --git a/src/scaled-buffer/scaled-font-buffer.c b/src/scaled-buffer/scaled-font-buffer.c
index 49c9d840..229d97d9 100644
--- a/src/scaled-buffer/scaled-font-buffer.c
+++ b/src/scaled-buffer/scaled-font-buffer.c
@@ -26,7 +26,7 @@ _create_buffer(struct scaled_buffer *scaled_buffer, double scale)
/* Buffer gets free'd automatically along the backing wlr_buffer */
font_buffer_create(&buffer, self->max_width, self->height, self->text,
- &self->font, self->color, bg_pattern, scale, true);
+ &self->font, self->color, bg_pattern, scale, self->use_markup);
if (!buffer) {
wlr_log(WLR_ERROR, "font_buffer_create() failed");
@@ -56,6 +56,7 @@ _equal(struct scaled_buffer *scaled_buffer_a,
struct scaled_font_buffer *b = scaled_buffer_b->data;
return str_equal(a->text, b->text)
+ && a->use_markup == b->use_markup
&& a->max_width == b->max_width
&& str_equal(a->font.name, b->font.name)
&& a->font.size == b->font.size
@@ -107,7 +108,7 @@ scaled_font_buffer_create_for_titlebar(struct wlr_scene_tree *parent,
void
scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
int max_width, struct font *font, const float *color,
- const float *bg_color)
+ const float *bg_color, bool use_markup)
{
assert(self);
assert(text);
@@ -120,6 +121,7 @@ scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text,
/* Update internal state */
self->text = xstrdup(text);
+ self->use_markup = use_markup;
self->max_width = max_width;
if (font->name) {
self->font.name = xstrdup(font->name);
diff --git a/src/ssd/resize-indicator.c b/src/ssd/resize-indicator.c
index fa1166a3..45df44e1 100644
--- a/src/ssd/resize-indicator.c
+++ b/src/ssd/resize-indicator.c
@@ -202,7 +202,7 @@ resize_indicator_update(struct view *view)
wlr_scene_node_set_position(&indicator->tree->node, x, y);
scaled_font_buffer_update(indicator->text, text, width, &rc.font_osd,
- rc.theme->osd_label_text_color, rc.theme->osd_bg_color);
+ rc.theme->osd_label_text_color, rc.theme->osd_bg_color, false);
}
void
diff --git a/src/ssd/ssd-titlebar.c b/src/ssd/ssd-titlebar.c
index d1a08810..816221db 100644
--- a/src/ssd/ssd-titlebar.c
+++ b/src/ssd/ssd-titlebar.c
@@ -473,7 +473,7 @@ ssd_update_title(struct ssd *ssd)
const float bg_color[4] = {0, 0, 0, 0}; /* ignored */
scaled_font_buffer_update(subtree->title, view->title,
title_bg_width, font,
- text_color, bg_color);
+ text_color, bg_color, false);
/* And finally update the cache */
dstate->width = subtree->title->width;