Skip to content

Commit

Permalink
layer_shell: damage previous area when a surface shrinks
Browse files Browse the repository at this point in the history
When a layer surface shrinks we need to damage the area it previously
occupied, but we don't know the location of all its subsurfaces in the
previous state, so instead damage a rectangle that encloses the entire
previous extent.
  • Loading branch information
Ronan Pigott authored and emersion committed Aug 12, 2021
1 parent acf946f commit f67ed67
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 6 deletions.
1 change: 1 addition & 0 deletions include/sway/layers.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ struct sway_layer_surface {
struct wl_listener new_subsurface;

struct wlr_box geo;
struct wlr_box extent;
enum zwlr_layer_shell_v1_layer layer;
};

Expand Down
14 changes: 8 additions & 6 deletions sway/desktop/layer_shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,9 @@ static void arrange_layer(struct sway_output *output, struct wl_list *list,
}
// Apply
sway_layer->geo = box;
wlr_surface_get_extends(layer->surface, &sway_layer->extent);
sway_layer->extent.x += box.x;
sway_layer->extent.y += box.y;
apply_exclusive(usable_area, state->anchor, state->exclusive_zone,
state->margin.top, state->margin.right,
state->margin.bottom, state->margin.left);
Expand Down Expand Up @@ -297,21 +300,20 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) {
}

struct sway_output *output = wlr_output->data;
struct wlr_box old_geo = layer->geo;
struct wlr_box old_extent = layer->extent;
arrange_layers(output);

bool geo_changed =
memcmp(&old_geo, &layer->geo, sizeof(struct wlr_box)) != 0;
bool extent_changed =
memcmp(&old_extent, &layer->extent, sizeof(struct wlr_box)) != 0;
bool layer_changed = layer->layer != layer_surface->current.layer;
if (layer_changed) {
wl_list_remove(&layer->link);
wl_list_insert(&output->layers[layer_surface->current.layer],
&layer->link);
layer->layer = layer_surface->current.layer;
}
if (geo_changed || layer_changed) {
output_damage_surface(output, old_geo.x, old_geo.y,
layer_surface->surface, true);
if (extent_changed || layer_changed) {
output_damage_box(output, &old_extent);
output_damage_surface(output, layer->geo.x, layer->geo.y,
layer_surface->surface, true);
} else {
Expand Down

0 comments on commit f67ed67

Please sign in to comment.