mirror of
https://github.com/labwc/labwc.git
synced 2026-04-06 07:15:40 -04:00
Use rendered borders with Cairo overlay for desktop switching OSD
This commit is contained in:
parent
536847cb5b
commit
adc2c911ff
2 changed files with 86 additions and 48 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
104
src/workspaces.c
104
src/workspaces.c
|
|
@ -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 = {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue