]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Actually re-attach dock clients when outputs get disabled (Thanks phnom)
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 20 Mar 2011 00:07:21 +0000 (01:07 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 20 Mar 2011 00:07:21 +0000 (01:07 +0100)
Fixes: #348
src/randr.c

index 7033e4c4778dfac039cc0b477efc5d62f3c4ca33..0c702db05ab9dc1868a3405031081e00bede64a5 100644 (file)
@@ -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");