diff options
author | emersion <contact@emersion.fr> | 2018-04-06 11:27:40 -0400 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-04-06 11:45:40 -0400 |
commit | 516f5454adb3fc7dd2e02258251b7cb6d6949aa3 (patch) | |
tree | 22c6bdfa1f79224daca6403162d24acdf611a6f9 /sway/desktop/layer_shell.c | |
parent | Merge pull request #1755 from emersion/view-child-hidpi (diff) | |
download | sway-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.c | 44 |
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 | ||
246 | static void unmap(struct sway_layer_surface *sway_layer) { | 250 | static 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 | ||
254 | static void handle_destroy(struct wl_listener *listener, void *data) { | 260 | static 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 | } |