From 97d17f2f5b2324900fab669ed730eb711ba3fe6f Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 22 Apr 2012 20:10:29 +0200 Subject: [PATCH] i3bar: Bugfix: Properly reparent tray clients before killing the bar window when outputs disappear Fixes: #655 --- i3bar/src/xcb.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/i3bar/src/xcb.c b/i3bar/src/xcb.c index afcfaa39..ebc214bd 100644 --- a/i3bar/src/xcb.c +++ b/i3bar/src/xcb.c @@ -1055,18 +1055,8 @@ void init_tray() { */ void clean_xcb() { i3_output *o_walk; - trayclient *trayclient; free_workspaces(); SLIST_FOREACH(o_walk, outputs, slist) { - TAILQ_FOREACH(trayclient, o_walk->trayclients, tailq) { - /* Unmap, then reparent (to root) the tray client windows */ - xcb_unmap_window(xcb_connection, trayclient->win); - xcb_reparent_window(xcb_connection, - trayclient->win, - xcb_root, - 0, - 0); - } destroy_window(o_walk); FREE(o_walk->trayclients); FREE(o_walk->workspaces); @@ -1117,6 +1107,18 @@ void destroy_window(i3_output *output) { if (output->bar == XCB_NONE) { return; } + + trayclient *trayclient; + TAILQ_FOREACH(trayclient, output->trayclients, tailq) { + /* Unmap, then reparent (to root) the tray client windows */ + xcb_unmap_window(xcb_connection, trayclient->win); + xcb_reparent_window(xcb_connection, + trayclient->win, + xcb_root, + 0, + 0); + } + xcb_destroy_window(xcb_connection, output->bar); output->bar = XCB_NONE; }