From d0244b0bf1225f84c969cd55745a9c154f3dd489 Mon Sep 17 00:00:00 2001 From: Erik Reider Date: Wed, 19 Apr 2023 14:17:22 +0200 Subject: [PATCH] Initial toplevel effects --- .../sway/desktop/fx_renderer/fx_renderer.h | 7 ++++ include/sway/layers.h | 4 +++ sway/desktop/layer_shell.c | 9 +++++ sway/desktop/output.c | 6 ++++ sway/desktop/render.c | 34 ++++++++++--------- 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/include/sway/desktop/fx_renderer/fx_renderer.h b/include/sway/desktop/fx_renderer/fx_renderer.h index 37887d30..a04791fa 100644 --- a/include/sway/desktop/fx_renderer/fx_renderer.h +++ b/include/sway/desktop/fx_renderer/fx_renderer.h @@ -32,6 +32,13 @@ struct decoration_data { bool blur; }; +struct fx_render_data { + pixman_region32_t *damage; + struct wlr_box *clip_box; + struct decoration_data deco_data; + bool is_toplevel_surface; +}; + struct gles2_tex_shader { GLuint program; GLint proj; diff --git a/include/sway/layers.h b/include/sway/layers.h index f8508493..c5b7f284 100644 --- a/include/sway/layers.h +++ b/include/sway/layers.h @@ -27,6 +27,10 @@ struct sway_layer_surface { enum zwlr_layer_shell_v1_layer layer; struct wl_list subsurfaces; + + bool should_blur; + bool should_corner_radius; + bool should_shadow; }; struct sway_layer_popup { diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index a8356ad7..288dad09 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c @@ -685,6 +685,15 @@ void handle_layer_shell_surface(struct wl_listener *listener, void *data) { sway_layer->layer_surface = layer_surface; layer_surface->data = sway_layer; + enum zwlr_layer_shell_v1_layer layer = layer_surface->current.layer; + // TODO: Effects bool in config? + if (layer != ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM && layer != ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND) { + printf("Namespace: %s\n", layer_surface->namespace); + sway_layer->should_blur = true; + sway_layer->should_corner_radius = true; + sway_layer->should_shadow = true; + } + struct sway_output *output = layer_surface->output->data; sway_layer->output_destroy.notify = handle_output_destroy; wl_signal_add(&output->events.disable, &sway_layer->output_destroy); diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 45c2f1c4..be5051c4 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -199,6 +199,12 @@ void output_layer_for_each_toplevel_surface(struct sway_output *output, wl_list_for_each(layer_surface, layer_surfaces, link) { struct wlr_layer_surface_v1 *wlr_layer_surface_v1 = layer_surface->layer_surface; + struct fx_render_data *data = user_data; + data->deco_data.blur = layer_surface->should_blur; + data->deco_data.corner_radius = + layer_surface->should_corner_radius? config->corner_radius: 0; + data->is_toplevel_surface = true; + output_surface_for_each_surface(output, wlr_layer_surface_v1->surface, layer_surface->geo.x, layer_surface->geo.y, iterator, user_data); diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 9415d469..e5118402 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -32,12 +32,6 @@ #include "sway/tree/view.h" #include "sway/tree/workspace.h" -struct render_data { - pixman_region32_t *damage; - struct wlr_box *clip_box; - struct decoration_data deco_data; -}; - struct workspace_effect_info { bool container_wants_blur; bool container_wants_shadow; @@ -333,7 +327,7 @@ damage_finish: static void render_surface_iterator(struct sway_output *output, struct sway_view *view, struct wlr_surface *surface, struct wlr_box *_box, void *_data) { - struct render_data *data = _data; + struct fx_render_data *data = _data; struct wlr_output *wlr_output = output->wlr_output; pixman_region32_t *output_damage = data->damage; @@ -364,7 +358,16 @@ static void render_surface_iterator(struct sway_output *output, deco_data.corner_radius *= wlr_output->scale; // render blur (view->surface == surface excludes blurring subsurfaces) - if (deco_data.blur && should_parameters_blur() && view->surface == surface) { + bool is_subsurface = true; + bool is_floating = true; + if (data->is_toplevel_surface) { + is_subsurface = false; + is_floating = !config->blur_xray; + } else if (view) { + is_subsurface = view->surface != surface; + is_floating = container_is_floating(view->container); + } + if (deco_data.blur && should_parameters_blur() && !is_subsurface) { pixman_region32_t opaque_region; pixman_region32_init(&opaque_region); @@ -381,7 +384,6 @@ static void render_surface_iterator(struct sway_output *output, int width, height; wlr_output_transformed_resolution(wlr_output, &width, &height); struct wlr_fbox blur_src_box = { 0, 0, width, height }; - bool is_floating = container_is_floating(view->container); render_blur(!is_floating, output, output_damage, &blur_src_box, &dst_box, &opaque_region, surface->current.width, surface->current.height, surface->current.scale, deco_data.corner_radius); } @@ -401,7 +403,7 @@ static void render_surface_iterator(struct sway_output *output, static void render_layer_toplevel(struct sway_output *output, pixman_region32_t *damage, struct wl_list *layer_surfaces) { - struct render_data data = { + struct fx_render_data data = { .damage = damage, .deco_data = get_undecorated_decoration_data(), }; @@ -411,7 +413,7 @@ static void render_layer_toplevel(struct sway_output *output, static void render_layer_popups(struct sway_output *output, pixman_region32_t *damage, struct wl_list *layer_surfaces) { - struct render_data data = { + struct fx_render_data data = { .damage = damage, .deco_data = get_undecorated_decoration_data(), }; @@ -422,7 +424,7 @@ static void render_layer_popups(struct sway_output *output, #if HAVE_XWAYLAND static void render_unmanaged(struct sway_output *output, pixman_region32_t *damage, struct wl_list *unmanaged) { - struct render_data data = { + struct fx_render_data data = { .damage = damage, .deco_data = get_undecorated_decoration_data(), }; @@ -433,7 +435,7 @@ static void render_unmanaged(struct sway_output *output, static void render_drag_icons(struct sway_output *output, pixman_region32_t *damage, struct wl_list *drag_icons) { - struct render_data data = { + struct fx_render_data data = { .damage = damage, .deco_data = get_undecorated_decoration_data(), }; @@ -645,7 +647,7 @@ void premultiply_alpha(float color[4], float opacity) { static void render_view_toplevels(struct sway_view *view, struct sway_output *output, pixman_region32_t *damage, struct decoration_data deco_data) { - struct render_data data = { + struct fx_render_data data = { .damage = damage, .deco_data = deco_data, }; @@ -669,7 +671,7 @@ static void render_view_toplevels(struct sway_view *view, struct sway_output *ou static void render_view_popups(struct sway_view *view, struct sway_output *output, pixman_region32_t *damage, struct decoration_data deco_data) { - struct render_data data = { + struct fx_render_data data = { .damage = damage, .deco_data = deco_data, }; @@ -1826,7 +1828,7 @@ void output_render(struct sway_output *output, struct timespec *when, } if (server.session_lock.lock != NULL) { - struct render_data data = { + struct fx_render_data data = { .damage = damage, .deco_data = get_undecorated_decoration_data(), };