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);