aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOrestis Floros <orestisflo@gmail.com>2020-06-27 00:10:53 +0200
committerMichael Stapelberg <michael@stapelberg.de>2020-07-22 09:33:19 +0200
commit68904aeb38b06fe0ea1c40512048c162497a7d99 (patch)
treeda53d51358c63b76c3b1c65a80ac67c3e2a00d58
parent551d0a5b13bf1720a14465ded86e9dcd85e11573 (diff)
downloadi3-68904aeb38b06fe0ea1c40512048c162497a7d99.tar.gz
i3-68904aeb38b06fe0ea1c40512048c162497a7d99.zip
Fix i3bar Xorg memory leak (#4140)
The `*_free_*` calls in this branch: https://github.com/i3/i3/blob/51b0583578ecb8ccdb264dca9a0c7f64afca60be/i3bar/src/xcb.c#L1854 are never called when we remove the output from the tailq during a refresh. Fixes #4123
-rw-r--r--i3bar/src/xcb.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c
index 970846a9..ec069021 100644
--- a/i3bar/src/xcb.c
+++ b/i3bar/src/xcb.c
@@ -1648,16 +1648,19 @@ void kick_tray_clients(i3_output *output) {
*
*/
void destroy_window(i3_output *output) {
- if (output == NULL) {
- return;
- }
- if (output->bar.id == XCB_NONE) {
+ if (output == NULL || output->bar.id == XCB_NONE) {
return;
}
- kick_tray_clients(output);
+ draw_util_surface_free(xcb_connection, &(output->bar));
+ draw_util_surface_free(xcb_connection, &(output->buffer));
+ draw_util_surface_free(xcb_connection, &(output->statusline_buffer));
xcb_destroy_window(xcb_connection, output->bar.id);
+ xcb_free_pixmap(xcb_connection, output->buffer.id);
+ xcb_free_pixmap(xcb_connection, output->statusline_buffer.id);
output->bar.id = XCB_NONE;
+
+ kick_tray_clients(output);
}
/* Strut partial tells i3 where to reserve space for i3bar. This is determined