diff options
author | progandy <code@progandy> | 2015-12-18 01:01:02 +0100 |
---|---|---|
committer | progandy <code@progandy> | 2015-12-18 01:22:07 +0100 |
commit | 76c520a04b09490591c8ca7f854592f2a7a50042 (patch) | |
tree | 32c96595026c36cbb88a7c57544396b74c9128f0 | |
parent | 8f1ac1ef2c77665e7c17eaa6a46ea1b6d68e5c22 (diff) | |
download | sway-76c520a04b09490591c8ca7f854592f2a7a50042.tar.xz |
sway: insert numbered workspaces in order
fixes #308
Ordered by number ascending, with insert before same numbers.
Workspaces without numbers are appended at the end of the list.
Example order:
1 2:named 3:the_second 3:the_first 9 FIRST_NAME SECOND_NAME ...
-rw-r--r-- | include/layout.h | 4 | ||||
-rw-r--r-- | sway/container.c | 20 |
2 files changed, 23 insertions, 1 deletions
diff --git a/include/layout.h b/include/layout.h index 62e4c202..b7731031 100644 --- a/include/layout.h +++ b/include/layout.h @@ -24,6 +24,10 @@ int index_child(const swayc_t *child); // parent must be of type C_WORKSPACE or C_CONTAINER void add_child(swayc_t *parent, swayc_t *child); +// Adds child to parent at index, if parent has no focus, it is set to child +// parent must be of type C_WORKSPACE or C_CONTAINER +void insert_child(swayc_t *parent, swayc_t *child, int index); + // Adds child as floating window to ws, if there is no focus it is set to child. // ws must be of type C_WORKSPACE void add_floating(swayc_t *ws, swayc_t *child); diff --git a/sway/container.c b/sway/container.c index 8165bbad..36056ff7 100644 --- a/sway/container.c +++ b/sway/container.c @@ -1,3 +1,4 @@ +#include <ctype.h> #include <stdlib.h> #include <stdbool.h> #include <strings.h> @@ -168,7 +169,24 @@ swayc_t *new_workspace(swayc_t *output, const char *name) { workspace->visible = false; workspace->floating = create_list(); - add_child(output, workspace); + if (isdigit(workspace->name[0])) { + // find position for numbered workspace + // order: ascending numbers, insert before same number + // numbers before unnumbered + int num = strtol(workspace->name, NULL, 10); + int i; + for (i = 0; i < output->children->length; ++i) { + char *name = ((swayc_t *)output->children->items[i])->name; + if (!isdigit(name[0]) || num <= strtol(name, NULL, 10)) { + break; + } + } + insert_child(output, workspace, i); + + } else { + // append new unnumbered to the end + add_child(output, workspace); + } return workspace; } |