]> git.sur5r.net Git - i3/i3/commitdiff
Added config key for default orientation of containers (new_container_orientation...
authorSimon Kampe <simon.kampe@gmail.com>
Wed, 16 Mar 2011 10:56:51 +0000 (11:56 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 17 Mar 2011 16:43:35 +0000 (17:43 +0100)
i3.config
include/config.h
src/cfgparse.l
src/cfgparse.y
src/con.c
src/config.c
src/randr.c
src/workspace.c

index 71511a50bcb3133da117ae75304ef1c946a471ac..b4c584faefbde168011f6196dcb8b627e73a6344 100644 (file)
--- a/i3.config
+++ b/i3.config
@@ -19,7 +19,13 @@ bindsym Mod1+Return exec /usr/bin/urxvt
 # Start dmenu (Mod1+p)
 bindsym Mod1+p exec /usr/bin/dmenu_run
 
+# Default orientation
+new_container_orientation horizontal
+
+# Horizontal orientation
 bindsym Mod1+h split h
+
+# Vertical orientation
 bindsym Mod1+v split v
 
 # Fullscreen (Mod1+f)
index 32212e3d3cce573eee6e6804af499bbfbd0af953..f639df36f0ee39d17eb5ce6a500b7a0dbc316c60 100644 (file)
@@ -95,6 +95,9 @@ struct Config {
         int container_stack_limit;
         int container_stack_limit_value;
 
+        /** Default orientation for new containers */
+        int default_orientation;
+
         /** By default, focus follows mouse. If the user explicitly wants to
          * turn this off (and instead rely only on the keyboard for changing
          * focus), we allow him to do this with this relatively special option.
index b8b1d73d5e7054ba28ce9c69f7cdc6b7b2ddb7ea..4776527b18df145fb98f679677f3216f9834e120 100644 (file)
@@ -92,6 +92,10 @@ set[^\n]*                       { return TOKCOMMENT; }
 ipc-socket                      { BEGIN(BIND_AWS_COND); return TOKIPCSOCKET; }
 ipc_socket                      { BEGIN(BIND_AWS_COND); return TOKIPCSOCKET; }
 restart_state                   { BEGIN(BIND_AWS_COND); return TOKRESTARTSTATE; }
+new_container_orientation       { return TOK_ORIENTATION; }
+horizontal                      { return TOK_HORIZ; }
+vertical                        { return TOK_VERT; }
+auto                            { return TOK_AUTO; }
 new_container                   { return TOKNEWCONTAINER; }
 new_window                      { return TOKNEWWINDOW; }
 normal                          { return TOK_NORMAL; }
index 5ee6dfd4fb0226496b0db01ea6178ead830abcb3..50058680f2924a45a571eab57b8b21462c9f71c7 100644 (file)
@@ -224,6 +224,10 @@ void parse_file(const char *f) {
 %token TOKCOLOR
 %token TOKARROW "→"
 %token TOKMODE "mode"
+%token TOK_ORIENTATION "new_container_orientation"
+%token TOK_HORIZ "horizontal"
+%token TOK_VERT "vertical"
+%token TOK_AUTO "auto"
 %token TOKNEWCONTAINER "new_container"
 %token TOKNEWWINDOW "new_window"
 %token TOK_NORMAL "normal"
@@ -249,6 +253,7 @@ line:
         bindline
         | mode
         | floating_modifier
+        | orientation
         | new_container
         | new_window
         | focus_follows_mouse
@@ -373,6 +378,20 @@ floating_modifier:
         }
         ;
 
+orientation:
+        TOK_ORIENTATION WHITESPACE direction
+        {
+                DLOG("New containers should start with split direction %d\n", $<number>3);
+                config.default_orientation = $<number>3;
+        }
+        ;
+
+direction:
+        TOK_HORIZ       { $<number>$ = HORIZ; }
+        | TOK_VERT      { $<number>$ = VERT; }
+        | TOK_AUTO      { $<number>$ = NO_ORIENTATION; }
+        ;
+
 new_container:
         TOKNEWCONTAINER WHITESPACE TOKCONTAINERMODE
         {
index 04db250ba11444b71d257ba66d7c7b17b89c49cc..e1359069f6df3102ce676fa1d15ec983fa935fd5 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -794,7 +794,11 @@ void con_set_layout(Con *con, int 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;
+        if (config.default_orientation == NO_ORIENTATION) {
+            new->orientation = (con->rect.height > con->rect.width) ? VERT : HORIZ;
+        } else {
+            new->orientation = config.default_orientation;
+        }
 
         Con *old_focused = TAILQ_FIRST(&(con->focus_head));
         if (old_focused == TAILQ_END(&(con->focus_head)))
index 80071d212f1cfea9fe125810bbb128bf6c736165..8f8790eba554ab00291ee22e18a2975869f51c81 100644 (file)
@@ -331,6 +331,8 @@ void load_configuration(xcb_connection_t *conn, const char *override_configpath,
         INIT_COLOR(config.bar.urgent, "#2f343a", "#900000", "#ffffff");
 
         config.default_border = BS_NORMAL;
+        /* Set default_orientation to NO_ORIENTATION for auto orientation. */
+        config.default_orientation = NO_ORIENTATION;
 
         parse_configuration(override_configpath);
 
index acac36cab04c85feca9bf2bda0bbb1ec05cce825..14b9085dcf1fe5405c5aff3ec2d75ea9c2e10cc2 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,30 @@ 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 *current,*workspace,*child;
+
+    /* Point current to the container of the workspaces */
+    current = output->con->nodes_head.tqh_first->nodes.tqe_next;
+
+    /* 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, &(current->nodes_head), nodes) {
+
+            /* Check if this workspace has <= 1 childs. */
+            child = workspace->nodes_head.tqh_first;
+            if (child != NULL)
+                if (child->nodes.tqe_next == NULL) {
+                    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);
+                    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),
index 77b5ceb2eca52b91276ecd13d3d0ce7214ef9f42..4e93b92e08079613bdbdc17fd487f22217e2e2cd 100644 (file)
@@ -59,7 +59,18 @@ Con *workspace_get(const char *num, bool *created) {
             workspace->num = -1;
         else workspace->num = parsed_num;
         LOG("num = %d\n", workspace->num);
-        workspace->orientation = HORIZ;
+
+        /* If default_orientation is set to NO_ORIENTATION we
+         * determine workspace orientation from workspace size.
+         * Otherwise we just set the orientation to default_orientation. */
+        if (config.default_orientation == NO_ORIENTATION) {
+            workspace->orientation = (output->rect.height > output->rect.width) ? VERT : HORIZ;
+            DLOG("Auto orientation. Output resolution set to (%d,%d), setting orientation to %d.\n",
+                 workspace->rect.width, workspace->rect.height, workspace->orientation);
+        } else {
+            workspace->orientation = config.default_orientation;
+        }
+
         con_attach(workspace, content, false);
 
         ipc_send_event("workspace", I3_IPC_EVENT_WORKSPACE, "{\"change\":\"init\"}");