From 2c0e76417fc018ee030983fd3063aa0d1456f31a Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Sat, 13 Apr 2024 22:32:06 +0900 Subject: [PATCH] graphic-helpers: prevent multi-rect edges from overlapping Multi-rect edges overlapping is problematic with translucent colors. --- src/common/graphic-helpers.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/common/graphic-helpers.c b/src/common/graphic-helpers.c index 055b0635..5c754b30 100644 --- a/src/common/graphic-helpers.c +++ b/src/common/graphic-helpers.c @@ -33,7 +33,7 @@ multi_rect_create(struct wlr_scene_tree *parent, float *colors[3], int line_widt wlr_scene_node_set_position(&rect->top[i]->node, i * line_width, i * line_width); wlr_scene_node_set_position(&rect->left[i]->node, - i * line_width, i * line_width); + i * line_width, (i + 1) * line_width); } return rect; } @@ -44,10 +44,22 @@ multi_rect_set_size(struct multi_rect *rect, int width, int height) assert(rect); int line_width = rect->line_width; + /* + * The outmost outline is drawn like below: + * + * |--width--| + * + * +---------+ --- + * +-+-----+-+ | + * | | | | height + * | | | | | + * +-+-----+-+ | + * +---------+ --- + */ for (size_t i = 0; i < 3; i++) { /* Reposition, top and left don't ever change */ wlr_scene_node_set_position(&rect->right[i]->node, - width - (i + 1) * line_width, i * line_width); + width - (i + 1) * line_width, (i + 1) * line_width); wlr_scene_node_set_position(&rect->bottom[i]->node, i * line_width, height - (i + 1) * line_width); @@ -57,9 +69,9 @@ multi_rect_set_size(struct multi_rect *rect, int width, int height) wlr_scene_rect_set_size(rect->bottom[i], width - i * line_width * 2, line_width); wlr_scene_rect_set_size(rect->left[i], - line_width, height - i * line_width * 2); + line_width, height - (i + 1) * line_width * 2); wlr_scene_rect_set_size(rect->right[i], - line_width, height - i * line_width * 2); + line_width, height - (i + 1) * line_width * 2); } }