aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/desktop/render.c')
-rw-r--r--sway/desktop/render.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index f0e47c95..cdac9c72 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -186,13 +186,37 @@ static void premultiply_alpha(float color[4], float opacity) {
186 color[2] *= color[3]; 186 color[2] *= color[3];
187} 187}
188 188
189static void render_view_surfaces(struct sway_view *view, 189static void render_view_toplevels(struct sway_view *view,
190 struct sway_output *output, pixman_region32_t *damage, float alpha) { 190 struct sway_output *output, pixman_region32_t *damage, float alpha) {
191 struct render_data data = { 191 struct render_data data = {
192 .damage = damage, 192 .damage = damage,
193 .alpha = alpha, 193 .alpha = alpha,
194 }; 194 };
195 output_view_for_each_surface(output, view, render_surface_iterator, &data); 195 // Render all toplevels without descending into popups
196 output_surface_for_each_surface(output, view->surface,
197 view->swayc->current.view_x - output->wlr_output->lx,
198 view->swayc->current.view_y - output->wlr_output->ly,
199 render_surface_iterator, &data);
200}
201
202static void render_popup_iterator(struct sway_output *output,
203 struct wlr_surface *surface, struct wlr_box *box, float rotation,
204 void *data) {
205 // Render this popup's surface
206 render_surface_iterator(output, surface, box, rotation, data);
207
208 // Render this popup's child toplevels
209 output_surface_for_each_surface(output, surface, box->x, box->y,
210 render_surface_iterator, data);
211}
212
213static void render_view_popups(struct sway_view *view,
214 struct sway_output *output, pixman_region32_t *damage, float alpha) {
215 struct render_data data = {
216 .damage = damage,
217 .alpha = alpha,
218 };
219 output_view_for_each_popup(output, view, render_popup_iterator, &data);
196} 220}
197 221
198static void render_saved_view(struct sway_view *view, 222static void render_saved_view(struct sway_view *view,
@@ -239,7 +263,7 @@ static void render_view(struct sway_output *output, pixman_region32_t *damage,
239 if (view->saved_buffer) { 263 if (view->saved_buffer) {
240 render_saved_view(view, output, damage, view->swayc->alpha); 264 render_saved_view(view, output, damage, view->swayc->alpha);
241 } else { 265 } else {
242 render_view_surfaces(view, output, damage, view->swayc->alpha); 266 render_view_toplevels(view, output, damage, view->swayc->alpha);
243 } 267 }
244 268
245 if (view->using_csd) { 269 if (view->using_csd) {
@@ -843,7 +867,7 @@ void output_render(struct sway_output *output, struct timespec *when,
843 render_saved_view(fullscreen_con->sway_view, 867 render_saved_view(fullscreen_con->sway_view,
844 output, damage, 1.0f); 868 output, damage, 1.0f);
845 } else { 869 } else {
846 render_view_surfaces(fullscreen_con->sway_view, 870 render_view_toplevels(fullscreen_con->sway_view,
847 output, damage, 1.0f); 871 output, damage, 1.0f);
848 } 872 }
849 } else { 873 } else {
@@ -879,6 +903,12 @@ void output_render(struct sway_output *output, struct timespec *when,
879 &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]); 903 &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]);
880 } 904 }
881 905
906 struct sway_seat *seat = input_manager_current_seat(input_manager);
907 struct sway_container *focus = seat_get_focus(seat);
908 if (focus && focus->type == C_VIEW) {
909 render_view_popups(focus->sway_view, output, damage, focus->alpha);
910 }
911
882render_overlay: 912render_overlay:
883 render_layer(output, damage, 913 render_layer(output, damage,
884 &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]); 914 &output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]);