Note that the workspace will really be named "1: mail". i3 treats workspace
names beginning with a number in a slightly special way. Normally, named
workspaces are ordered the way they appeared. When they start with a number, i3
-will order them numerically.
+will order them numerically. Also, you will be able to use +workspace number 1+
+to switch to the workspace which begins with number 1, regardless of which name
+it has. This is useful in case you are changing the workspace’s name
+dynamically.
[[resizingconfig]]
*/
void cmd_workspace(I3_CMD, char *which);
+/**
+ * Implementation of 'workspace number <number>'
+ *
+ */
+void cmd_workspace_number(I3_CMD, char *which);
+
/**
* Implementation of 'workspace back_and_forth'.
*
# workspace next|prev|next_on_output|prev_on_output
# workspace back_and_forth
# workspace <name>
+# workspace number <number>
state WORKSPACE:
direction = 'next_on_output', 'prev_on_output', 'next', 'prev'
-> call cmd_workspace($direction)
'back_and_forth'
-> call cmd_workspace_back_and_forth()
+ 'number'
+ -> WORKSPACE_NUMBER
workspace = string
-> call cmd_workspace_name($workspace)
+state WORKSPACE_NUMBER:
+ workspace = string
+ -> call cmd_workspace_number($workspace)
+
# focus left|right|up|down
# focus output <output>
# focus tiling|floating|mode_toggle
cmd_output->json_output = sstrdup("{\"success\": true}");
}
+/*
+ * Implementation of 'workspace number <number>'
+ *
+ */
+void cmd_workspace_number(I3_CMD, char *which) {
+ Con *output, *workspace;
+
+ char *endptr = NULL;
+ long parsed_num = strtol(which, &endptr, 10);
+ if (parsed_num == LONG_MIN ||
+ parsed_num == LONG_MAX ||
+ parsed_num < 0 ||
+ *endptr != '\0') {
+ LOG("Could not parse \"%s\" as a number.\n", which);
+ cmd_output->json_output = sstrdup("{\"success\": false, "
+ "\"error\": \"Could not parse number\"}");
+ return;
+ }
+
+ TAILQ_FOREACH(output, &(croot->nodes_head), nodes)
+ GREP_FIRST(workspace, output_get_content(output),
+ child->num == parsed_num);
+
+ if (!workspace) {
+ LOG("There is no workspace with number %d.\n", parsed_num);
+ cmd_output->json_output = sstrdup("{\"success\": false, "
+ "\"error\": \"No such workspace\"}");
+ return;
+ }
+
+ workspace_show(workspace);
+
+ cmd_output->needs_tree_render = true;
+ // XXX: default reply for now, make this a better reply
+ cmd_output->json_output = sstrdup("{\"success\": true}");
+}
+
/*
* Implementation of 'workspace back_and_forth'.
*
ok(defined($ws), "workspace aa: $tmp was created");
is($ws->{num}, -1, 'workspace number is -1');
+################################################################################
+# Check that we can go to workspace "4: foo" with the command
+# "workspace number 4".
+################################################################################
+
+ok(!workspace_exists('4'), 'workspace 4 does not exist');
+ok(!workspace_exists('4: foo'), 'workspace 4: foo does not exist yet');
+cmd 'workspace 4: foo';
+ok(workspace_exists('4: foo'), 'workspace 4: foo was created');
+cmd 'open';
+
+cmd 'workspace 3';
+ok(workspace_exists('4: foo'), 'workspace 4: foo still open');
+cmd 'workspace number 4';
+is(focused_ws(), '4: foo', 'now on workspace 4: foo');
+ok(!workspace_exists('4'), 'workspace 4 still does not exist');
+
done_testing;