diff --git a/include/common/borderset.h b/include/common/borderset.h index d4016d8c..392f2597 100644 --- a/include/common/borderset.h +++ b/include/common/borderset.h @@ -18,6 +18,8 @@ struct borderset { enum border_type type; // So we can disambiguate multiple possible designs cached together int bevelSize; + int highlight; + int lowlight; struct lab_data_buffer *top; struct lab_data_buffer *left; struct lab_data_buffer *right; @@ -45,9 +47,11 @@ struct bufferset { extern struct borderset *border_cache; -struct borderset *get_borders(uint32_t id, int size, enum border_type, int bevelSize); +struct borderset *get_borders(uint32_t id, int size, enum border_type, int bevelSize, + int highlight, int lowlight); -struct borderset *create_buffer(uint32_t id, int size, enum border_type, int bevelSize); +struct borderset *create_buffer(uint32_t id, int size, enum border_type, int bevelSize, + int highlight, int lowlight); struct bufferset *generate_bufferset(struct wlr_scene_tree *tree, struct borderset *borderset, int bw); diff --git a/src/common/borderset.c b/src/common/borderset.c index 59d9827c..704a302c 100644 --- a/src/common/borderset.c +++ b/src/common/borderset.c @@ -6,7 +6,8 @@ #include "common/macros.h" #include "buffer.h" -struct borderset *get_borders(uint32_t id, int size, enum border_type type, int bevelSize) +struct borderset *get_borders(uint32_t id, int size, enum border_type type, int bevelSize, + int highlight, int lowlight) { struct borderset *current = border_cache; struct borderset *last; @@ -32,7 +33,8 @@ struct borderset *get_borders(uint32_t id, int size, enum border_type type, int while (current) { if (current->size == size && current->id == id && - current->type == type && current->bevelSize == bevelSize) { + current->type == type && current->bevelSize == bevelSize && + current->highlight == highlight && current->lowlight == lowlight) { return current; } last = current; @@ -41,16 +43,17 @@ struct borderset *get_borders(uint32_t id, int size, enum border_type type, int // Fall through, we need to create a buffer. if (!border_cache) { - border_cache = create_buffer(id, size, type, bevelSize); + border_cache = create_buffer(id, size, type, bevelSize, highlight, lowlight); return border_cache; } else { - last->next = create_buffer(id, size, type, bevelSize); + last->next = create_buffer(id, size, type, bevelSize, highlight, lowlight); return last->next; } return NULL; } -struct borderset *create_buffer(uint32_t id, int size, enum border_type type, int bevelSize) +struct borderset *create_buffer(uint32_t id, int size, enum border_type type, + int bevelSize, int highlight, int lowlight) { struct borderset *new_borderset = znew(*new_borderset); @@ -59,6 +62,8 @@ struct borderset *create_buffer(uint32_t id, int size, enum border_type type, in new_borderset->size = size; new_borderset->type = type; new_borderset->bevelSize = bevelSize; + new_borderset->highlight = highlight; + new_borderset->lowlight = lowlight; // Use ID as a AARRGGBB colour uint8_t a = id >> 24 & 255; @@ -66,23 +71,23 @@ struct borderset *create_buffer(uint32_t id, int size, enum border_type type, in uint8_t g = id >> 8 & 255; uint8_t b = id & 255; - uint32_t r1 = r * 5 / 4; + uint32_t r1 = r * (256+highlight) / 256; if (r1 > a) { r1 = a; } - uint32_t g1 = g * 5 / 4; + uint32_t g1 = g * (256+highlight) / 256; if (g1 > a) { g1 = a; } - uint32_t b1 = b * 5 / 4; + uint32_t b1 = b * (256+highlight) / 256; if (b1 > a) { b1 = a; } /* darker outline */ - uint32_t r0 = r / 2; - uint32_t g0 = g / 2; - uint32_t b0 = b / 2; + uint32_t r0 = r * (256 - lowlight) / 256; + uint32_t g0 = g * (256 - lowlight) / 256; + uint32_t b0 = b * (256 - lowlight) / 256; uint32_t hl32 = ((uint32_t)a << 24) | ((uint32_t)r1 << 16) | ((uint32_t)g1 << 8) | (uint32_t)b1; diff --git a/src/common/lab-scene-rect.c b/src/common/lab-scene-rect.c index ad5c4cf7..6818c70d 100644 --- a/src/common/lab-scene-rect.c +++ b/src/common/lab-scene-rect.c @@ -59,7 +59,7 @@ lab_scene_rect_create(struct wlr_scene_tree *parent, (uint32_t)(g*255) << 8 | (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, - opts->border_type, opts->bevel_width); + opts->border_type, opts->bevel_width, 128, 64); border->textured_borders = generate_bufferset(border->tree, renderedborders, bw); } else { diff --git a/src/menu/menu.c b/src/menu/menu.c index 61d9caf7..17d9f010 100644 --- a/src/menu/menu.c +++ b/src/menu/menu.c @@ -207,7 +207,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color, (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, rc.theme->menu_items_active_border_type, - rc.theme->menu_items_active_bevel_width); + rc.theme->menu_items_active_bevel_width, 128, 64); bufferset = generate_bufferset(tree, renderedborders, bw); } else if (rc.theme->menu_items_border_type && !state) { float r = bg_color[0]; @@ -221,7 +221,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color, (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, rc.theme->menu_items_border_type, - rc.theme->menu_items_bevel_width); + rc.theme->menu_items_bevel_width, 128, 64); bufferset = generate_bufferset(tree, renderedborders, bw); } @@ -410,7 +410,7 @@ title_create_scene(struct menuitem *menuitem, int *item_y) (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, rc.theme->menu_title_border_type, - rc.theme->menu_title_bevel_width); + rc.theme->menu_title_bevel_width, 128, 64); bufferset = generate_bufferset(menuitem->tree, renderedborders, bw); } diff --git a/src/ssd/resize-indicator.c b/src/ssd/resize-indicator.c index 8f17e3e8..58a5e89d 100644 --- a/src/ssd/resize-indicator.c +++ b/src/ssd/resize-indicator.c @@ -51,7 +51,7 @@ resize_indicator_reconfigure_view(struct resize_indicator *indicator) (uint32_t)(g*255) << 8 | (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, - theme->osd_border_type, theme->osd_border_bevel_width); + theme->osd_border_type, theme->osd_border_bevel_width, 128, 64); indicator->textured_borders = generate_bufferset(indicator->tree, renderedborders, bw); } diff --git a/src/ssd/ssd-border.c b/src/ssd/ssd-border.c index 8885b0d1..18df8dfd 100644 --- a/src/ssd/ssd-border.c +++ b/src/ssd/ssd-border.c @@ -57,7 +57,7 @@ ssd_border_create(struct ssd *ssd) (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, theme->window[active].border_type, - theme->window[active].bevel_width); + theme->window[active].bevel_width, 128, 64); subtree->textured_borders = generate_bufferset(subtree->tree, renderedborders, bw); } else { diff --git a/src/ssd/ssd-titlebar.c b/src/ssd/ssd-titlebar.c index 9b2aa9dc..06516c16 100644 --- a/src/ssd/ssd-titlebar.c +++ b/src/ssd/ssd-titlebar.c @@ -69,7 +69,8 @@ ssd_titlebar_create(struct ssd *ssd) struct borderset *renderedborders = get_borders(colour32, theme->window[active].title_bg.border_width, theme->window[active].title_bg.border_type, - theme->window[active].title_bg.bevel_width); + theme->window[active].title_bg.bevel_width, + 128, 64); subtree->textured_borders = generate_bufferset(subtree->tree, renderedborders, theme->window[active].title_bg.border_width); diff --git a/src/theme.c b/src/theme.c index 3fa9600a..6ce6557e 100644 --- a/src/theme.c +++ b/src/theme.c @@ -114,7 +114,7 @@ static void draw_beveled_border_on_button(cairo_t *cairo, int w, int h, int acti (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, rc.theme->window[active].button_border_type, - rc.theme->window[active].button_bevel_width); + rc.theme->window[active].button_bevel_width, 128, 64); cairo_set_source_surface(cairo, renderedborders->top->surface, 0, 0); cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT); diff --git a/src/workspaces.c b/src/workspaces.c index 892f95ff..eaebfb6a 100644 --- a/src/workspaces.c +++ b/src/workspaces.c @@ -115,7 +115,8 @@ _osd_update(void) (uint32_t)(g*255) << 8 | (uint32_t)(b*255); struct borderset *renderedborders = get_borders(colour32, bw, - theme->osd_border_type, theme->osd_border_bevel_width); + theme->osd_border_type, theme->osd_border_bevel_width, + 128, 64); cairo_set_source_surface(cairo, renderedborders->top->surface, 0, 0); cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);