aboutsummaryrefslogtreecommitdiffstats
path: root/sway/desktop/layer_shell.c
diff options
context:
space:
mode:
authorLibravatar emersion <contact@emersion.fr>2018-04-06 11:27:40 -0400
committerLibravatar emersion <contact@emersion.fr>2018-04-06 11:45:40 -0400
commit516f5454adb3fc7dd2e02258251b7cb6d6949aa3 (patch)
tree22c6bdfa1f79224daca6403162d24acdf611a6f9 /sway/desktop/layer_shell.c
parentMerge pull request #1755 from emersion/view-child-hidpi (diff)
downloadsway-516f5454adb3fc7dd2e02258251b7cb6d6949aa3.tar.gz
sway-516f5454adb3fc7dd2e02258251b7cb6d6949aa3.tar.zst
sway-516f5454adb3fc7dd2e02258251b7cb6d6949aa3.zip
Simplify damage tracking functions, use them in layer shell
Diffstat (limited to 'sway/desktop/layer_shell.c')
-rw-r--r--sway/desktop/layer_shell.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c
index 663ec7ba..f841e5f1 100644
--- a/sway/desktop/layer_shell.c
+++ b/sway/desktop/layer_shell.c
@@ -229,33 +229,39 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) {
229 wl_container_of(listener, layer, surface_commit); 229 wl_container_of(listener, layer, surface_commit);
230 struct wlr_layer_surface *layer_surface = layer->layer_surface; 230 struct wlr_layer_surface *layer_surface = layer->layer_surface;
231 struct wlr_output *wlr_output = layer_surface->output; 231 struct wlr_output *wlr_output = layer_surface->output;
232 if (wlr_output != NULL) { 232 if (wlr_output == NULL) {
233 struct sway_output *output = wlr_output->data; 233 return;
234 struct wlr_box old_geo = layer->geo; 234 }
235 arrange_layers(output); 235
236 if (memcmp(&old_geo, &layer->geo, sizeof(struct wlr_box)) != 0) { 236 struct sway_output *output = wlr_output->data;
237 // TODO DAMAGE apply whole surface from previous and new geos 237 struct wlr_box old_geo = layer->geo;
238 } else { 238 arrange_layers(output);
239 // TODO DAMAGE from surface damage 239 if (memcmp(&old_geo, &layer->geo, sizeof(struct wlr_box)) != 0) {
240 } 240 output_damage_surface(output, old_geo.x, old_geo.y,
241 wlr_output_damage_add_box(output->damage, &old_geo); 241 layer_surface->surface, true);
242 wlr_output_damage_add_box(output->damage, &layer->geo); 242 output_damage_surface(output, layer->geo.x, layer->geo.y,
243 layer_surface->surface, true);
244 } else {
245 output_damage_surface(output, layer->geo.x, layer->geo.y,
246 layer_surface->surface, false);
243 } 247 }
244} 248}
245 249
246static void unmap(struct sway_layer_surface *sway_layer) { 250static void unmap(struct sway_layer_surface *sway_layer) {
247 struct wlr_output *wlr_output = sway_layer->layer_surface->output; 251 struct wlr_output *wlr_output = sway_layer->layer_surface->output;
248 if (wlr_output != NULL) { 252 if (wlr_output == NULL) {
249 struct sway_output *output = wlr_output->data; 253 return;
250 wlr_output_damage_add_box(output->damage, &sway_layer->geo);
251 } 254 }
255 struct sway_output *output = wlr_output->data;
256 output_damage_surface(output, sway_layer->geo.x, sway_layer->geo.y,
257 sway_layer->layer_surface->surface, true);
252} 258}
253 259
254static void handle_destroy(struct wl_listener *listener, void *data) { 260static void handle_destroy(struct wl_listener *listener, void *data) {
255 struct sway_layer_surface *sway_layer = wl_container_of(listener, 261 struct sway_layer_surface *sway_layer =
256 sway_layer, destroy); 262 wl_container_of(listener, sway_layer, destroy);
257 wlr_log(L_DEBUG, "Layer surface destroyed (%s)", 263 wlr_log(L_DEBUG, "Layer surface destroyed (%s)",
258 sway_layer->layer_surface->namespace); 264 sway_layer->layer_surface->namespace);
259 if (sway_layer->layer_surface->mapped) { 265 if (sway_layer->layer_surface->mapped) {
260 unmap(sway_layer); 266 unmap(sway_layer);
261 } 267 }
@@ -277,7 +283,9 @@ static void handle_map(struct wl_listener *listener, void *data) {
277 struct sway_layer_surface *sway_layer = wl_container_of(listener, 283 struct sway_layer_surface *sway_layer = wl_container_of(listener,
278 sway_layer, map); 284 sway_layer, map);
279 struct sway_output *output = sway_layer->layer_surface->output->data; 285 struct sway_output *output = sway_layer->layer_surface->output->data;
280 wlr_output_damage_add_box(output->damage, &sway_layer->geo); 286 output_damage_surface(output, sway_layer->geo.x, sway_layer->geo.y,
287 sway_layer->layer_surface->surface, true);
288 // TODO: send enter to subsurfaces and popups
281 wlr_surface_send_enter(sway_layer->layer_surface->surface, 289 wlr_surface_send_enter(sway_layer->layer_surface->surface,
282 sway_layer->layer_surface->output); 290 sway_layer->layer_surface->output);
283} 291}