Handle the highlights on the window switcher with a different bevel that doesn't involve leaving crumbs

This commit is contained in:
Jack Zeal 2026-03-26 19:35:38 -07:00
parent 8c46add98a
commit 25b5ad08e4
7 changed files with 42 additions and 27 deletions

View file

@ -15,6 +15,7 @@ struct lab_scene_rect_options {
float *bg_color; /* can be NULL */ float *bg_color; /* can be NULL */
int width; int width;
int height; int height;
int beveled;
}; };
struct lab_scene_rect { struct lab_scene_rect {

View file

@ -33,8 +33,6 @@ lab_scene_rect_create(struct wlr_scene_tree *parent,
rect->nr_borders = opts->nr_borders; rect->nr_borders = opts->nr_borders;
rect->borders = znew_n(rect->borders[0], opts->nr_borders); rect->borders = znew_n(rect->borders[0], opts->nr_borders);
rect->tree = lab_wlr_scene_tree_create(parent); rect->tree = lab_wlr_scene_tree_create(parent);
struct theme *theme = rc.theme;
if (opts->bg_color) { if (opts->bg_color) {
rect->fill = lab_wlr_scene_rect_create(rect->tree, 0, 0, opts->bg_color); rect->fill = lab_wlr_scene_rect_create(rect->tree, 0, 0, opts->bg_color);
@ -44,8 +42,10 @@ lab_scene_rect_create(struct wlr_scene_tree *parent,
struct border_scene *border = &rect->borders[i]; struct border_scene *border = &rect->borders[i];
float *color = opts->border_colors[i]; float *color = opts->border_colors[i];
border->tree = lab_wlr_scene_tree_create(rect->tree); border->tree = lab_wlr_scene_tree_create(rect->tree);
// Beveled mode 0 = normal outline
if (theme->beveled_border) { // Beveled mode 1 = full bevel with sharp internal corners
// Beveled mode 2 = "light" bevel without sharp corners.
if (opts->beveled > 0) {
/* From Pull request 3382 */ /* From Pull request 3382 */
int bw = rect->border_width; int bw = rect->border_width;
@ -108,30 +108,34 @@ lab_scene_rect_create(struct wlr_scene_tree *parent,
} }
} }
if (opts->beveled == 1) {
struct lab_data_buffer *tltexture_buffer = struct lab_data_buffer *tltexture_buffer =
buffer_create_from_data(tl_data, bw, bw, 4*bw); buffer_create_from_data(tl_data, bw, bw, 4*bw);
border->tlcorner = wlr_scene_buffer_create(parent, &tltexture_buffer->base); border->tlcorner = wlr_scene_buffer_create(parent, &tltexture_buffer->base);
wlr_buffer_drop(&tltexture_buffer->base); wlr_buffer_drop(&tltexture_buffer->base);
struct lab_data_buffer *trtexture_buffer =
buffer_create_from_data(tr_data, bw, bw, 4*bw);
border->trcorner = wlr_scene_buffer_create(parent, &trtexture_buffer->base);
wlr_buffer_drop(&trtexture_buffer->base);
struct lab_data_buffer *bltexture_buffer = struct lab_data_buffer *trtexture_buffer =
buffer_create_from_data(bl_data, bw, bw, 4*bw); buffer_create_from_data(tr_data, bw, bw, 4*bw);
border->blcorner = wlr_scene_buffer_create(parent, &bltexture_buffer->base); border->trcorner = wlr_scene_buffer_create(parent, &trtexture_buffer->base);
wlr_buffer_drop(&bltexture_buffer->base); wlr_buffer_drop(&trtexture_buffer->base);
struct lab_data_buffer *brtexture_buffer =
buffer_create_from_data(br_data, bw, bw, 4*bw); struct lab_data_buffer *bltexture_buffer =
border->brcorner = wlr_scene_buffer_create(parent, &brtexture_buffer->base); buffer_create_from_data(bl_data, bw, bw, 4*bw);
wlr_buffer_drop(&brtexture_buffer->base); border->blcorner = wlr_scene_buffer_create(parent, &bltexture_buffer->base);
wlr_buffer_drop(&bltexture_buffer->base);
struct lab_data_buffer *brtexture_buffer =
buffer_create_from_data(br_data, bw, bw, 4*bw);
border->brcorner = wlr_scene_buffer_create(parent, &brtexture_buffer->base);
wlr_buffer_drop(&brtexture_buffer->base);
} else {
border->tlcorner=NULL;
border->trcorner=NULL;
border->blcorner=NULL;
border->brcorner=NULL;
}
@ -140,6 +144,10 @@ lab_scene_rect_create(struct wlr_scene_tree *parent,
border->right = lab_wlr_scene_rect_create(border->tree, 0, 0, color); border->right = lab_wlr_scene_rect_create(border->tree, 0, 0, color);
border->bottom = lab_wlr_scene_rect_create(border->tree, 0, 0, color); border->bottom = lab_wlr_scene_rect_create(border->tree, 0, 0, color);
border->left = lab_wlr_scene_rect_create(border->tree, 0, 0, color); border->left = lab_wlr_scene_rect_create(border->tree, 0, 0, color);
border->tlcorner=NULL;
border->trcorner=NULL;
border->blcorner=NULL;
border->brcorner=NULL;
} }
@ -184,8 +192,7 @@ resize_border(struct border_scene *border, int border_width, int width, int heig
wlr_scene_rect_set_size(border->left, border_width, height - border_width * 2); wlr_scene_rect_set_size(border->left, border_width, height - border_width * 2);
wlr_scene_rect_set_size(border->right, border_width, height - border_width * 2); wlr_scene_rect_set_size(border->right, border_width, height - border_width * 2);
struct theme *theme = rc.theme; if (border->tlcorner != NULL) {
if (theme->beveled_border) {
wlr_scene_buffer_set_dest_size(border->tlcorner, wlr_scene_buffer_set_dest_size(border->tlcorner,
border_width, border_width); border_width, border_width);
wlr_scene_node_set_position(&border->tlcorner->node, wlr_scene_node_set_position(&border->tlcorner->node,

View file

@ -37,6 +37,7 @@ update_preview_outlines(struct view *view)
}, },
.nr_borders = 3, .nr_borders = 3,
.border_width = theme->osd_window_switcher_preview_border_width, .border_width = theme->osd_window_switcher_preview_border_width,
.beveled = 1, // Checked
}; };
rect = lab_scene_rect_create(&server.scene->tree, &opts); rect = lab_scene_rect_create(&server.scene->tree, &opts);
wlr_scene_node_place_above(&rect->tree->node, wlr_scene_node_place_above(&rect->tree->node,

View file

@ -120,6 +120,7 @@ cycle_osd_classic_init(struct cycle_osd_output *osd_output)
.bg_color = bg_color, .bg_color = bg_color,
.width = w, .width = w,
.height = h, .height = h,
.beveled = 1,
}; };
lab_scene_rect_create(osd_output->tree, &bg_opts); lab_scene_rect_create(osd_output->tree, &bg_opts);
@ -202,6 +203,7 @@ cycle_osd_classic_init(struct cycle_osd_output *osd_output)
.bg_color = active_bg_color, .bg_color = active_bg_color,
.width = w - 2 * padding, .width = w - 2 * padding,
.height = switcher_theme->item_height, .height = switcher_theme->item_height,
.beveled = 2,
}; };
struct lab_scene_rect *highlight_rect = lab_scene_rect_create( struct lab_scene_rect *highlight_rect = lab_scene_rect_create(
item->active_tree, &highlight_opts); item->active_tree, &highlight_opts);

View file

@ -35,6 +35,7 @@ cycle_osd_scroll_init(struct cycle_osd_output *osd_output, struct wlr_box bar_ar
.bg_color = bg_color, .bg_color = bg_color,
.width = bar_area.width, .width = bar_area.width,
.height = bar_area.height * nr_visible_rows / nr_rows, .height = bar_area.height * nr_visible_rows / nr_rows,
.beveled = 1,
}; };
scroll->bar = lab_scene_rect_create(scroll->bar_tree, &scrollbar_opts); scroll->bar = lab_scene_rect_create(scroll->bar_tree, &scrollbar_opts);
} }

