From c6681876b5efd750acd732b42ff0eff790a2594f Mon Sep 17 00:00:00 2001 From: Alex Chernika Date: Wed, 15 Apr 2026 00:15:12 +0200 Subject: [PATCH] tree-wide: use markup only when an accelerator is defined with _ --- include/menu/menu.h | 1 + include/scaled-buffer/scaled-font-buffer.h | 3 ++- src/cycle/osd-classic.c | 6 +++--- src/cycle/osd-thumbnail.c | 2 +- src/menu/menu.c | 24 +++++++++------------- src/scaled-buffer/scaled-font-buffer.c | 6 ++++-- src/ssd/resize-indicator.c | 2 +- src/ssd/ssd-titlebar.c | 2 +- 8 files changed, 23 insertions(+), 23 deletions(-) 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;