return output;
}
+/*
+ * Checks whether we switched to a new workspace and returns false in that case,
+ * signaling that further workspace switching should be done by the calling function
+ * If not, calls workspace_back_and_forth() if workspace_auto_back_and_forth is set
+ * and return true, signaling that no further workspace switching should occur in the calling function.
+ *
+ */
+static bool maybe_back_and_forth(struct CommandResult *cmd_output, char *name) {
+ Con *ws = con_get_workspace(focused);
+
+ /* If we switched to a different workspace, do nothing */
+ if (strcmp(ws->name, name) != 0)
+ return false;
+
+ DLOG("This workspace is already focused.\n");
+ if (config.workspace_auto_back_and_forth) {
+ workspace_back_and_forth();
+ cmd_output->needs_tree_render = true;
+ }
+ return true;
+}
+
// This code is commented out because we might recycle it for popping up error
// messages on parser errors.
#if 0
child->num == parsed_num);
if (!workspace) {
- LOG("There is no workspace with number %d.\n", parsed_num);
- y(map_open);
- ystr("success");
- y(bool, false);
- ystr("error");
- ystr("No such workspace");
- y(map_close);
+ LOG("There is no workspace with number %d, creating a new one.\n", parsed_num);
+ ysuccess(true);
+ /* terminate the which string after the endposition of the number */
+ *endptr = '\0';
+ if (maybe_back_and_forth(cmd_output, which))
+ return;
+ workspace_show_by_name(which);
+ cmd_output->needs_tree_render = true;
return;
}
-
+ if (maybe_back_and_forth(cmd_output, which))
+ return;
workspace_show(workspace);
cmd_output->needs_tree_render = true;
}
DLOG("should switch to workspace %s\n", name);
-
- Con *ws = con_get_workspace(focused);
-
- /* Check if the command wants to switch to the current workspace */
- if (strcmp(ws->name, name) == 0) {
- DLOG("This workspace is already focused.\n");
- if (config.workspace_auto_back_and_forth) {
- workspace_back_and_forth();
- tree_render();
- }
- ysuccess(false);
- return;
- }
-
+ if (maybe_back_and_forth(cmd_output, name))
+ return;
workspace_show_by_name(name);
cmd_output->needs_tree_render = true;
is(focused_ws(), '4: foo', 'now on workspace 4: foo');
ok(!workspace_exists('4'), 'workspace 4 still does not exist');
+################################################################################
+# Check that we "workspace number 5" will create workspace 5 if it does not yet
+# exist.
+################################################################################
+
+ok(!workspace_exists('5'), 'workspace 5 does not exist');
+cmd 'workspace number 5';
+ok(workspace_exists('5'), 'workspace 5 was created');
+
################################################################################
# Verify that renaming workspaces works.
################################################################################
cmd qq|workspace "$third_ws"|;
ok(get_ws($second_ws)->{focused}, 'second workspace focused');
+################################################################################
+# Now see if "workspace number <number>" also works as expected with
+# workspace_auto_back_and_forth enabled.
+################################################################################
+
+cmd 'workspace number 5';
+ok(get_ws('5')->{focused}, 'workspace 5 focused');
+
+cmd 'workspace number 6';
+ok(get_ws('6')->{focused}, 'workspace 6 focused');
+
+cmd 'workspace number 6';
+ok(get_ws('5')->{focused}, 'workspace 5 focused again');
+
exit_gracefully($pid);
done_testing;