Implement 'workspace number <number>' to switch to named workspaces
This commit is contained in:
parent
42bbdbdfc1
commit
72078c704e
|
@ -1351,7 +1351,10 @@ bindsym mod+2 workspace 2: www
|
||||||
Note that the workspace will really be named "1: mail". i3 treats workspace
|
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
|
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
|
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]]
|
[[resizingconfig]]
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,12 @@ void cmd_append_layout(I3_CMD, char *path);
|
||||||
*/
|
*/
|
||||||
void cmd_workspace(I3_CMD, char *which);
|
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'.
|
* Implementation of 'workspace back_and_forth'.
|
||||||
*
|
*
|
||||||
|
|
|
@ -77,14 +77,21 @@ state APPEND_LAYOUT:
|
||||||
# workspace next|prev|next_on_output|prev_on_output
|
# workspace next|prev|next_on_output|prev_on_output
|
||||||
# workspace back_and_forth
|
# workspace back_and_forth
|
||||||
# workspace <name>
|
# workspace <name>
|
||||||
|
# workspace number <number>
|
||||||
state WORKSPACE:
|
state WORKSPACE:
|
||||||
direction = 'next_on_output', 'prev_on_output', 'next', 'prev'
|
direction = 'next_on_output', 'prev_on_output', 'next', 'prev'
|
||||||
-> call cmd_workspace($direction)
|
-> call cmd_workspace($direction)
|
||||||
'back_and_forth'
|
'back_and_forth'
|
||||||
-> call cmd_workspace_back_and_forth()
|
-> call cmd_workspace_back_and_forth()
|
||||||
|
'number'
|
||||||
|
-> WORKSPACE_NUMBER
|
||||||
workspace = string
|
workspace = string
|
||||||
-> call cmd_workspace_name($workspace)
|
-> call cmd_workspace_name($workspace)
|
||||||
|
|
||||||
|
state WORKSPACE_NUMBER:
|
||||||
|
workspace = string
|
||||||
|
-> call cmd_workspace_number($workspace)
|
||||||
|
|
||||||
# focus left|right|up|down
|
# focus left|right|up|down
|
||||||
# focus output <output>
|
# focus output <output>
|
||||||
# focus tiling|floating|mode_toggle
|
# focus tiling|floating|mode_toggle
|
||||||
|
|
|
@ -676,6 +676,43 @@ void cmd_workspace(I3_CMD, char *which) {
|
||||||
cmd_output->json_output = sstrdup("{\"success\": true}");
|
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'.
|
* Implementation of 'workspace back_and_forth'.
|
||||||
*
|
*
|
||||||
|
|
|
@ -117,4 +117,21 @@ $ws = get_ws("aa: $tmp");
|
||||||
ok(defined($ws), "workspace aa: $tmp was created");
|
ok(defined($ws), "workspace aa: $tmp was created");
|
||||||
is($ws->{num}, -1, 'workspace number is -1');
|
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;
|
done_testing;
|
||||||
|
|
Loading…
Reference in New Issue