Workspace command number selection
Patch status: merged
Patch by Tony Crisci
Long description:
If a `workspace {N}` or `move to workspace {N}` command is given with N as a plain number, the workspace of this number is selected for the context of the command if one exists and there is no workspace with a name that exactly matches N.
To apply this patch, use:
curl http://cr.i3wm.org/patch/602/raw.patch | git am
b/src/commands.c
19 |
@@ -513,7 +513,27 @@ void cmd_move_con_to_workspace_name(I3_CMD, char *name) { |
20 |
|
21 |
LOG("should move window to workspace %s\n", name); |
22 |
/* get the workspace */ |
23 |
- Con *ws = workspace_get(name, NULL); |
24 |
+ Con *ws = NULL; |
25 |
+ Con *output = NULL; |
26 |
+ |
27 |
+ /* first look for a workspace with this name */ |
28 |
+ TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { |
29 |
+ GREP_FIRST(ws, output_get_content(output), !strcasecmp(child->name, name)); |
30 |
+ } |
31 |
+ |
32 |
+ /* if the name is plain digits, we interpret this as a "workspace number" |
33 |
+ * command */ |
34 |
+ if (!ws && name_is_digits(name)) { |
35 |
+ long parsed_num = ws_name_to_number(name); |
36 |
+ TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { |
37 |
+ GREP_FIRST(ws, output_get_content(output), |
38 |
+ child->num == parsed_num); |
39 |
+ } |
40 |
+ } |
41 |
+ |
42 |
+ /* if no workspace was found, make a new one */ |
43 |
+ if (!ws) |
44 |
+ ws = workspace_get(name, NULL); |
45 |
|
46 |
ws = maybe_auto_back_and_forth_workspace(ws); |
47 |
|
48 |
@@ -1013,7 +1033,30 @@ void cmd_workspace_name(I3_CMD, char *name) { |
49 |
DLOG("should switch to workspace %s\n", name); |
50 |
if (maybe_back_and_forth(cmd_output, name)) |
51 |
return; |
52 |
- workspace_show_by_name(name); |
53 |
+ |
54 |
+ Con *ws = NULL; |
55 |
+ Con *output = NULL; |
56 |
+ |
57 |
+ /* first look for a workspace with this name */ |
58 |
+ TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { |
59 |
+ GREP_FIRST(ws, output_get_content(output), !strcasecmp(child->name, name)); |
60 |
+ } |
61 |
+ |
62 |
+ /* if the name is only digits, we interpret this as a "workspace number" |
63 |
+ * command */ |
64 |
+ if (!ws && name_is_digits(name)) { |
65 |
+ long parsed_num = ws_name_to_number(name); |
66 |
+ TAILQ_FOREACH(output, &(croot->nodes_head), nodes) { |
67 |
+ GREP_FIRST(ws, output_get_content(output), |
68 |
+ child->num == parsed_num); |
69 |
+ } |
70 |
+ } |
71 |
+ |
72 |
+ /* if no workspace was found, make a new one */ |
73 |
+ if (!ws) |
74 |
+ ws = workspace_get(name, NULL); |
75 |
+ |
76 |
+ workspace_show(ws); |
77 |
|
78 |
cmd_output->needs_tree_render = true; |
79 |
// XXX: default reply for now, make this a better reply |
b/testcases/t/232-cmd-workspace-number-selection.t
85 |
@@ -0,0 +1,52 @@ |
86 |
+#!perl |
87 |
+# vim:ts=4:sw=4:expandtab |
88 |
+# |
89 |
+# Please read the following documents before working on tests: |
90 |
+# • http://build.i3wm.org/docs/testsuite.html |
91 |
+# (or docs/testsuite) |
92 |
+# |
93 |
+# • http://build.i3wm.org/docs/lib-i3test.html |
94 |
+# (alternatively: perldoc ./testcases/lib/i3test.pm) |
95 |
+# |
96 |
+# • http://build.i3wm.org/docs/ipc.html |
97 |
+# (or docs/ipc) |
98 |
+# |
99 |
+# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf |
100 |
+# (unless you are already familiar with Perl) |
101 |
+# |
102 |
+# Test that `workspace {N}` acts like `workspace number {N}` when N is a plain |
103 |
+# digit, and likewise for `move to workspace {N}`. |
104 |
+# Ticket: #1238 |
105 |
+# Bug still in: 4.8-16-g3f5a0f0 |
106 |
+use i3test; |
107 |
+ |
108 |
+cmd 'workspace 5:foo'; |
109 |
+open_window; |
110 |
+fresh_workspace; |
111 |
+cmd 'workspace 5'; |
112 |
+ |
113 |
+is(focused_ws, '5:foo', |
114 |
+ 'a command to switch to a workspace with a bare number should switch to a workspace of that number'); |
115 |
+ |
116 |
+fresh_workspace; |
117 |
+my $win = open_window; |
118 |
+cmd '[id="' . $win->{id} . '"] move to workspace 5'; |
119 |
+ |
120 |
+is(@{get_ws('5:foo')->{nodes}}, 2, |
121 |
+ 'a command to move a container to a workspace with a bare number should move that container to a workspace of that number'); |
122 |
+ |
123 |
+fresh_workspace; |
124 |
+cmd 'workspace 7'; |
125 |
+open_window; |
126 |
+cmd 'workspace 7:foo'; |
127 |
+$win = open_window; |
128 |
+ |
129 |
+cmd 'workspace 7'; |
130 |
+is(focused_ws, '7', |
131 |
+ 'a workspace with a name that is a matching plain number should be preferred when switching'); |
132 |
+ |
133 |
+cmd '[id="' . $win->{id} . '"] move to workspace 7'; |
134 |
+is(@{get_ws('7')->{nodes}}, 2, |
135 |
+ 'a workspace with a name that is a matching plain number should be preferred when moving'); |
136 |
+ |
137 |
+done_testing; |