]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: When looking for an unused workspace, try the named workspaces first
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 3 Aug 2011 01:08:59 +0000 (03:08 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 3 Aug 2011 01:08:59 +0000 (03:08 +0200)
Fixes: #449
src/randr.c

index e57549b73d6257b4471a287d10604c36f524a432..e9ba0f072d7f7fcc0ef1b11ebf73f8a573d62af8 100644 (file)
@@ -365,36 +365,43 @@ void init_ws_for_output(Output *output, Con *content) {
     DLOG("Now adding a workspace\n");
 
     /* add a workspace to this output */
+    Con *out, *current;
+    bool exists = true;
     Con *ws = con_new(NULL, NULL);
     ws->type = CT_WORKSPACE;
 
+    /* try the configured workspace bindings first to find a free name */
+    Binding *bind;
+    TAILQ_FOREACH(bind, bindings, bindings) {
+        DLOG("binding with command %s\n", bind->command);
+        if (strlen(bind->command) < strlen("workspace ") ||
+            strncasecmp(bind->command, "workspace", strlen("workspace")) != 0)
+            continue;
+        DLOG("relevant command = %s\n", bind->command);
+        FREE(ws->name);
+        ws->name = strdup(bind->command + strlen("workspace "));
+        DLOG("trying name *%s*\n", ws->name);
+
+        TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
+            GREP_FIRST(current, output_get_content(out), !strcasecmp(child->name, ws->name));
+
+        exists = (current != NULL);
+        if (!exists)
+            break;
+    }
+
     /* get the next unused workspace number */
     DLOG("Getting next unused workspace\n");
     int c = 0;
-    bool exists = true;
     while (exists) {
-        Con *out, *current, *child;
-
         c++;
 
         FREE(ws->name);
         asprintf(&(ws->name), "%d", c);
 
-        exists = false;
-        TAILQ_FOREACH(out, &(croot->nodes_head), nodes) {
-            TAILQ_FOREACH(current, &(out->nodes_head), nodes) {
-                if (current->type != CT_CON)
-                    continue;
-
-                TAILQ_FOREACH(child, &(current->nodes_head), nodes) {
-                    if (strcasecmp(child->name, ws->name) != 0)
-                        continue;
-
-                    exists = true;
-                    break;
-                }
-            }
-        }
+        TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
+            GREP_FIRST(current, output_get_content(out), !strcasecmp(child->name, ws->name));
+        exists = (current != NULL);
 
         DLOG("result for ws %s / %d: exists = %d\n", ws->name, c, exists);
     }