View file

@ -150,6 +150,7 @@ create_item_scene(struct wlr_scene_tree *parent, struct view *view,
.bg_color = switcher_theme->item_active_bg_color, .bg_color = switcher_theme->item_active_bg_color,
.width = switcher_theme->item_width, .width = switcher_theme->item_width,
.height = switcher_theme->item_height, .height = switcher_theme->item_height,
.beveled = 2,
}; };
item->active_bg = lab_scene_rect_create(tree, &opts); item->active_bg = lab_scene_rect_create(tree, &opts);
@ -282,6 +283,7 @@ cycle_osd_thumbnail_init(struct cycle_osd_output *osd_output)
.bg_color = theme->osd_bg_color, .bg_color = theme->osd_bg_color,
.width = items_width + 2 * padding, .width = items_width + 2 * padding,
.height = items_height + 2 * padding, .height = items_height + 2 * padding,
.beveled = 1,
}; };
struct lab_scene_rect *bg = struct lab_scene_rect *bg =
lab_scene_rect_create(osd_output->tree, &bg_opts); lab_scene_rect_create(osd_output->tree, &bg_opts);

View file

@ -457,6 +457,7 @@ menu_create_scene(struct menu *menu)
.border_width = theme->menu_border_width, .border_width = theme->menu_border_width,
.width = menu->size.width, .width = menu->size.width,
.height = menu->size.height, .height = menu->size.height,
.beveled = 1,
}; };
struct lab_scene_rect *bg_rect = struct lab_scene_rect *bg_rect =
lab_scene_rect_create(menu->scene_tree, &opts); lab_scene_rect_create(menu->scene_tree, &opts);