aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorRyan Dwyer <ryandwyer1@gmail.com>2018-07-01 10:58:13 +1000
committerRyan Dwyer <ryandwyer1@gmail.com>2018-07-07 00:03:49 +1000
commit58befcf2cdf261b8898b6fd1288a69d367101ff1 (patch)
tree7fdb6fa8b637f814309157425f59a87891106d7b /sway
parentb8ee88344a5e2869fd3ce04762eda305dc5bf62e (diff)
Don't send frame done to surfaces behind lockscreen
Also, when rendering, don't descend into the tree if the lockscreen is active. Just render the lockscreen's surfaces.
Diffstat (limited to 'sway')
-rw-r--r--sway/desktop/output.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/sway/desktop/output.c b/sway/desktop/output.c
index 1211cc07..52bd1666 100644
--- a/sway/desktop/output.c
+++ b/sway/desktop/output.c
@@ -948,8 +948,30 @@ static void render_output(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 (seat->exclusive_client && seat->focused_layer) {
+ float clear_color[] = {0.0f, 0.0f, 0.0f, 1.0f};
+
+ int nrects;
+ pixman_box32_t *rects = pixman_region32_rectangles(damage, &nrects);
+ for (int i = 0; i < nrects; ++i) {
+ scissor_output(wlr_output, &rects[i]);
+ wlr_renderer_clear(renderer, clear_color);
+ }
- if (fullscreen_view) {
+ 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,
+ };
+ 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) {
float clear_color[] = {0.0f, 0.0f, 0.0f, 1.0f};
int nrects;
@@ -1019,11 +1041,16 @@ struct send_frame_done_data {
struct root_geometry root_geo;
struct sway_output *output;
struct timespec *when;
+ struct wl_client *exclusive_client;
};
static void send_frame_done_iterator(struct wlr_surface *surface,
int sx, int sy, void *_data) {
struct send_frame_done_data *data = _data;
+ if (data->exclusive_client &&
+ data->exclusive_client != surface->resource->client) {
+ return;
+ }
bool intersects = get_surface_box(&data->root_geo, data->output, surface,
sx, sy, NULL);
@@ -1072,9 +1099,11 @@ static void send_frame_done_container(struct send_frame_done_data *data,
}
static void send_frame_done(struct sway_output *output, struct timespec *when) {
+ struct sway_seat *seat = input_manager_current_seat(input_manager);
struct send_frame_done_data data = {
.output = output,
.when = when,
+ .exclusive_client = seat->exclusive_client,
};
struct sway_container *workspace = output_get_active_workspace(output);