Add infrastructure to generatecustom highlight/lowlight

This commit is contained in:
Jack Zeal 2026-04-06 09:58:09 -07:00
parent 2591661005
commit 6dffb80d6a
9 changed files with 33 additions and 22 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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 {

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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 {

View file

@ -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);

View file

@ -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);

View file

@ -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);