diff options
author | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-04-23 13:04:16 +1000 |
---|---|---|
committer | Ryan Dwyer <ryandwyer1@gmail.com> | 2018-04-23 18:54:45 +1000 |
commit | d956286b92a71accb2ac6c895b51502a3eab3bcd (patch) | |
tree | 4f1eb4809d4ebc00d0ae4b734337e6afb4b48081 /sway/commands | |
parent | Merge pull request #1846 from RyanDwyer/fullscreen-xwayland-unmanaged (diff) | |
download | sway-d956286b92a71accb2ac6c895b51502a3eab3bcd.tar.gz sway-d956286b92a71accb2ac6c895b51502a3eab3bcd.tar.zst sway-d956286b92a71accb2ac6c895b51502a3eab3bcd.zip |
Implement rename workspace command
This implements the following commands:
* rename workspace to new_name
* rename workspace old_name to new_name
* rename workspace number n to new_name
Diffstat (limited to 'sway/commands')
-rw-r--r-- | sway/commands/rename.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/sway/commands/rename.c b/sway/commands/rename.c new file mode 100644 index 00000000..4be912a9 --- /dev/null +++ b/sway/commands/rename.c | |||
@@ -0,0 +1,78 @@ | |||
1 | #define _XOPEN_SOURCE 500 | ||
2 | #include <string.h> | ||
3 | #include <strings.h> | ||
4 | #include "log.h" | ||
5 | #include "stringop.h" | ||
6 | #include "sway/commands.h" | ||
7 | #include "sway/config.h" | ||
8 | #include "sway/ipc-server.h" | ||
9 | #include "sway/tree/container.h" | ||
10 | #include "sway/tree/workspace.h" | ||
11 | |||
12 | static const char* expected_syntax = | ||
13 | "Expected 'rename workspace <old_name> to <new_name>' or " | ||
14 | "'rename workspace to <new_name>'"; | ||
15 | |||
16 | struct cmd_results *cmd_rename(int argc, char **argv) { | ||
17 | struct cmd_results *error = NULL; | ||
18 | if ((error = checkarg(argc, "rename", EXPECTED_AT_LEAST, 3))) { | ||
19 | return error; | ||
20 | } | ||
21 | if (strcasecmp(argv[0], "workspace") != 0) { | ||
22 | return cmd_results_new(CMD_INVALID, "rename", expected_syntax); | ||
23 | } | ||
24 | |||
25 | int argn = 1; | ||
26 | struct sway_container *workspace; | ||
27 | |||
28 | if (strcasecmp(argv[1], "to") == 0) { | ||
29 | // 'rename workspace to new_name' | ||
30 | workspace = config->handler_context.current_container; | ||
31 | if (workspace->type != C_WORKSPACE) { | ||
32 | workspace = container_parent(workspace, C_WORKSPACE); | ||
33 | } | ||
34 | } else if (strcasecmp(argv[1], "number") == 0) { | ||
35 | // 'rename workspace number x to new_name' | ||
36 | workspace = workspace_by_number(argv[2]); | ||
37 | while (argn < argc && strcasecmp(argv[argn], "to") != 0) { | ||
38 | ++argn; | ||
39 | } | ||
40 | } else { | ||
41 | // 'rename workspace old_name to new_name' | ||
42 | int end = argn; | ||
43 | while (end < argc && strcasecmp(argv[end], "to") != 0) { | ||
44 | ++end; | ||
45 | } | ||
46 | char *old_name = join_args(argv + argn, end - argn); | ||
47 | workspace = workspace_by_name(old_name); | ||
48 | free(old_name); | ||
49 | argn = end; | ||
50 | } | ||
51 | |||
52 | if (!workspace) { | ||
53 | return cmd_results_new(CMD_INVALID, "rename", | ||
54 | "There is no workspace with that name"); | ||
55 | } | ||
56 | |||
57 | ++argn; // move past "to" | ||
58 | |||
59 | if (argn >= argc) { | ||
60 | return cmd_results_new(CMD_INVALID, "rename", expected_syntax); | ||
61 | } | ||
62 | |||
63 | char *new_name = join_args(argv + argn, argc - argn); | ||
64 | struct sway_container *tmp_workspace = workspace_by_name(new_name); | ||
65 | if (tmp_workspace) { | ||
66 | free(new_name); | ||
67 | return cmd_results_new(CMD_INVALID, "rename", | ||
68 | "Workspace already exists"); | ||
69 | } | ||
70 | |||
71 | wlr_log(L_DEBUG, "renaming workspace '%s' to '%s'", workspace->name, new_name); | ||
72 | free(workspace->name); | ||
73 | workspace->name = new_name; | ||
74 | |||
75 | ipc_event_workspace(NULL, workspace, "rename"); | ||
76 | |||
77 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | ||
78 | } | ||