diff options
author | Orestis Floros <orestisflo@gmail.com> | 2020-06-27 00:10:53 +0200 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2020-07-22 09:33:19 +0200 |
commit | 68904aeb38b06fe0ea1c40512048c162497a7d99 (patch) | |
tree | da53d51358c63b76c3b1c65a80ac67c3e2a00d58 | |
parent | 551d0a5b13bf1720a14465ded86e9dcd85e11573 (diff) | |
download | i3-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.c | 13 |
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 |