]> git.sur5r.net Git - i3/i3/commitdiff
look and feel: create split container when switching workspace layout
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 26 Nov 2010 22:08:12 +0000 (23:08 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 26 Nov 2010 22:08:12 +0000 (23:08 +0100)
Quote from the source:
  When the container type is CT_WORKSPACE, the user wants to change the
  whole workspace into stacked/tabbed mode. To do this and still allow
  intuitive operations (like level-up and then opening a new window), we
  need to create a new split container. */

include/con.h
src/cmdparse.y
src/con.c

index bdf0b2a2c675fbec7f7663e908510cac34b5c58b..9194b0e0fb0479c55f3d6497c0ffd9a4cbfb83d1 100644 (file)
@@ -153,4 +153,12 @@ Rect con_border_style_rect(Con *con);
  */
 int con_border_style(Con *con);
 
+/**
+ * This function changes the layout of a given container. Use it to handle
+ * special cases like changing a whole workspace to stacked/tabbed (creates a
+ * new split container before).
+ *
+ */
+void con_set_layout(Con *con, int layout);
+
 #endif
index c2f0222eff1d37f596a24bae6f12b10302597750..931729d8b9ec11b690cb5b35299a71f8a9a9d268 100644 (file)
@@ -574,11 +574,11 @@ layout:
 
         /* check if the match is empty, not if the result is empty */
         if (match_is_empty(&current_match))
-            focused->parent->layout = $<number>3;
+            con_set_layout(focused->parent, $<number>3);
         else {
             TAILQ_FOREACH(current, &owindows, owindows) {
                 printf("matching: %p / %s\n", current->con, current->con->name);
-                current->con->layout = $<number>3;
+                con_set_layout(current->con, $<number>3);
             }
         }
 
index 3d1441f65e07ffe1f1561478e97b7ddfd476e704..2454684e7c439616ee4a1858a09c91e9403cd626 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -544,3 +544,47 @@ int con_border_style(Con *con) {
 
     return con->border_style;
 }
+
+/*
+ * This function changes the layout of a given container. Use it to handle
+ * special cases like changing a whole workspace to stacked/tabbed (creates a
+ * new split container before).
+ *
+ */
+void con_set_layout(Con *con, int layout) {
+    /* When the container type is CT_WORKSPACE, the user wants to change the
+     * whole workspace into stacked/tabbed mode. To do this and still allow
+     * intuitive operations (like level-up and then opening a new window), we
+     * need to create a new split container. */
+    if (con->type == CT_WORKSPACE) {
+        DLOG("Creating new split container\n");
+        /* 1: create a new split container */
+        Con *new = con_new(NULL);
+        new->parent = con;
+
+        /* 2: set the requested layout on the split con */
+        new->layout = layout;
+
+        /* 3: While the layout is irrelevant in stacked/tabbed mode, it needs
+         * to be set. Otherwise, this con will not be interpreted as a split
+         * container. */
+        new->orientation = HORIZ;
+
+        /* 4: move the existing cons of this workspace below the new con */
+        DLOG("Moving cons\n");
+        Con *child;
+        while (!TAILQ_EMPTY(&(con->nodes_head))) {
+            child = TAILQ_FIRST(&(con->nodes_head));
+            con_detach(child);
+            con_attach(child, new);
+        }
+
+        /* 4: attach the new split container to the workspace */
+        DLOG("Attaching new split to ws\n");
+        con_attach(new, con);
+
+        return;
+    }
+
+    con->layout = layout;
+}