]> git.sur5r.net Git - i3/i3/blobdiff - src/randr.c
Rename new_container to workspace_layout
[i3/i3] / src / randr.c
index acac36cab04c85feca9bf2bda0bbb1ec05cce825..0c702db05ab9dc1868a3405031081e00bede64a5 100644 (file)
@@ -361,7 +361,17 @@ void output_init_con(Output *output) {
     free(name);
 
     ws->fullscreen_mode = CF_OUTPUT;
-    ws->orientation = HORIZ;
+
+    /* If default_orientation is set to NO_ORIENTATION we determine
+     * orientation depending on output resolution. */
+    if (config.default_orientation == NO_ORIENTATION) {
+        ws->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
+        DLOG("Auto orientation. Workspace size set to (%d,%d), setting orientation to %d.\n",
+             output->rect.width, output->rect.height, ws->orientation);
+    } else {
+        ws->orientation = config.default_orientation;
+    }
+
 
     /* TODO: Set focus in main.c */
     con_focus(ws);
@@ -384,6 +394,31 @@ static void output_change_mode(xcb_connection_t *conn, Output *output) {
     DLOG("Output mode changed, updating rect\n");
     assert(output->con != NULL);
     output->con->rect = output->rect;
+
+    Con *content, *workspace, *child;
+
+    /* Point content to the container of the workspaces */
+    content = output_get_content(output->con);
+
+    /* If default_orientation is NO_ORIENTATION, we change the orientation of
+     * the workspaces and their childs depending on output resolution. This is
+     * only done for workspaces with maximum one child. */
+    if (config.default_orientation == NO_ORIENTATION) {
+        TAILQ_FOREACH(workspace, &(content->nodes_head), nodes) {
+            /* Workspaces with more than one child are left untouched because
+             * we do not want to change an existing layout. */
+            if (con_num_children(workspace) > 1)
+                continue;
+
+            workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
+            DLOG("Setting workspace [%d,%s]'s orientation to %d.\n", workspace->num, workspace->name, workspace->orientation);
+            if ((child = TAILQ_FIRST(&(workspace->nodes_head)))) {
+                child->orientation = workspace->orientation;
+                DLOG("Setting child [%d,%s]'s orientation to %d.\n", child->num, child->name, child->orientation);
+            }
+        }
+    }
+
 #if 0
     Rect bar_rect = {output->rect.x,
                      output->rect.y + output->rect.height - (font->height + 6),
@@ -608,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) {
@@ -638,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");