diff --git a/src/randr.c b/src/randr.c index e57549b7..441a0b43 100644 --- a/src/randr.c +++ b/src/randr.c @@ -365,36 +365,48 @@ 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); + char *target = bind->command + strlen("workspace "); + if (*target == '"') + target++; + FREE(ws->name); + ws->name = strdup(target); + if (ws->name[strlen(ws->name)-1] == '"') + ws->name[strlen(ws->name)-1] = '\0'; + 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); } diff --git a/testcases/t/72-start-on-named-ws.t b/testcases/t/72-start-on-named-ws.t new file mode 100644 index 00000000..12661867 --- /dev/null +++ b/testcases/t/72-start-on-named-ws.t @@ -0,0 +1,65 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# !NO_I3_INSTANCE! will prevent complete-run.pl from starting i3 +# +# checks if i3 starts up on workspace '1' or the first configured named workspace +# +use X11::XCB qw(:all); +use X11::XCB::Connection; +use i3test; + +my $x = X11::XCB::Connection->new; + +############################################################## +# 1: i3 should start with workspace '1' +############################################################## + +my $config = <pid); + +############################################################## +# 2: with named workspaces, i3 should start on the first named one +############################################################## + +$config = <pid); + +############################################################## +# 3: the same test as 2, but with a quoted workspace name +############################################################## + +$config = <pid); + +done_testing;