Use rendered borders with Cairo overlay for desktop switching OSD

This commit is contained in:
Jack Zeal 2026-03-27 23:11:40 -07:00
parent 536847cb5b
commit adc2c911ff
2 changed files with 86 additions and 48 deletions

View file

@ -184,26 +184,26 @@ resize_border(struct border_scene *border, int border_width, int width, int heig
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,
0,0); 0,0);
wlr_scene_buffer_set_dest_size(border->trcorner, wlr_scene_buffer_set_dest_size(border->trcorner,
border_width, border_width); border_width, border_width);
wlr_scene_node_set_position(&border->trcorner->node, wlr_scene_node_set_position(&border->trcorner->node,
width-border_width, 0); width-border_width, 0);
wlr_scene_buffer_set_dest_size(border->brcorner, wlr_scene_buffer_set_dest_size(border->brcorner,
border_width, border_width); border_width, border_width);
wlr_scene_node_set_position(&border->brcorner->node, wlr_scene_node_set_position(&border->brcorner->node,
width-border_width , height-border_width); width-border_width , height-border_width);
wlr_scene_buffer_set_dest_size(border->blcorner, wlr_scene_buffer_set_dest_size(border->blcorner,
border_width, border_width); border_width, border_width);
wlr_scene_node_set_position(&border->blcorner->node, wlr_scene_node_set_position(&border->blcorner->node,
0, height-border_width); 0, height-border_width);
} }

View file

