From e835888a9ed1365eb151678e4e2f2ec068e06b18 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 20 Mar 2011 01:07:21 +0100 Subject: [PATCH] Bugfix: Actually re-attach dock clients when outputs get disabled (Thanks phnom) Fixes: #348 --- src/randr.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/randr.c b/src/randr.c index 7033e4c4..0c702db0 100644 --- a/src/randr.c +++ b/src/randr.c @@ -643,6 +643,9 @@ void randr_query_outputs() { if ((first = get_first_output()) == NULL) die("No usable outputs available\n"); + /* TODO: refactor the following code into a nice function. maybe + * use an on_destroy callback which is implement differently for + * different container types (CT_CONTENT vs. CT_DOCKAREA)? */ Con *first_content = output_get_content(first->con); if (output->con != NULL) { @@ -673,6 +676,26 @@ void randr_query_outputs() { con_focus(next); } + /* 3: move the dock clients to the first output */ + Con *child; + TAILQ_FOREACH(child, &(output->con->nodes_head), nodes) { + if (child->type != CT_DOCKAREA) + continue; + DLOG("Handling dock con %p\n", child); + Con *dock; + while (!TAILQ_EMPTY(&(child->nodes_head))) { + dock = TAILQ_FIRST(&(child->nodes_head)); + Con *nc; + Match *match; + nc = con_for_window(first->con, dock->window, &match); + DLOG("Moving dock client %p to nc %p\n", dock, nc); + con_detach(dock); + DLOG("Re-attaching\n"); + con_attach(dock, nc, false); + DLOG("Done\n"); + } + } + DLOG("destroying disappearing con %p\n", output->con); tree_close(output->con, false, true); DLOG("Done. Should be fine now\n"); -- 2.39.5