summaryrefslogtreecommitdiff
path: root/sway/tree/workspace.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree/workspace.c')
-rw-r--r--sway/tree/workspace.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index 8bc62f3f..7e7146dd 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -692,24 +692,39 @@ void workspace_detect_urgent(struct sway_workspace *workspace) {
}
}
-static bool find_blurred_con_iterator(struct sway_container *con, void *data) {
+struct blur_region_data {
+ struct sway_workspace *ws;
+ pixman_region32_t *blur_region;
+};
+
+static void find_blurred_region_iterator(struct sway_container *con, void *data) {
struct sway_view *view = con->view;
if (!view) {
- return false;
+ return;
+ }
+
+ struct blur_region_data *region_data = data;
+ struct sway_workspace *ws = region_data->ws;
+ pixman_region32_t *blur_region = region_data->blur_region;
+
+ if (con->blur_enabled && !view->surface->opaque) {
+ pixman_region32_union_rect(blur_region, blur_region,
+ floor(con->current.x) - ws->output->lx,
+ floor(con->current.y) - ws->output->ly,
+ con->current.width, con->current.height);
}
- return con->blur_enabled && !view->surface->opaque;
}
-bool should_workspace_have_blur(struct sway_workspace *ws) {
- if (!workspace_is_visible(ws)) {
+bool workspace_get_blur_info(struct sway_workspace *ws, pixman_region32_t *blur_region) {
+ if (!workspace_is_visible(ws) || !config_should_parameters_blur()) {
return false;
}
- if ((bool)workspace_find_container(ws, find_blurred_con_iterator, NULL)) {
- return true;
- }
+ // Each toplevel
+ struct blur_region_data data = { ws, blur_region };
+ workspace_for_each_container(ws, find_blurred_region_iterator, &data);
- // Check if any layer-shell surfaces will render effects
+ // Each Layer
struct sway_output *sway_output = ws->output;
size_t len = sizeof(sway_output->layers) / sizeof(sway_output->layers[0]);
for (size_t i = 0; i < len; ++i) {
@@ -717,12 +732,14 @@ bool should_workspace_have_blur(struct sway_workspace *ws) {
wl_list_for_each(lsurface, &sway_output->layers[i], link) {
if (lsurface->has_blur && !lsurface->layer_surface->surface->opaque
&& lsurface->layer != ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND) {
- return true;
+ struct wlr_box *geo = &lsurface->geo;
+ pixman_region32_union_rect(blur_region, blur_region,
+ geo->x, geo->y, geo->width, geo->height);
}
}
}
- return false;
+ return pixman_region32_not_empty(blur_region);
}
void workspace_for_each_container(struct sway_workspace *ws,