diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index 1ca8305b..cd55e127 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -448,6 +448,7 @@ extending outward from the snapped edge. - ActiveWindow - titlebar of active window - InactiveWindow - titlebar of all windows that aren't focused by the cursor + - MenuHeader - menu header font ie separator labels - MenuItem - menu item (currently only root menu) - OnScreenDisplay - items in the on screen display If no place attribute is provided, the setting will be applied to all @@ -460,7 +461,7 @@ extending outward from the snapped edge. Font size in pixels. Default is 10. ** - Font slant (normal or italic). Default is normal. + Font slant (normal, oblique or italic). Default is normal. ** Font weight (normal or bold). Default is normal. diff --git a/docs/labwc-theme.5.scd b/docs/labwc-theme.5.scd index 29a832f5..e90ba682 100644 --- a/docs/labwc-theme.5.scd +++ b/docs/labwc-theme.5.scd @@ -67,6 +67,10 @@ labwc-config(5). Vertical padding of menu text entries in pixels. Default is 4. +*menu.title.text.justify* + Specifies how menu titles are aligned in the titlebar. + Type justification. Default Left. + *menu.overlap.x* Horizontal overlap in pixels between submenus and their parents. A positive value move submenus over the top of their parents, whereas a @@ -178,6 +182,12 @@ elements are not listed here, but are supported. Menu title color. Default #589bda. Note: A menu title is a separator with a label. +*menu.title.bg.color* + Background color of separator label. + +*menu.title.text.color* + Text color of separator label. + *osd.bg.color* Background color of on-screen-display. Inherits *window.active.title.bg.color* if not set. diff --git a/docs/menu.xml b/docs/menu.xml index a23f1b91..0c80c1cb 100644 --- a/docs/menu.xml +++ b/docs/menu.xml @@ -61,6 +61,12 @@ + + diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 64690ca6..02f451fa 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -43,6 +43,12 @@ normal normal + + sans + 10 + normal + normal + sans 10 diff --git a/docs/themerc b/docs/themerc index e54dfb96..abe6ff65 100644 --- a/docs/themerc +++ b/docs/themerc @@ -58,11 +58,13 @@ menu.items.active.bg.color: #e1dedb menu.items.active.text.color: #000000 menu.items.padding.x: 7 menu.items.padding.y: 4 +menu.title.text.justify: left menu.separator.width: 1 menu.separator.padding.width: 6 menu.separator.padding.height: 3 menu.separator.color: #888888 menu.title.bg.color: #589bda +menu.title.text.color: #ffff00 # on screen display (window-cycle dialog) osd.bg.color: #e1dedb diff --git a/include/common/font.h b/include/common/font.h index ddca15aa..7684f7e2 100644 --- a/include/common/font.h +++ b/include/common/font.h @@ -6,7 +6,8 @@ struct lab_data_buffer; enum font_slant { FONT_SLANT_NORMAL = 0, - FONT_SLANT_ITALIC + FONT_SLANT_ITALIC, + FONT_SLANT_OBLIQUE }; enum font_weight { diff --git a/include/config/rcxml.h b/include/config/rcxml.h index 0a0ed86a..9a17c1ba 100644 --- a/include/config/rcxml.h +++ b/include/config/rcxml.h @@ -86,6 +86,7 @@ struct rcxml { bool shadows_enabled; struct font font_activewindow; struct font font_inactivewindow; + struct font font_menuheader; struct font font_menuitem; struct font font_osd; diff --git a/include/menu/menu.h b/include/menu/menu.h index f4c60325..1c4d900e 100644 --- a/include/menu/menu.h +++ b/include/menu/menu.h @@ -135,4 +135,7 @@ void menu_close_root(struct server *server); /* menu_reconfigure - reload theme and content */ void menu_reconfigure(struct server *server); +void create_client_send_to_menu(struct server *server); +void create_client_list_combined_menu(struct server *server); + #endif /* LABWC_MENU_H */ diff --git a/include/theme.h b/include/theme.h index 4ad3855c..71bf1ae9 100644 --- a/include/theme.h +++ b/include/theme.h @@ -44,6 +44,7 @@ struct theme { float window_active_label_text_color[4]; float window_inactive_label_text_color[4]; enum lab_justification window_label_text_justify; + enum lab_justification menu_title_text_justify; /* button width */ int window_button_width; @@ -77,6 +78,7 @@ struct theme { float menu_separator_color[4]; float menu_title_bg_color[4]; + float menu_title_text_color[4]; int osd_border_width; diff --git a/src/action.c b/src/action.c index 67e4fe0e..6f0c29b4 100644 --- a/src/action.c +++ b/src/action.c @@ -630,6 +630,10 @@ show_menu(struct server *server, struct view *view, return; } + /* need to be current to be useful */ + create_client_list_combined_menu(menu->server); + create_client_send_to_menu(menu->server); + int x = server->seat.cursor->x; int y = server->seat.cursor->y; @@ -655,11 +659,15 @@ show_menu(struct server *server, struct view *view, y = rc.resize_popup_fixed_position.y + output_box.y; } else { /* Center the menu */ struct menuitem *item; - int max_width = 0; + struct theme *theme = server->theme; + int max_width = theme->menu_min_width; wl_list_for_each(item, &menu->menuitems, link) { if (item->native_width > max_width) { - max_width = item->native_width; + max_width = item->native_width < + theme->menu_max_width ? + item->native_width : + theme->menu_max_width; } } x = (output->usable_area.width / 2) - diff --git a/src/common/font.c b/src/common/font.c index 6e12e780..e917dec9 100644 --- a/src/common/font.c +++ b/src/common/font.c @@ -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); } diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 65a821ea..7c482f50 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -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") @@ -1277,6 +1289,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); @@ -1523,6 +1536,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"); } @@ -1728,6 +1744,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); diff --git a/src/menu/menu.c b/src/menu/menu.c index a482a185..c8b1ce88 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -138,6 +138,14 @@ menu_update_width(struct menu *menu) 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) { @@ -290,9 +298,16 @@ separator_create(struct menu *menu, const char *label) struct server *server = menu->server; struct theme *theme = server->theme; + /* + * Convert empty label ie "", to a regular separator line + * if one desires an empty title line then set label to " " + */ + if (label && !strlen(label)) { + menuitem->type = LAB_MENU_SEPARATOR_LINE; + } 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; @@ -309,6 +324,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; @@ -325,8 +342,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; diff --git a/src/theme.c b/src/theme.c index a22d0936..a2abe01e 100644 --- a/src/theme.c +++ b/src/theme.c @@ -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("Left"); theme->window_button_width = 26; @@ -529,6 +530,7 @@ theme_builtin(struct theme *theme, struct server *server) parse_hexstr("#888888", theme->menu_separator_color); parse_hexstr("#589bda", theme->menu_title_bg_color); + parse_hexstr("#000000", theme->menu_title_text_color); theme->osd_window_switcher_width = 600; theme->osd_window_switcher_width_is_percent = false; @@ -606,6 +608,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 +777,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); }