mirror of
https://github.com/labwc/labwc.git
synced 2025-11-03 09:01:51 -05:00
theme: round the hover effect along the window border
This commit is contained in:
parent
21e92632a6
commit
e53ec5e5a0
1 changed files with 31 additions and 13 deletions
44
src/theme.c
44
src/theme.c
|
|
@ -167,7 +167,6 @@ create_hover_fallback(struct theme *theme, const char *icon_name,
|
||||||
float overlay_color[4] = { 0.15f, 0.15f, 0.15f, 0.3f};
|
float overlay_color[4] = { 0.15f, 0.15f, 0.15f, 0.3f};
|
||||||
int radius = MIN(width, height) / 2;
|
int radius = MIN(width, height) / 2;
|
||||||
enum corner corner = corner_from_icon_name(icon_name);
|
enum corner corner = corner_from_icon_name(icon_name);
|
||||||
int corner_radius = MAX(rc.corner_radius - theme->padding_width, 0);
|
|
||||||
|
|
||||||
switch (theme->window_button_hover_bg_shape) {
|
switch (theme->window_button_hover_bg_shape) {
|
||||||
case LAB_CIRCLE:
|
case LAB_CIRCLE:
|
||||||
|
|
@ -176,24 +175,43 @@ create_hover_fallback(struct theme *theme, const char *icon_name,
|
||||||
cairo_fill(cairo);
|
cairo_fill(cairo);
|
||||||
break;
|
break;
|
||||||
case LAB_RECTANGLE:
|
case LAB_RECTANGLE:
|
||||||
|
set_cairo_color(cairo, overlay_color);
|
||||||
|
cairo_rectangle(cairo, 0, 0, width, height);
|
||||||
if (corner == LAB_CORNER_UNKNOWN) {
|
if (corner == LAB_CORNER_UNKNOWN) {
|
||||||
set_cairo_color(cairo, overlay_color);
|
|
||||||
cairo_rectangle(cairo, 0, 0, width, height);
|
|
||||||
cairo_fill(cairo);
|
cairo_fill(cairo);
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
* Round the hover overlay of corner buttons by
|
||||||
|
* cropping the region within the window border.
|
||||||
|
*/
|
||||||
|
float white[4] = {1, 1, 1, 1};
|
||||||
struct rounded_corner_ctx rounded_ctx = {
|
struct rounded_corner_ctx rounded_ctx = {
|
||||||
.box = &(struct wlr_box){.width = width, .height = height},
|
.box = &(struct wlr_box){
|
||||||
.radius = corner_radius,
|
.width = theme->padding_width + width,
|
||||||
|
.height = height,
|
||||||
|
},
|
||||||
|
.radius = rc.corner_radius,
|
||||||
.line_width = theme->border_width,
|
.line_width = theme->border_width,
|
||||||
.fill_color = overlay_color,
|
.fill_color = white,
|
||||||
.border_color = overlay_color,
|
.border_color = white,
|
||||||
.corner = corner};
|
.corner = corner,
|
||||||
struct lab_data_buffer *overlay_buffer =
|
};
|
||||||
|
struct lab_data_buffer *mask_buffer =
|
||||||
rounded_rect(&rounded_ctx);
|
rounded_rect(&rounded_ctx);
|
||||||
cairo_set_source_surface(cairo,
|
cairo_pattern_t *mask_pattern =
|
||||||
cairo_get_target(overlay_buffer->cairo), 0, 0);
|
cairo_pattern_create_for_surface(
|
||||||
cairo_paint(cairo);
|
cairo_get_target(mask_buffer->cairo));
|
||||||
wlr_buffer_drop(&overlay_buffer->base);
|
int mask_offset;
|
||||||
|
if (corner == LAB_CORNER_TOP_LEFT) {
|
||||||
|
mask_offset = -theme->padding_width;
|
||||||
|
} else {
|
||||||
|
mask_offset = 0;
|
||||||
|
}
|
||||||
|
cairo_save(cairo);
|
||||||
|
cairo_translate(cairo, mask_offset, 0);
|
||||||
|
cairo_mask(cairo, mask_pattern);
|
||||||
|
cairo_restore(cairo);
|
||||||
|
wlr_buffer_drop(&mask_buffer->base);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue