diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index ea2a6efb..db0a40c9 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -15,8 +15,8 @@ No configuration files are needed to start and run labwc. In accordance with XDG Base Directory Specification, configuration files are searched for in the following order: -- ${XDG_CONFIG_HOME:-$HOME/.config}/labwc -- ${XDG_CONFIG_DIRS:-/etc/xdg}/labwc +- ${XDG_CONFIG_HOME:-$HOME/.config}/labwc +- ${XDG_CONFIG_DIRS:-/etc/xdg}/labwc All configuration and theme files except autostart are re-loaded on receiving signal SIGHUP. @@ -136,6 +136,12 @@ The rest of this man page describes configuration options. ** Font size in pixels. Default is 10. +** + Font slant (normal or italic). Default is normal. + +** + Font weight (normal or bold). Default is normal. + ## KEYBOARD ** @@ -231,10 +237,10 @@ The rest of this man page describes configuration options. ## LIBINPUT ** - Define a category of devices to use the configuration values that + Define a category of devices to use the configuration values that follow. The category can be set to touch (devices that define a width and height), non-touch, default, or the name of a device. You can obtain - your devices name by running *libinput list-devices* (you may need to + your devices name by running *libinput list-devices* (you may need to be root or a part of the input group to perform this.) Any members of this category that are not set use the default for the device. With the exception of tap-to-click, which is enabled by default. @@ -252,9 +258,9 @@ The rest of this man page describes configuration options. ** [flat|adaptive] Set the pointer's acceleration profile for this category. Flat applies - no acceleration (the pointers velocity is constant), while adaptive - changes the pointers speed based the actual speed of your mouse or - finger on your touchpad. + no acceleration (the pointers velocity is constant), while adaptive + changes the pointers speed based the actual speed of your mouse or + finger on your touchpad. ** [yes|no] Enable or disable tap-to-click for this category. This is enabled by @@ -273,7 +279,7 @@ The rest of this man page describes configuration options. *device category="">* [yes|no] Enable or disable disable while typing for this category. DWT ignores any motion events while a keyboard is typing, and for a short while - after as well. + after as well. ## ENVIRONMENT VARIABLES @@ -289,7 +295,7 @@ The following keyboard-configuration variables are supported: *XKB_DEFAULT_RULES*, *XKB_DEFAULT_MODEL*, *XKB_DEFAULT_LAYOUT*, *XKB_DEFAULT_VARIANT* and *XKB_DEFAULT_OPTIONS*. -See xkeyboard-config(7) for details. +See xkeyboard-config(7) for details. # SEE ALSO diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 457038dc..12610e79 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -19,9 +19,24 @@ 8 - sans10 - sans10 - sans10 + + sans + 10 + normal + normal + + + sans + 10 + normal + normal + + + sans + 10 + normal + normal + diff --git a/include/common/font.h b/include/common/font.h index afb78cf9..22d9097a 100644 --- a/include/common/font.h +++ b/include/common/font.h @@ -4,11 +4,25 @@ struct lab_data_buffer; +enum font_slant { + FONT_SLANT_NORMAL, + FONT_SLANT_ITALIC +}; + +enum font_weight { + FONT_WEIGHT_NORMAL, + FONT_WEIGHT_BOLD +}; + struct font { char *name; int size; + enum font_slant slant; + enum font_weight weight; }; +struct _PangoFontDescription *font_to_pango_desc(struct font *font); + /** * font_height - get font vertical extents * @font: description of font including family name and size diff --git a/include/config/rcxml.h b/include/config/rcxml.h index 3f6b248d..ed1679e4 100644 --- a/include/config/rcxml.h +++ b/include/config/rcxml.h @@ -7,6 +7,7 @@ #include #include "common/buf.h" +#include "common/font.h" #include "config/libinput.h" #include "theme.h" @@ -25,12 +26,9 @@ struct rcxml { /* theme */ char *theme_name; int corner_radius; - char *font_name_activewindow; - char *font_name_menuitem; - char *font_name_osd; - int font_size_activewindow; - int font_size_menuitem; - int font_size_osd; + struct font font_activewindow; + struct font font_menuitem; + struct font font_osd; /* Pointer to current theme */ struct theme *theme; diff --git a/src/common/font.c b/src/common/font.c index ff1b84da..091863b6 100644 --- a/src/common/font.c +++ b/src/common/font.c @@ -11,6 +11,21 @@ #include "labwc.h" #include "buffer.h" +PangoFontDescription * +font_to_pango_desc(struct font *font) +{ + PangoFontDescription *desc = pango_font_description_new(); + pango_font_description_set_family(desc, font->name); + pango_font_description_set_size(desc, font->size * PANGO_SCALE); + if (font->slant == FONT_SLANT_ITALIC) { + pango_font_description_set_style(desc, PANGO_STYLE_ITALIC); + } + if (font->weight == FONT_WEIGHT_BOLD) { + pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); + } + return desc; +} + static PangoRectangle font_extents(struct font *font, const char *string) { @@ -25,9 +40,7 @@ font_extents(struct font *font, const char *string) surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1); c = cairo_create(surface); layout = pango_cairo_create_layout(c); - PangoFontDescription *desc = pango_font_description_new(); - pango_font_description_set_family(desc, font->name); - pango_font_description_set_size(desc, font->size * PANGO_SCALE); + PangoFontDescription *desc = font_to_pango_desc(font); pango_layout_set_font_description(layout, desc); pango_layout_set_text(layout, string, -1); @@ -108,9 +121,7 @@ font_buffer_create(struct lab_data_buffer **buffer, int max_width, pango_layout_set_text(layout, text, -1); pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); - PangoFontDescription *desc = pango_font_description_new(); - pango_font_description_set_family(desc, font->name); - pango_font_description_set_size(desc, font->size * PANGO_SCALE); + PangoFontDescription *desc = font_to_pango_desc(font); pango_layout_set_font_description(layout, desc); pango_font_description_free(desc); pango_cairo_update_layout(cairo, layout); diff --git a/src/common/scaled_font_buffer.c b/src/common/scaled_font_buffer.c index e608d20a..76f8ad75 100644 --- a/src/common/scaled_font_buffer.c +++ b/src/common/scaled_font_buffer.c @@ -86,6 +86,8 @@ scaled_font_buffer_update(struct scaled_font_buffer *self, const char *text, self->font.name = strdup(font->name); } self->font.size = font->size; + self->font.slant = font->slant; + self->font.weight = font->weight; memcpy(self->color, color, sizeof(self->color)); self->arrow = arrow ? strdup(arrow) : NULL; diff --git a/src/config/rcxml.c b/src/config/rcxml.c index fd70fd45..155a4527 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -236,6 +236,23 @@ fill_libinput_category(char *nodename, char *content) } } +static void +set_font_attr(struct font *font, const char *nodename, const char *content) +{ + if (!strcmp(nodename, "name")) { + zfree(font->name); + font->name = strdup(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; + } else if (!strcmp(nodename, "weight")) { + font->weight = !strcasecmp(content, "bold") ? + FONT_WEIGHT_BOLD : FONT_WEIGHT_NORMAL; + } +} + static void fill_font(char *nodename, char *content, enum font_place place) { @@ -250,36 +267,18 @@ fill_font(char *nodename, char *content, enum font_place place) * If is used without a place="" * attribute, we set all font variables */ - if (!strcmp(nodename, "name")) { - rc.font_name_activewindow = strdup(content); - rc.font_name_menuitem = strdup(content); - rc.font_name_osd = strdup(content); - } else if (!strcmp(nodename, "size")) { - rc.font_size_activewindow = atoi(content); - rc.font_size_menuitem = atoi(content); - rc.font_size_osd = atoi(content); - } + set_font_attr(&rc.font_activewindow, nodename, content); + set_font_attr(&rc.font_menuitem, nodename, content); + set_font_attr(&rc.font_osd, nodename, content); break; case FONT_PLACE_ACTIVEWINDOW: - if (!strcmp(nodename, "name")) { - rc.font_name_activewindow = strdup(content); - } else if (!strcmp(nodename, "size")) { - rc.font_size_activewindow = atoi(content); - } + set_font_attr(&rc.font_activewindow, nodename, content); break; case FONT_PLACE_MENUITEM: - if (!strcmp(nodename, "name")) { - rc.font_name_menuitem = strdup(content); - } else if (!strcmp(nodename, "size")) { - rc.font_size_menuitem = atoi(content); - } + set_font_attr(&rc.font_menuitem, nodename, content); break; case FONT_PLACE_OSD: - if (!strcmp(nodename, "name")) { - rc.font_name_osd = strdup(content); - } else if (!strcmp(nodename, "size")) { - rc.font_size_osd = atoi(content); - } + set_font_attr(&rc.font_osd, nodename, content); break; /* TODO: implement for all font places */ @@ -368,6 +367,10 @@ entry(xmlNode *node, char *nodename, char *content) fill_font(nodename, content, font_place); } else if (!strcmp(nodename, "size.font.theme")) { fill_font(nodename, content, font_place); + } else if (!strcmp(nodename, "slant.font.theme")) { + fill_font(nodename, content, font_place); + } else if (!strcmp(nodename, "weight.font.theme")) { + fill_font(nodename, content, font_place); } else if (!strcasecmp(nodename, "followMouse.focus")) { rc.focus_follow_mouse = get_bool(content); } else if (!strcasecmp(nodename, "raiseOnFocus.focus")) { @@ -491,9 +494,9 @@ rcxml_init() wl_list_init(&rc.libinput_categories); rc.xdg_shell_server_side_deco = true; rc.corner_radius = 8; - rc.font_size_activewindow = 10; - rc.font_size_menuitem = 10; - rc.font_size_osd = 10; + rc.font_activewindow.size = 10; + rc.font_menuitem.size = 10; + rc.font_osd.size = 10; rc.doubleclick_time = 500; rc.repeat_rate = 25; rc.repeat_delay = 600; @@ -666,14 +669,14 @@ post_processing(void) /* Replace all earlier mousebindings by later ones */ merge_mouse_bindings(); - if (!rc.font_name_activewindow) { - rc.font_name_activewindow = strdup("sans"); + if (!rc.font_activewindow.name) { + rc.font_activewindow.name = strdup("sans"); } - if (!rc.font_name_menuitem) { - rc.font_name_menuitem = strdup("sans"); + if (!rc.font_menuitem.name) { + rc.font_menuitem.name = strdup("sans"); } - if (!rc.font_name_osd) { - rc.font_name_osd = strdup("sans"); + if (!rc.font_osd.name) { + rc.font_osd.name = strdup("sans"); } if (!wl_list_length(&rc.libinput_categories)) { /* So we still allow tap to click by default */ @@ -759,9 +762,9 @@ no_config: void rcxml_finish(void) { - zfree(rc.font_name_activewindow); - zfree(rc.font_name_menuitem); - zfree(rc.font_name_osd); + zfree(rc.font_activewindow.name); + zfree(rc.font_menuitem.name); + zfree(rc.font_osd.name); zfree(rc.theme_name); struct keybind *k, *k_tmp; diff --git a/src/menu/menu.c b/src/menu/menu.c index 0aeae373..bb72cd1b 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -88,13 +88,10 @@ item_create(struct menu *menu, const char *text, bool show_arrow) menuitem->selectable = true; struct server *server = menu->server; struct theme *theme = server->theme; - struct font font = { - .name = rc.font_name_menuitem, - .size = rc.font_size_menuitem, - }; if (!menu->item_height) { - menu->item_height = font_height(&font) + 2 * MENU_ITEM_PADDING_Y; + menu->item_height = font_height(&rc.font_menuitem) + + 2 * MENU_ITEM_PADDING_Y; } menuitem->height = menu->item_height; @@ -139,9 +136,9 @@ item_create(struct menu *menu, const char *text, bool show_arrow) /* Font buffers */ const char *arrow = show_arrow ? "›" : NULL; scaled_font_buffer_update(menuitem->normal.buffer, text, item_max_width, - &font, theme->menu_items_text_color, arrow); + &rc.font_menuitem, theme->menu_items_text_color, arrow); scaled_font_buffer_update(menuitem->selected.buffer, text, item_max_width, - &font, theme->menu_items_active_text_color, arrow); + &rc.font_menuitem, theme->menu_items_active_text_color, arrow); /* Center font nodes */ x = MENU_ITEM_PADDING_X; diff --git a/src/osd.c b/src/osd.c index da6f5028..9b419f51 100644 --- a/src/osd.c +++ b/src/osd.c @@ -304,13 +304,7 @@ osd_update(struct server *server) (OSD_ITEM_WIDTH - 2 * OSD_ITEM_PADDING) * PANGO_SCALE); pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); - struct font font = { - .name = rc.font_name_osd, - .size = rc.font_size_osd, - }; - PangoFontDescription *desc = pango_font_description_new(); - pango_font_description_set_family(desc, font.name); - pango_font_description_set_size(desc, font.size * PANGO_SCALE); + PangoFontDescription *desc = font_to_pango_desc(&rc.font_osd); pango_layout_set_font_description(layout, desc); PangoTabArray *tabs = pango_tab_array_new_with_positions(2, TRUE, @@ -323,19 +317,20 @@ osd_update(struct server *server) y = OSD_BORDER_WIDTH; /* Center text entries on the y axis */ - int y_offset = (OSD_ITEM_HEIGHT - font_height(&font)) / 2; + int y_offset = (OSD_ITEM_HEIGHT - font_height(&rc.font_osd)) / 2; y += y_offset; if (show_workspace) { /* Center workspace indicator on the x axis */ - int x = font_width(&font, server->workspace_current->name); + int x = font_width(&rc.font_osd, server->workspace_current->name); x = (OSD_ITEM_WIDTH - x) / 2; cairo_move_to(cairo, x, y); + PangoWeight weight = pango_font_description_get_weight(desc); pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); pango_layout_set_font_description(layout, desc); pango_layout_set_text(layout, server->workspace_current->name, -1); pango_cairo_show_layout(cairo, layout); - pango_font_description_set_weight(desc, PANGO_WEIGHT_NORMAL); + pango_font_description_set_weight(desc, weight); pango_layout_set_font_description(layout, desc); y += OSD_ITEM_HEIGHT; } diff --git a/src/ssd/ssd_titlebar.c b/src/ssd/ssd_titlebar.c index 4f5bd9a0..b2cfe0ef 100644 --- a/src/ssd/ssd_titlebar.c +++ b/src/ssd/ssd_titlebar.c @@ -216,12 +216,6 @@ ssd_update_title(struct view *view) struct ssd_state_title *state = &view->ssd.state.title; bool title_unchanged = state->text && !strcmp(title, state->text); - /* TODO: Do we only have active window fonts? */ - struct font font = { - .name = rc.font_name_activewindow, - .size = rc.font_size_activewindow, - }; - float *text_color; struct ssd_part *part; struct ssd_sub_tree *subtree; @@ -261,8 +255,10 @@ ssd_update_title(struct view *view) } if (part->buffer) { + /* TODO: Do we only have active window fonts? */ scaled_font_buffer_update(part->buffer, title, - title_bg_width, &font, text_color, NULL); + title_bg_width, &rc.font_activewindow, + text_color, NULL); } /* And finally update the cache */ diff --git a/src/theme.c b/src/theme.c index bdd6a21a..45af59f8 100644 --- a/src/theme.c +++ b/src/theme.c @@ -473,11 +473,8 @@ create_corners(struct theme *theme) static void post_processing(struct theme *theme) { - struct font font = { - .name = rc.font_name_activewindow, - .size = rc.font_size_activewindow, - }; - theme->title_height = font_height(&font) + 2 * theme->padding_height; + theme->title_height = font_height(&rc.font_activewindow) + + 2 * theme->padding_height; if (rc.corner_radius >= theme->title_height) { theme->title_height = rc.corner_radius + 1; diff --git a/src/workspaces.c b/src/workspaces.c index 9e61f4b9..b6a9f664 100644 --- a/src/workspaces.c +++ b/src/workspaces.c @@ -57,16 +57,12 @@ _osd_update(struct server *server) uint16_t padding = 2; uint16_t rect_height = 20; uint16_t rect_width = 20; - struct font font = { - .name = rc.font_name_osd, - .size = rc.font_size_osd, - }; /* Dimensions */ size_t workspace_count = wl_list_length(&server->workspaces); uint16_t marker_width = workspace_count * (rect_width + padding) - padding; uint16_t width = margin * 2 + (marker_width < 200 ? 200 : marker_width); - uint16_t height = margin * 3 + rect_height + font_height(&font); + uint16_t height = margin * 3 + rect_height + font_height(&rc.font_osd); cairo_t *cairo; cairo_surface_t *surface; @@ -113,13 +109,11 @@ _osd_update(struct server *server) pango_layout_set_width(layout, (width - 2 * margin) * PANGO_SCALE); pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END); - PangoFontDescription *desc = pango_font_description_new(); - pango_font_description_set_family(desc, font.name); - pango_font_description_set_size(desc, font.size * PANGO_SCALE); + PangoFontDescription *desc = font_to_pango_desc(&rc.font_osd); pango_layout_set_font_description(layout, desc); /* Center workspace indicator on the x axis */ - x = font_width(&font, server->workspace_current->name); + x = font_width(&rc.font_osd, server->workspace_current->name); x = (width - x) / 2; cairo_move_to(cairo, x, margin * 2 + rect_height); //pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD);