diff --git a/src/compton.c b/src/compton.c index ebfd4888..61024948 100644 --- a/src/compton.c +++ b/src/compton.c @@ -475,6 +475,11 @@ static struct managed_win *paint_preprocess(session_t *ps, bool *fade_running) { rc_region_unref(&w->reg_ignore); } + // Clear flags if we are not using experimental backends + if (!ps->o.experimental_backends) { + w->flags = 0; + } + // log_trace("%d %d %s", w->a.map_state, w->ever_damaged, w->name); // Give up if it's not damaged or invisible, or it's unmapped and its @@ -700,7 +705,7 @@ static void destroy_backend(session_t *ps) { if (!w) { continue; } - if (ps->o.experimental_backends) { + if (ps->backend_data) { if (w->state == WSTATE_MAPPED) { win_release_image(ps->backend_data, w); } else { @@ -712,12 +717,11 @@ static void destroy_backend(session_t *ps) { ps->root_image); ps->root_image = NULL; } - } else { - free_paint(ps, &w->paint); } + free_paint(ps, &w->paint); } - if (ps->o.experimental_backends) { + if (ps->backend_data) { // deinit backend ps->backend_data->ops->deinit(ps->backend_data); ps->backend_data = NULL; @@ -762,17 +766,20 @@ void configure_root(session_t *ps, int width, int height) { log_info("Root configuration changed, new geometry: %dx%d", width, height); // On root window changes bool has_root_change = false; - if (ps->o.experimental_backends && ps->redirected) { + if (ps->o.experimental_backends) { has_root_change = ps->backend_data->ops->root_change != NULL; - if (!has_root_change) { - // deinit/reinit backend and free up resources if the backend - // cannot handle root change - destroy_backend(ps); - } } else { - free_paint(ps, &ps->tgt_buffer); + // Old backend can handle root change + has_root_change = true; } + if (!has_root_change) { + // deinit/reinit backend and free up resources if the backend + // cannot handle root change + destroy_backend(ps); + } + free_paint(ps, &ps->tgt_buffer); + ps->root_width = width; ps->root_height = height; @@ -796,20 +803,21 @@ void configure_root(session_t *ps, int width, int height) { glx_on_root_change(ps); } #endif - if (ps->o.experimental_backends && ps->redirected) { - if (has_root_change) { + if (has_root_change) { + if (ps->backend_data != NULL) { ps->backend_data->ops->root_change(ps->backend_data, ps); - } else { - if (!initialize_backend(ps)) { - log_fatal("Failed to re-initialize backend after root " - "change, aborting..."); - ps->quit = true; - // TODO only event handlers should request ev_break, - // otherwise it's too hard to keep track of what can break - // the event loop - ev_break(ps->loop, EVBREAK_ALL); - return; - } + } + // Old backend's root_change is not a specific function + } else { + if (!initialize_backend(ps)) { + log_fatal("Failed to re-initialize backend after root " + "change, aborting..."); + ps->quit = true; + // TODO only event handlers should request ev_break, + // otherwise it's too hard to keep track of what can break + // the event loop + ev_break(ps->loop, EVBREAK_ALL); + return; } } force_repaint(ps); @@ -900,7 +908,7 @@ void root_damaged(session_t *ps) { return; } - if (ps->o.experimental_backends) { + if (ps->backend_data) { if (ps->root_image) { ps->backend_data->ops->release_image(ps->backend_data, ps->root_image); } @@ -1295,6 +1303,7 @@ static bool redir_start(session_t *ps) { } if (ps->o.experimental_backends) { + assert(ps->backend_data); ps->ndamage = ps->backend_data->ops->max_buffer_age; } else { ps->ndamage = maximum_buffer_age(ps); diff --git a/src/win.c b/src/win.c index a6fa0a54..5f3c9929 100644 --- a/src/win.c +++ b/src/win.c @@ -550,7 +550,7 @@ void win_set_shadow(session_t *ps, struct managed_win *w, bool shadow_new) { log_debug("Updating shadow property of window %#010x (%s) to %d", w->base.id, w->name, shadow_new); - if (ps->o.experimental_backends && ps->redirected && + if (ps->backend_data && w->state != WSTATE_UNMAPPED && !(w->flags & WIN_FLAGS_IMAGE_ERROR)) { assert(!w->shadow_image); // Create shadow image @@ -783,17 +783,15 @@ void win_on_win_size_change(session_t *ps, struct managed_win *w) { w->shadow_dy = ps->o.shadow_offset_y; w->shadow_width = w->widthb + ps->o.shadow_radius * 2; w->shadow_height = w->heightb + ps->o.shadow_radius * 2; + // Invalidate the shadow we built - if (ps->o.experimental_backends && ps->redirected) { - if (w->state == WSTATE_MAPPED || w->state == WSTATE_MAPPING || - w->state == WSTATE_FADING) { - w->flags |= WIN_FLAGS_IMAGE_STALE; - } else { - assert(w->state == WSTATE_UNMAPPED); - } + if (w->state == WSTATE_MAPPED || w->state == WSTATE_MAPPING || + w->state == WSTATE_FADING) { + w->flags |= WIN_FLAGS_IMAGE_STALE; } else { - free_paint(ps, &w->shadow_paint); + assert(w->state == WSTATE_UNMAPPED); } + free_paint(ps, &w->shadow_paint); } /** @@ -1448,19 +1446,15 @@ void win_update_bounding_shape(session_t *ps, struct managed_win *w) { } // Window shape changed, we should free old wpaint and shadow pict - if (ps->o.experimental_backends) { - // log_trace("free out dated pict"); - // Window shape changed, we should free win_data - if (ps->redirected && w->state != WSTATE_UNMAPPED) { - // Note we only do this when screen is redirected, because - // otherwise win_data is not valid - assert(w->state != WSTATE_UNMAPPING && w->state != WSTATE_DESTROYING); - w->flags |= WIN_FLAGS_IMAGE_STALE; - } - } else { - free_paint(ps, &w->paint); - free_paint(ps, &w->shadow_paint); + // log_trace("free out dated pict"); + if (w->state != WSTATE_UNMAPPED) { + // Note we only do this when screen is redirected, because + // otherwise win_data is not valid + assert(w->state != WSTATE_UNMAPPING && w->state != WSTATE_DESTROYING); + w->flags |= WIN_FLAGS_IMAGE_STALE; } + free_paint(ps, &w->paint); + free_paint(ps, &w->shadow_paint); win_on_factor_change(ps, w); } @@ -1557,15 +1551,12 @@ static void finish_unmap_win(session_t *ps, struct managed_win **_w) { w->reg_ignore_valid = false; w->state = WSTATE_UNMAPPED; - if (ps->o.experimental_backends) { - // We are in unmap_win, we definitely was viewable - if (ps->redirected) { - win_release_image(ps->backend_data, w); - } - } else { - free_paint(ps, &w->paint); - free_paint(ps, &w->shadow_paint); + // We are in unmap_win, this window definitely was viewable + if (ps->backend_data) { + win_release_image(ps->backend_data, w); } + free_paint(ps, &w->paint); + free_paint(ps, &w->shadow_paint); w->flags = 0; } @@ -1898,7 +1889,7 @@ void map_win(session_t *ps, struct managed_win *w) { w->flags &= ~WIN_FLAGS_IMAGE_STALE; // Bind image after update_bounding_shape, so the shadow has the correct size. - if (ps->redirected && ps->o.experimental_backends) { + if (ps->backend_data) { if (!win_bind_image(ps, w)) { w->flags |= WIN_FLAGS_IMAGE_ERROR; }