summaryrefslogtreecommitdiff
path: root/sway/desktop/render.c
diff options
context:
space:
mode:
authoremersion <[email protected]>2018-07-25 08:50:06 +0100
committeremersion <[email protected]>2018-07-25 08:55:41 +0100
commit0e79b2114c0bd374c6b4a37fc2ee0e672b8fbb38 (patch)
treed0067d3466d26526bf2531e19e3a5e24532d312b /sway/desktop/render.c
parent224ade138208e9aa525423cbfbd643aa9d9b63c3 (diff)
Improve rendering with a fullscreen opaque overlay surface
The rendering code doesn't use the exclusive input surface at all anymore to decide to skip rendering of shell surfaces. This fixes a weird situation in which a client requests exclusive input but isn't an overlay layer surface. The renderer also renders all overlay surfaces in this situation, not just one. This simplifies the code and fixes rendering when there are more than one overlay surfaces (e.g. for a virtual keyboard to type the lockscreen password).
Diffstat (limited to 'sway/desktop/render.c')
-rw-r--r--sway/desktop/render.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/sway/desktop/render.c b/sway/desktop/render.c
index 7da54594..d6c3fa8c 100644
--- a/sway/desktop/render.c
+++ b/sway/desktop/render.c
@@ -836,21 +836,12 @@ void output_render(struct sway_output *output, struct timespec *when,
struct sway_container *workspace = output_get_active_workspace(output);
struct sway_view *fullscreen_view = workspace->current.ws_fullscreen;
- struct sway_seat *seat = input_manager_current_seat(input_manager);
-
- if (output_has_opaque_lockscreen(output, seat) && seat->focused_layer) {
- struct wlr_layer_surface *wlr_layer_surface = seat->focused_layer;
- struct sway_layer_surface *sway_layer_surface =
- layer_from_wlr_layer_surface(seat->focused_layer);
- struct render_data data = {
- .output = output,
- .damage = damage,
- .alpha = 1.0f,
- };
- output_surface_for_each_surface(wlr_layer_surface->surface,
- sway_layer_surface->geo.x, sway_layer_surface->geo.y,
- &data.root_geo, render_surface_iterator, &data);
- } else if (fullscreen_view) {
+
+ if (output_has_opaque_overlay_layer_surface(output)) {
+ goto render_overlay;
+ }
+
+ if (fullscreen_view) {
float clear_color[] = {0.0f, 0.0f, 0.0f, 1.0f};
int nrects;
@@ -894,6 +885,8 @@ void output_render(struct sway_output *output, struct timespec *when,
render_layer(output, damage,
&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_TOP]);
}
+
+render_overlay:
render_layer(output, damage,
&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]);
render_drag_icons(output, damage, &root_container.sway_root->drag_icons);