1
0
Fork 0
mirror of https://github.com/yshui/picom.git synced 2025-04-14 17:53:25 -04:00

core: don't leak pixmaps of saved window images

This commit is contained in:
Maxim Solovyov 2024-11-07 00:41:09 +03:00 committed by Yuxuan Shui
parent dc9009df8b
commit 006a5e9ecd
No known key found for this signature in database
GPG key ID: D3A4405BE6CC17F4
3 changed files with 9 additions and 8 deletions

View file

@ -1686,9 +1686,7 @@ static void handle_pending_updates(struct session *ps, double delta_t) {
w->running_animation_instance = NULL;
w->in_openclose = false;
if (w->saved_win_image != NULL) {
ps->backend_data->ops.release_image(ps->backend_data,
w->saved_win_image);
w->saved_win_image = NULL;
win_release_saved_win_image(ps->backend_data, w);
}
if (w->state == WSTATE_UNMAPPED) {
unmap_win_finish(ps, w);

View file

@ -235,10 +235,14 @@ static inline void win_release_mask(backend_t *base, struct win *w) {
}
}
static inline void win_release_saved_win_image(backend_t *base, struct win *w) {
void win_release_saved_win_image(backend_t *base, struct win *w) {
if (w->saved_win_image) {
base->ops.release_image(base, w->saved_win_image);
xcb_pixmap_t pixmap = XCB_NONE;
pixmap = base->ops.release_image(base, w->saved_win_image);
w->saved_win_image = NULL;
if (pixmap != XCB_NONE) {
xcb_free_pixmap(base->c->c, pixmap);
}
}
}
@ -1937,9 +1941,7 @@ bool win_process_animation_and_state_change(struct session *ps, struct win *w, d
if (win_check_flags_any(w, WIN_FLAGS_PIXMAP_STALE)) {
// Grab the old pixmap, animations might need it
if (w->saved_win_image) {
ps->backend_data->ops.release_image(ps->backend_data,
w->saved_win_image);
w->saved_win_image = NULL;
win_release_saved_win_image(ps->backend_data, w);
}
if (ps->drivers & DRIVER_NVIDIA) {
if (w->win_image != NULL) {

View file

@ -419,6 +419,7 @@ void unmap_win_finish(session_t *ps, struct win *w);
/// because of fading and such.
void win_destroy_start(session_t *ps, struct win *w);
void win_map_start(struct session *ps, struct win *w);
void win_release_saved_win_image(backend_t *base, struct win *w);
/// Release images bound with a window, set the *_NONE flags on the window. Only to be
/// used when de-initializing the backend outside of win.c
void win_release_images(struct backend_base *backend, struct win *w);