@ -18,6 +18,7 @@
#include "common/scene-helpers.h" #include "common/scene-helpers.h"
#include "config/rcxml.h" #include "config/rcxml.h"
#include "input/keyboard.h" #include "input/keyboard.h"
#include "common/borderset.h"
#include "labwc.h" #include "labwc.h"
#include "output.h" #include "output.h"
#include "protocols/cosmic-workspaces.h" #include "protocols/cosmic-workspaces.h"
@ -25,6 +26,7 @@
#include "theme.h" #include "theme.h"
#include "view.h" #include "view.h"
#define COSMIC_WORKSPACES_VERSION 1 #define COSMIC_WORKSPACES_VERSION 1
#define EXT_WORKSPACES_VERSION 1 #define EXT_WORKSPACES_VERSION 1
@ -98,46 +100,82 @@ _osd_update(void)
cairo = cairo_create(buffer->surface); cairo = cairo_create(buffer->surface);
int bw = theme->osd_border_width;
/* Background */ /* Background */
set_cairo_color(cairo, theme->osd_bg_color); set_cairo_color(cairo, theme->osd_bg_color);
cairo_rectangle(cairo, 0, 0, width, height); cairo_rectangle(cairo, bw, bw, width-bw*2, height-bw*2);
cairo_fill(cairo); cairo_fill(cairo);
/* Border */ /* Border */
if (theme->beveled_border) { if (theme->beveled_border) {
const float highlight[4] = { float r = theme->osd_border_color[0];
MIN(theme->osd_border_color[0] * 5/4, theme->osd_border_color[3]), float g = theme->osd_border_color[1];
MIN(theme->osd_border_color[1] * 5/4, theme->osd_border_color[3]), float b = theme->osd_border_color[2];
MIN(theme->osd_border_color[2] * 5/4, theme->osd_border_color[3]), float a = theme->osd_border_color[3];
theme->osd_border_color[3]
}; uint32_t colour32 = (uint32_t)(a*255) << 24 | (uint32_t)(r*255) << 16 | (uint32_t)(g*255) << 8 | (uint32_t)(b*255);
const float lowlight[4] = { struct borderset * renderedborders = getBorders(colour32, bw, 1, 0);
theme->osd_border_color[0] / 2,
theme->osd_border_color[1] / 2,
theme->osd_border_color[2] / 2,
theme->osd_border_color[3]
};
set_cairo_color(cairo, highlight);
cairo_new_path(cairo);
cairo_move_to(cairo, 0, 0);
cairo_line_to(cairo, width, 0);
cairo_line_to(cairo, width - theme->osd_border_width, theme->osd_border_width);
cairo_line_to(cairo, theme->osd_border_width, theme->osd_border_width);
cairo_line_to(cairo, theme->osd_border_width, height-theme->osd_border_width);
cairo_line_to(cairo, 0, height);
cairo_close_path(cairo);
cairo_fill(cairo);
set_cairo_color(cairo, lowlight); cairo_surface_t* top = cairo_image_surface_create_for_data((unsigned char *)renderedborders->top, CAIRO_FORMAT_ARGB32, 1, 1, 4);
cairo_new_path(cairo); cairo_set_source_surface(cairo, top, 0, 0);
cairo_move_to(cairo, width, 0); cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
cairo_line_to(cairo, width - theme->osd_border_width, theme->osd_border_width); cairo_rectangle(cairo, bw, 0, width-bw*2, bw);
cairo_line_to(cairo, width - theme->osd_border_width, height-theme->osd_border_width);
cairo_line_to(cairo, theme->osd_border_width, height-theme->osd_border_width);
cairo_line_to(cairo, 0, height);
cairo_line_to(cairo, width, height);
cairo_close_path(cairo);
cairo_fill(cairo); cairo_fill(cairo);
cairo_surface_finish(top);
cairo_surface_t* bottom = cairo_image_surface_create_for_data((unsigned char *)renderedborders->bottom, CAIRO_FORMAT_ARGB32, 1, 1, 4);
cairo_set_source_surface(cairo, bottom, 0, 0);
cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
cairo_rectangle(cairo, bw, height-bw, width-bw*2, bw);
cairo_fill(cairo);
cairo_surface_finish(bottom);
cairo_surface_t* left = cairo_image_surface_create_for_data((unsigned char *)renderedborders->left, CAIRO_FORMAT_ARGB32, 1, 1, 4);
cairo_set_source_surface(cairo, left, 0, 0);
cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
cairo_rectangle(cairo, 0, bw, bw, height-bw*2);
cairo_fill(cairo);
cairo_surface_finish(left);
cairo_surface_t* right = cairo_image_surface_create_for_data((unsigned char *)renderedborders->right, CAIRO_FORMAT_ARGB32, 1, 1, 4);
cairo_set_source_surface(cairo, right, 0, 0);
cairo_pattern_set_extend(cairo_get_source(cairo), CAIRO_EXTEND_REPEAT);
cairo_rectangle(cairo, width-bw, bw, bw, height-bw*2);
cairo_fill(cairo);
cairo_surface_finish(right);
cairo_surface_t* tl = cairo_image_surface_create_for_data((unsigned char *)renderedborders->tl, CAIRO_FORMAT_ARGB32, bw, bw, 4*bw);
cairo_set_source_surface(cairo, tl, 0, 0);
cairo_rectangle(cairo, 0, 0, bw, bw);
cairo_fill(cairo);
cairo_surface_finish(tl);
cairo_surface_t* tr = cairo_image_surface_create_for_data((unsigned char *)renderedborders->tr, CAIRO_FORMAT_ARGB32, bw, bw, 4*bw);
cairo_set_source_surface(cairo, tr, width-bw, 0);
cairo_rectangle(cairo, width - bw, 0, bw, bw);
cairo_fill(cairo);
cairo_surface_finish(tr);
cairo_surface_t* bl = cairo_image_surface_create_for_data((unsigned char *)renderedborders->bl, CAIRO_FORMAT_ARGB32, bw, bw, 4*bw);
cairo_set_source_surface(cairo, bl, 0, height - bw);
cairo_rectangle(cairo, 0, height - bw, bw, bw);
cairo_fill(cairo);
cairo_surface_finish(bl);
cairo_surface_t* br = cairo_image_surface_create_for_data((unsigned char *)renderedborders->br, CAIRO_FORMAT_ARGB32, bw, bw, 4*bw);
cairo_set_source_surface(cairo, br, width - bw, height -bw);
cairo_rectangle(cairo, width - bw, height - bw, bw, bw);
cairo_fill(cairo);
cairo_surface_finish(br);
set_cairo_color(cairo, theme->osd_border_color);
} else { } else {
set_cairo_color(cairo, theme->osd_border_color); set_cairo_color(cairo, theme->osd_border_color);
struct wlr_fbox border_fbox = { struct wlr_fbox border_fbox = {