]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Use the appropriate number when assigning numbered workspaces in randr.c
authorMichael Stapelberg <michael@stapelberg.de>
Wed, 3 Aug 2011 22:10:23 +0000 (00:10 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 3 Aug 2011 22:10:23 +0000 (00:10 +0200)
src/randr.c

index 505eb49bcf3ed9509f830f2ff29f9827fc6ad45b..e48e2065d8e0cb14696de89f9db964a77f677ea7 100644 (file)
@@ -392,27 +392,40 @@ void init_ws_for_output(Output *output, Con *content) {
             GREP_FIRST(current, output_get_content(out), !strcasecmp(child->name, ws->name));
 
         exists = (current != NULL);
-        if (!exists)
+        if (!exists) {
+            /* Set ->num to the number of the workspace, if the name actually
+             * is a number or starts with a number */
+            long parsed_num = strtol(ws->name, NULL, 10);
+            if (parsed_num == LONG_MIN ||
+                parsed_num == LONG_MAX ||
+                parsed_num <= 0)
+                ws->num = -1;
+            else ws->num = parsed_num;
+            LOG("Used number %d for workspace with name %s\n", ws->num, ws->name);
+
             break;
+        }
     }
 
-    /* get the next unused workspace number */
-    DLOG("Getting next unused workspace\n");
-    int c = 0;
-    while (exists) {
-        c++;
+    if (exists) {
+        /* get the next unused workspace number */
+        DLOG("Getting next unused workspace by number\n");
+        int c = 0;
+        while (exists) {
+            c++;
 
-        FREE(ws->name);
-        asprintf(&(ws->name), "%d", c);
+            FREE(ws->name);
+            asprintf(&(ws->name), "%d", c);
 
-        current = NULL;
-        TAILQ_FOREACH(out, &(croot->nodes_head), nodes)
-            GREP_FIRST(current, output_get_content(out), !strcasecmp(child->name, ws->name));
-        exists = (current != NULL);
+            current = NULL;
+            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);
+            DLOG("result for ws %s / %d: exists = %d\n", ws->name, c, exists);
+        }
+        ws->num = c;
     }
-    ws->num = c;
     con_attach(ws, content, false);
 
     asprintf(&name, "[i3 con] workspace %s", ws->name);