mirror of
https://github.com/labwc/labwc.git
synced 2026-04-09 08:21:18 -04:00
Add infrastructure to generatecustom highlight/lowlight
This commit is contained in:
parent
2591661005
commit
6dffb80d6a
9 changed files with 33 additions and 22 deletions
|
|
@ -18,6 +18,8 @@ struct borderset {
|
||||||
enum border_type type;
|
enum border_type type;
|
||||||
// So we can disambiguate multiple possible designs cached together
|
// So we can disambiguate multiple possible designs cached together
|
||||||
int bevelSize;
|
int bevelSize;
|
||||||
|
int highlight;
|
||||||
|
int lowlight;
|
||||||
struct lab_data_buffer *top;
|
struct lab_data_buffer *top;
|
||||||
struct lab_data_buffer *left;
|
struct lab_data_buffer *left;
|
||||||
struct lab_data_buffer *right;
|
struct lab_data_buffer *right;
|
||||||
|
|
@ -45,9 +47,11 @@ struct bufferset {
|
||||||
|
|
||||||
extern struct borderset *border_cache;
|
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 bufferset *generate_bufferset(struct wlr_scene_tree *tree,
|
||||||
struct borderset *borderset, int bw);
|
struct borderset *borderset, int bw);
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,8 @@
|
||||||
#include "common/macros.h"
|
#include "common/macros.h"
|
||||||
#include "buffer.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 *current = border_cache;
|
||||||
struct borderset *last;
|
struct borderset *last;
|
||||||
|
|
@ -32,7 +33,8 @@ struct borderset *get_borders(uint32_t id, int size, enum border_type type, int
|
||||||
|
|
||||||
while (current) {
|
while (current) {
|
||||||
if (current->size == size && current->id == id &&
|
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;
|
return current;
|
||||||
}
|
}
|
||||||
last = 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.
|
// Fall through, we need to create a buffer.
|
||||||
|
|
||||||
if (!border_cache) {
|
if (!border_cache) {
|
||||||
border_cache = create_buffer(id, size, type, bevelSize);
|
border_cache = create_buffer(id, size, type, bevelSize, highlight, lowlight);
|
||||||
return border_cache;
|
return border_cache;
|
||||||
} else {
|
} else {
|
||||||
last->next = create_buffer(id, size, type, bevelSize);
|
last->next = create_buffer(id, size, type, bevelSize, highlight, lowlight);
|
||||||
return last->next;
|
return last->next;
|
||||||
}
|
}
|
||||||
return NULL;
|
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);
|
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->size = size;
|
||||||
new_borderset->type = type;
|
new_borderset->type = type;
|
||||||
new_borderset->bevelSize = bevelSize;
|
new_borderset->bevelSize = bevelSize;
|
||||||
|
new_borderset->highlight = highlight;
|
||||||
|
new_borderset->lowlight = lowlight;
|
||||||
|
|
||||||
// Use ID as a AARRGGBB colour
|
// Use ID as a AARRGGBB colour
|
||||||
uint8_t a = id >> 24 & 255;
|
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 g = id >> 8 & 255;
|
||||||
uint8_t b = id & 255;
|
uint8_t b = id & 255;
|
||||||
|
|
||||||
uint32_t r1 = r * 5 / 4;
|
uint32_t r1 = r * (256+highlight) / 256;
|
||||||
if (r1 > a) {
|
if (r1 > a) {
|
||||||
r1 = a;
|
r1 = a;
|
||||||
}
|
}
|
||||||
uint32_t g1 = g * 5 / 4;
|
uint32_t g1 = g * (256+highlight) / 256;
|
||||||
if (g1 > a) {
|
if (g1 > a) {
|
||||||
g1 = a;
|
g1 = a;
|
||||||
}
|
}
|
||||||
uint32_t b1 = b * 5 / 4;
|
uint32_t b1 = b * (256+highlight) / 256;
|
||||||
if (b1 > a) {
|
if (b1 > a) {
|
||||||
b1 = a;
|
b1 = a;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* darker outline */
|
/* darker outline */
|
||||||
uint32_t r0 = r / 2;
|
uint32_t r0 = r * (256 - lowlight) / 256;
|
||||||
uint32_t g0 = g / 2;
|
uint32_t g0 = g * (256 - lowlight) / 256;
|
||||||
uint32_t b0 = b / 2;
|
uint32_t b0 = b * (256 - lowlight) / 256;
|
||||||
|
|
||||||
uint32_t hl32 = ((uint32_t)a << 24) | ((uint32_t)r1 << 16)
|
uint32_t hl32 = ((uint32_t)a << 24) | ((uint32_t)r1 << 16)
|
||||||
| ((uint32_t)g1 << 8) | (uint32_t)b1;
|
| ((uint32_t)g1 << 8) | (uint32_t)b1;
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ lab_scene_rect_create(struct wlr_scene_tree *parent,
|
||||||
(uint32_t)(g*255) << 8 |
|
(uint32_t)(g*255) << 8 |
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
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,
|
border->textured_borders = generate_bufferset(border->tree,
|
||||||
renderedborders, bw);
|
renderedborders, bw);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -207,7 +207,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
struct borderset *renderedborders = get_borders(colour32, bw,
|
||||||
rc.theme->menu_items_active_border_type,
|
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);
|
bufferset = generate_bufferset(tree, renderedborders, bw);
|
||||||
} else if (rc.theme->menu_items_border_type && !state) {
|
} else if (rc.theme->menu_items_border_type && !state) {
|
||||||
float r = bg_color[0];
|
float r = bg_color[0];
|
||||||
|
|
@ -221,7 +221,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
struct borderset *renderedborders = get_borders(colour32, bw,
|
||||||
rc.theme->menu_items_border_type,
|
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);
|
bufferset = generate_bufferset(tree, renderedborders, bw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -410,7 +410,7 @@ title_create_scene(struct menuitem *menuitem, int *item_y)
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
struct borderset *renderedborders = get_borders(colour32, bw,
|
||||||
rc.theme->menu_title_border_type,
|
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);
|
bufferset = generate_bufferset(menuitem->tree, renderedborders, bw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ resize_indicator_reconfigure_view(struct resize_indicator *indicator)
|
||||||
(uint32_t)(g*255) << 8 |
|
(uint32_t)(g*255) << 8 |
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
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,
|
indicator->textured_borders = generate_bufferset(indicator->tree,
|
||||||
renderedborders, bw);
|
renderedborders, bw);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ ssd_border_create(struct ssd *ssd)
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
struct borderset *renderedborders = get_borders(colour32, bw,
|
||||||
theme->window[active].border_type,
|
theme->window[active].border_type,
|
||||||
theme->window[active].bevel_width);
|
theme->window[active].bevel_width, 128, 64);
|
||||||
subtree->textured_borders = generate_bufferset(subtree->tree,
|
subtree->textured_borders = generate_bufferset(subtree->tree,
|
||||||
renderedborders, bw);
|
renderedborders, bw);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,8 @@ ssd_titlebar_create(struct ssd *ssd)
|
||||||
struct borderset *renderedborders = get_borders(colour32,
|
struct borderset *renderedborders = get_borders(colour32,
|
||||||
theme->window[active].title_bg.border_width,
|
theme->window[active].title_bg.border_width,
|
||||||
theme->window[active].title_bg.border_type,
|
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,
|
subtree->textured_borders = generate_bufferset(subtree->tree,
|
||||||
renderedborders, theme->window[active].title_bg.border_width);
|
renderedborders, theme->window[active].title_bg.border_width);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,7 @@ static void draw_beveled_border_on_button(cairo_t *cairo, int w, int h, int acti
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
struct borderset *renderedborders = get_borders(colour32, bw,
|
||||||
rc.theme->window[active].button_border_type,
|
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_set_source_surface(cairo, renderedborders->top->surface, 0, 0);
|
||||||
cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
|
cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,8 @@ _osd_update(void)
|
||||||
(uint32_t)(g*255) << 8 |
|
(uint32_t)(g*255) << 8 |
|
||||||
(uint32_t)(b*255);
|
(uint32_t)(b*255);
|
||||||
struct borderset *renderedborders = get_borders(colour32, bw,
|
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_set_source_surface(cairo, renderedborders->top->surface, 0, 0);
|
||||||
cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
|
cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue