From 8c6227820754f2bb09ebda3676dcf7a43722ff64 Mon Sep 17 00:00:00 2001 From: David96 Date: Tue, 3 Dec 2019 16:03:38 +0100 Subject: Render layer shell popups over the top layer --- include/sway/output.h | 8 ++++++++ sway/desktop/output.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ sway/desktop/render.c | 31 +++++++++++++++++++++++------ 3 files changed, 88 insertions(+), 6 deletions(-) diff --git a/include/sway/output.h b/include/sway/output.h index 4771b14f..cabb4b55 100644 --- a/include/sway/output.h +++ b/include/sway/output.h @@ -125,6 +125,14 @@ void output_layer_for_each_surface(struct sway_output *output, struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator, void *user_data); +void output_layer_for_each_surface_toplevel(struct sway_output *output, + struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator, + void *user_data); + +void output_layer_for_each_surface_popup(struct sway_output *output, + struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator, + void *user_data); + #if HAVE_XWAYLAND void output_unmanaged_for_each_surface(struct sway_output *output, struct wl_list *unmanaged, sway_surface_iterator_func_t iterator, diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 367be2d0..a86622e1 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -243,6 +243,61 @@ void output_layer_for_each_surface(struct sway_output *output, } } +void output_layer_for_each_surface_toplevel(struct sway_output *output, + struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator, + void *user_data) { + struct sway_layer_surface *layer_surface; + wl_list_for_each(layer_surface, layer_surfaces, link) { + struct wlr_layer_surface_v1 *wlr_layer_surface_v1 = + layer_surface->layer_surface; + output_surface_for_each_surface(output, wlr_layer_surface_v1->surface, + layer_surface->geo.x, layer_surface->geo.y, iterator, + user_data); + } +} + + +void output_layer_for_each_surface_popup(struct sway_output *output, + struct wl_list *layer_surfaces, sway_surface_iterator_func_t iterator, + void *user_data) { + struct sway_layer_surface *layer_surface; + wl_list_for_each(layer_surface, layer_surfaces, link) { + struct wlr_layer_surface_v1 *wlr_layer_surface_v1 = + layer_surface->layer_surface; + + struct wlr_xdg_popup *state; + wl_list_for_each(state, &wlr_layer_surface_v1->popups, link) { + struct wlr_xdg_surface *popup = state->base; + if (!popup->configured) { + continue; + } + + double popup_sx, popup_sy; + popup_sx = layer_surface->geo.x + + popup->popup->geometry.x - popup->geometry.x; + popup_sy = layer_surface->geo.y + + popup->popup->geometry.y - popup->geometry.y; + + struct wlr_surface *surface = popup->surface; + + struct surface_iterator_data data = { + .user_iterator = iterator, + .user_data = user_data, + .output = output, + .view = NULL, + .ox = popup_sx, + .oy = popup_sy, + .width = surface->current.width, + .height = surface->current.height, + .rotation = 0, + }; + + wlr_xdg_surface_for_each_surface( + popup, output_for_each_surface_iterator, &data); + } + } +} + #if HAVE_XWAYLAND void output_unmanaged_for_each_surface(struct sway_output *output, struct wl_list *unmanaged, sway_surface_iterator_func_t iterator, diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 477034fc..14753df2 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -156,13 +156,23 @@ static void render_surface_iterator(struct sway_output *output, struct sway_view wlr_output); } -static void render_layer(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 = { .damage = damage, .alpha = 1.0f, }; - output_layer_for_each_surface(output, layer_surfaces, + output_layer_for_each_surface_toplevel(output, layer_surfaces, + render_surface_iterator, &data); +} + +static void render_layer_popups(struct sway_output *output, + pixman_region32_t *damage, struct wl_list *layer_surfaces) { + struct render_data data = { + .damage = damage, + .alpha = 1.0f, + }; + output_layer_for_each_surface_popup(output, layer_surfaces, render_surface_iterator, &data); } @@ -1041,9 +1051,9 @@ void output_render(struct sway_output *output, struct timespec *when, wlr_renderer_clear(renderer, clear_color); } - render_layer(output, damage, + render_layer_toplevel(output, damage, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]); - render_layer(output, damage, + render_layer_toplevel(output, damage, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]); render_workspace(output, damage, workspace, workspace->current.focused); @@ -1051,7 +1061,14 @@ void output_render(struct sway_output *output, struct timespec *when, #if HAVE_XWAYLAND render_unmanaged(output, damage, &root->xwayland_unmanaged); #endif - render_layer(output, damage, + render_layer_toplevel(output, damage, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); + + render_layer_popups(output, damage, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND]); + render_layer_popups(output, damage, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BOTTOM]); + render_layer_popups(output, damage, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); } @@ -1064,7 +1081,9 @@ void output_render(struct sway_output *output, struct timespec *when, } render_overlay: - render_layer(output, damage, + render_layer_toplevel(output, damage, + &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); + render_layer_popups(output, damage, &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); render_drag_icons(output, damage, &root->drag_icons); -- cgit v1.2.3-54-g00ecf