layer-shell: fix commit handler
This commit makes sure the extents are kept up-to-date, fixes not damaging the surface if its layer shell-specific state didn't change, and adds a check if the layer shell-specific state didn't change but the surface got mapped/unmapped, which could affect keyboard focus.
This commit is contained in:
parent
c11b5db4d6
commit
5fd5d6434e
|
@ -22,6 +22,7 @@ struct sway_layer_surface {
|
||||||
struct wl_listener new_subsurface;
|
struct wl_listener new_subsurface;
|
||||||
|
|
||||||
struct wlr_box geo;
|
struct wlr_box geo;
|
||||||
|
bool mapped;
|
||||||
struct wlr_box extent;
|
struct wlr_box extent;
|
||||||
enum zwlr_layer_shell_v1_layer layer;
|
enum zwlr_layer_shell_v1_layer layer;
|
||||||
};
|
};
|
||||||
|
|
|
@ -168,9 +168,6 @@ static void arrange_layer(struct sway_output *output, struct wl_list *list,
|
||||||
}
|
}
|
||||||
// Apply
|
// Apply
|
||||||
sway_layer->geo = box;
|
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,
|
apply_exclusive(usable_area, state->anchor, state->exclusive_zone,
|
||||||
state->margin.top, state->margin.right,
|
state->margin.top, state->margin.right,
|
||||||
state->margin.bottom, state->margin.left);
|
state->margin.bottom, state->margin.left);
|
||||||
|
@ -297,24 +294,30 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) {
|
||||||
if (wlr_output == NULL) {
|
if (wlr_output == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (layer_surface->current.committed == 0) {
|
|
||||||
// The layer surface state didn't change
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct sway_output *output = wlr_output->data;
|
struct sway_output *output = wlr_output->data;
|
||||||
struct wlr_box old_extent = layer->extent;
|
struct wlr_box old_extent = layer->extent;
|
||||||
arrange_layers(output);
|
|
||||||
|
bool layer_changed = false;
|
||||||
|
if (layer_surface->current.committed != 0
|
||||||
|
|| layer->mapped != layer_surface->mapped) {
|
||||||
|
layer->mapped = layer_surface->mapped;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
arrange_layers(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_surface_get_extends(layer_surface->surface, &layer->extent);
|
||||||
|
layer->extent.x += layer->geo.x;
|
||||||
|
layer->extent.y += layer->geo.y;
|
||||||
|
|
||||||
bool extent_changed =
|
bool extent_changed =
|
||||||
memcmp(&old_extent, &layer->extent, sizeof(struct wlr_box)) != 0;
|
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 (extent_changed || layer_changed) {
|
if (extent_changed || layer_changed) {
|
||||||
output_damage_box(output, &old_extent);
|
output_damage_box(output, &old_extent);
|
||||||
output_damage_surface(output, layer->geo.x, layer->geo.y,
|
output_damage_surface(output, layer->geo.x, layer->geo.y,
|
||||||
|
|
Loading…
Reference in a new issue