Centralize buffer preparation and standardize placement

This commit is contained in:
Jack Zeal 2026-03-28 09:01:21 -07:00
parent 90e652a8a1
commit d80dd2470b
16 changed files with 251 additions and 431 deletions

View file

@ -169,7 +169,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
{
struct menu *menu = item->parent;
struct theme *theme = rc.theme;
struct wlr_scene_buffer *top, *left, *right, *bottom, *tl, *tr, *bl, *br;
struct bufferset * bufferset;
/* Tree to hold background and label buffers */
struct wlr_scene_tree *tree = lab_wlr_scene_tree_create(item->tree);
@ -203,42 +203,8 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
uint32_t colour32 = (uint32_t)(a*255) << 24 | (uint32_t)(r*255) << 16 | (uint32_t)(g*255) << 8 | (uint32_t)(b*255);
struct borderset * renderedborders = getBorders(colour32, bw, 3, 0);
struct lab_data_buffer *ttexture_buffer =
buffer_create_from_data(renderedborders->top, 1, 1, 4);
top = wlr_scene_buffer_create(tree, &ttexture_buffer->base);
struct lab_data_buffer *ltexture_buffer =
buffer_create_from_data(renderedborders->left, 1, 1, 4);
left = wlr_scene_buffer_create(tree, &ltexture_buffer->base);
struct lab_data_buffer *rtexture_buffer =
buffer_create_from_data(renderedborders->right, 1, 1, 4);
right = wlr_scene_buffer_create(tree, &rtexture_buffer->base);
struct lab_data_buffer *btexture_buffer =
buffer_create_from_data(renderedborders->bottom, 1, 1, 4);
bottom = wlr_scene_buffer_create(tree, &btexture_buffer->base);
struct lab_data_buffer *tltexture_buffer =
buffer_create_from_data(renderedborders->tl, bw, bw, 4*bw);
tl = wlr_scene_buffer_create(tree, &tltexture_buffer->base);
struct lab_data_buffer *trtexture_buffer =
buffer_create_from_data(renderedborders->tr, bw, bw, 4*bw);
tr = wlr_scene_buffer_create(tree, &trtexture_buffer->base);
struct lab_data_buffer *bltexture_buffer =
buffer_create_from_data(renderedborders->bl, bw, bw, 4*bw);
bl = wlr_scene_buffer_create(tree, &bltexture_buffer->base);
struct lab_data_buffer *brtexture_buffer =
buffer_create_from_data(renderedborders->br, bw, bw, 4*bw);
br = wlr_scene_buffer_create(tree, &brtexture_buffer->base);
struct borderset * renderedborders = getBorders(colour32, bw, BORDER_INSET, 0);
bufferset = generateBufferset(tree, renderedborders, bw);
}
@ -275,55 +241,7 @@ item_create_scene_for_state(struct menuitem *item, float *text_color,
if (rc.theme->beveled_border && state) {
int height = theme->menu_item_height;
wlr_scene_buffer_set_dest_size(top,
bg_width, bw);
wlr_scene_node_set_position(&top->node,
0,0);
wlr_scene_buffer_set_dest_size(bottom,
bg_width, bw);
wlr_scene_node_set_position(&bottom->node,
0, height - bw);
wlr_scene_buffer_set_dest_size(left,
bw, height - bw * 2);
wlr_scene_node_set_position(&left->node,
0, bw);
wlr_scene_buffer_set_dest_size(right,
bw, height - bw * 2);
wlr_scene_node_set_position(&right->node,
bg_width - bw, bw);
wlr_scene_buffer_set_dest_size(tl,
bw, bw);
wlr_scene_node_set_position(&tl->node,
0,0);
wlr_scene_buffer_set_dest_size(tr,
bw, bw);
wlr_scene_node_set_position(&tr->node,
bg_width-bw, 0);
wlr_scene_buffer_set_dest_size(br,
bw, bw);
wlr_scene_node_set_position(&br->node,
bg_width-bw , height-bw);
wlr_scene_buffer_set_dest_size(bl,
bw, bw);
wlr_scene_node_set_position(&bl->node,
0, height-bw);
renderBufferset(bufferset, bg_width, theme->menu_item_height, 0);
}
@ -446,6 +364,8 @@ title_create_scene(struct menuitem *menuitem, int *item_y)
assert(menuitem->type == LAB_MENU_TITLE);
struct menu *menu = menuitem->parent;
struct theme *theme = rc.theme;
struct bufferset * bufferset;
float *bg_color = theme->menu_title_bg_color;
float *text_color = theme->menu_title_text_color;
@ -464,6 +384,21 @@ title_create_scene(struct menuitem *menuitem, int *item_y)
wlr_log(WLR_ERROR, "not enough space for menu title");
goto error;
}
int bw = theme->menu_border_width;
if (rc.theme->beveled_border) {
float r = bg_color[0];
float g = bg_color[1];
float b = bg_color[2];
float a = bg_color[3];
uint32_t colour32 = (uint32_t)(a*255) << 24 | (uint32_t)(r*255) << 16 | (uint32_t)(g*255) << 8 | (uint32_t)(b*255);
struct borderset * renderedborders = getBorders(colour32, bw, BORDER_SINGLE, 0);
bufferset = generateBufferset(menuitem->tree, renderedborders, bw);
}
/* Background */
lab_wlr_scene_rect_create(menuitem->normal_tree,
@ -493,6 +428,10 @@ title_create_scene(struct menuitem *menuitem, int *item_y)
int title_y = (theme->menu_header_height - title_font_buffer->height) / 2;
wlr_scene_node_set_position(&title_font_buffer->scene_buffer->node,
title_x, title_y);
if (rc.theme->beveled_border) {
renderBufferset(bufferset, bg_width, theme->menu_item_height, 0);
}
error:
wlr_scene_node_set_position(&menuitem->tree->node,
theme->menu_border_width, *item_y);
@ -565,7 +504,7 @@ menu_create_scene(struct menu *menu)
.border_width = theme->menu_border_width,
.width = menu->size.width,
.height = menu->size.height,
.beveled = 1,
.beveled = true,
};
struct lab_scene_rect *bg_rect =
lab_scene_rect_create(menu->scene_tree, &opts);