menu: add title theme options (#2097)

Add theme options `menu.title.text.color` and `menu.title.text.justify`.

Add font place MenuHeader: `<font place="MenuHeader">`

Add `Oblique` font style

```
<theme>
  <font>
    <slant>Oblique</slant>
  </font>
</theme>
```
This commit is contained in:
droc12345 2024-08-21 12:27:07 -05:00 committed by GitHub
parent 6564e1bc8d
commit 8fda9968e6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 79 additions and 7 deletions

View file

@ -20,6 +20,9 @@ font_to_pango_desc(struct font *font)
if (font->slant == FONT_SLANT_ITALIC) {
pango_font_description_set_style(desc, PANGO_STYLE_ITALIC);
}
if (font->slant == FONT_SLANT_OBLIQUE) {
pango_font_description_set_style(desc, PANGO_STYLE_OBLIQUE);
}
if (font->weight == FONT_WEIGHT_BOLD) {
pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);
}

View file

@ -69,6 +69,7 @@ enum font_place {
FONT_PLACE_UNKNOWN,
FONT_PLACE_ACTIVEWINDOW,
FONT_PLACE_INACTIVEWINDOW,
FONT_PLACE_MENUHEADER,
FONT_PLACE_MENUITEM,
FONT_PLACE_OSD,
/* TODO: Add all places based on Openbox's rc.xml */
@ -691,8 +692,13 @@ set_font_attr(struct font *font, const char *nodename, const char *content)
} else if (!strcmp(nodename, "size")) {
font->size = atoi(content);
} else if (!strcmp(nodename, "slant")) {
font->slant = !strcasecmp(content, "italic") ?
FONT_SLANT_ITALIC : FONT_SLANT_NORMAL;
if (!strcasecmp(content, "italic")) {
font->slant = FONT_SLANT_ITALIC;
} else if (!strcasecmp(content, "oblique")) {
font->slant = FONT_SLANT_OBLIQUE;
} else {
font->slant = FONT_SLANT_NORMAL;
}
} else if (!strcmp(nodename, "weight")) {
font->weight = !strcasecmp(content, "bold") ?
FONT_WEIGHT_BOLD : FONT_WEIGHT_NORMAL;
@ -715,6 +721,7 @@ fill_font(char *nodename, char *content, enum font_place place)
*/
set_font_attr(&rc.font_activewindow, nodename, content);
set_font_attr(&rc.font_inactivewindow, nodename, content);
set_font_attr(&rc.font_menuheader, nodename, content);
set_font_attr(&rc.font_menuitem, nodename, content);
set_font_attr(&rc.font_osd, nodename, content);
break;
@ -724,6 +731,9 @@ fill_font(char *nodename, char *content, enum font_place place)
case FONT_PLACE_INACTIVEWINDOW:
set_font_attr(&rc.font_inactivewindow, nodename, content);
break;
case FONT_PLACE_MENUHEADER:
set_font_attr(&rc.font_menuheader, nodename, content);
break;
case FONT_PLACE_MENUITEM:
set_font_attr(&rc.font_menuitem, nodename, content);
break;
@ -748,6 +758,8 @@ enum_font_place(const char *place)
return FONT_PLACE_ACTIVEWINDOW;
} else if (!strcasecmp(place, "InactiveWindow")) {
return FONT_PLACE_INACTIVEWINDOW;
} else if (!strcasecmp(place, "MenuHeader")) {
return FONT_PLACE_MENUHEADER;
} else if (!strcasecmp(place, "MenuItem")) {
return FONT_PLACE_MENUITEM;
} else if (!strcasecmp(place, "OnScreenDisplay")
@ -1265,6 +1277,7 @@ rcxml_init(void)
init_font_defaults(&rc.font_activewindow);
init_font_defaults(&rc.font_inactivewindow);
init_font_defaults(&rc.font_menuheader);
init_font_defaults(&rc.font_menuitem);
init_font_defaults(&rc.font_osd);
@ -1510,6 +1523,9 @@ post_processing(void)
if (!rc.font_inactivewindow.name) {
rc.font_inactivewindow.name = xstrdup("sans");
}
if (!rc.font_menuheader.name) {
rc.font_menuheader.name = xstrdup("sans");
}
if (!rc.font_menuitem.name) {
rc.font_menuitem.name = xstrdup("sans");
}
@ -1715,6 +1731,7 @@ rcxml_finish(void)
{
zfree(rc.font_activewindow.name);
zfree(rc.font_inactivewindow.name);
zfree(rc.font_menuheader.name);
zfree(rc.font_menuitem.name);
zfree(rc.font_osd.name);
zfree(rc.theme_name);

View file

@ -141,6 +141,19 @@ menu_update_width(struct menu *menu)
wlr_scene_rect_set_size(
wlr_scene_rect_from_node(item->normal.text),
width, theme->menu_separator_line_thickness);
} else if (item->type == LAB_MENU_TITLE) {
if (item->native_width > max_width) {
scaled_font_buffer_set_max_width(item->normal.buffer,
max_width);
}
if (theme->menu_title_text_justify == LAB_JUSTIFY_CENTER) {
int x, y;
x = (max_width - theme->menu_item_padding_x -
item->native_width) / 2;
x = x < 0 ? 0 : x;
y = (theme->menu_item_height - item->normal.buffer->height) / 2;
wlr_scene_node_set_position(item->normal.text, x, y);
}
}
if (item->selectable) {
@ -295,7 +308,7 @@ separator_create(struct menu *menu, const char *label)
if (menuitem->type == LAB_MENU_TITLE) {
menuitem->height = theme->menu_item_height;
menuitem->native_width = font_width(&rc.font_menuitem, label);
menuitem->native_width = font_width(&rc.font_menuheader, label);
} else if (menuitem->type == LAB_MENU_SEPARATOR_LINE) {
menuitem->height = theme->menu_separator_line_thickness +
2 * theme->menu_separator_padding_height;
@ -312,6 +325,8 @@ separator_create(struct menu *menu, const char *label)
/* Item background nodes */
float *bg_color = menuitem->type == LAB_MENU_TITLE
? theme->menu_title_bg_color : theme->menu_items_bg_color;
float *text_color = menuitem->type == LAB_MENU_TITLE
? theme->menu_title_text_color : theme->menu_items_text_color;
menuitem->normal.background = &wlr_scene_rect_create(
menuitem->normal.tree,
menu->size.width, menuitem->height, bg_color)->node;
@ -328,8 +343,8 @@ separator_create(struct menu *menu, const char *label)
menuitem->normal.text = &menuitem->normal.buffer->scene_buffer->node;
/* Font buffer */
scaled_font_buffer_update(menuitem->normal.buffer, label,
menuitem->native_width, &rc.font_menuitem,
theme->menu_items_text_color, bg_color, /* arrow */ NULL);
menuitem->native_width, &rc.font_menuheader,
text_color, bg_color, /* arrow */ NULL);
/* Center font nodes */
int x, y;
x = theme->menu_item_padding_x;

View file

@ -487,6 +487,7 @@ theme_builtin(struct theme *theme, struct server *server)
parse_hexstr("#000000", theme->window_active_label_text_color);
parse_hexstr("#000000", theme->window_inactive_label_text_color);
theme->window_label_text_justify = parse_justification("Center");
theme->menu_title_text_justify = parse_justification("Center");
theme->window_button_width = 26;
@ -530,6 +531,8 @@ theme_builtin(struct theme *theme, struct server *server)
parse_hexstr("#589bda", theme->menu_title_bg_color);
parse_hexstr("#ffffff", theme->menu_title_text_color);
theme->osd_window_switcher_width = 600;
theme->osd_window_switcher_width_is_percent = false;
theme->osd_window_switcher_padding = 4;
@ -606,6 +609,9 @@ entry(struct theme *theme, const char *key, const char *value)
if (match_glob(key, "menu.items.padding.y")) {
theme->menu_item_padding_y = atoi(value);
}
if (match_glob(key, "menu.title.text.justify")) {
theme->menu_title_text_justify = parse_justification(value);
}
if (match_glob(key, "menu.overlap.x")) {
theme->menu_overlap_x = atoi(value);
}
@ -772,6 +778,10 @@ entry(struct theme *theme, const char *key, const char *value)
parse_hexstr(value, theme->menu_title_bg_color);
}
if (match_glob(key, "menu.title.text.color")) {
parse_hexstr(value, theme->menu_title_text_color);
}
if (match_glob(key, "osd.bg.color")) {
parse_hexstr(value, theme->osd_bg_color);
}