diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-08-13 15:52:16 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-08-13 15:52:16 -0400 |
commit | 3a3c50135fabc6a23f7b130effef9b642e54bf3c (patch) | |
tree | d22fbf61f38f7c8987df51cf5f23b60e5f95e3b3 /sway/workspace.c | |
parent | 0dc1d87490eaadbe245af7406b0e5ca4d53f17a0 (diff) | |
parent | ffe59b27a956e4430a97d65874ef15c5e9129ee0 (diff) |
Merge pull request #26 from Luminarys/master
Added in proper workspace name generation and command queue
Diffstat (limited to 'sway/workspace.c')
-rw-r--r-- | sway/workspace.c | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/sway/workspace.c b/sway/workspace.c index 53675c03..906d0c5d 100644 --- a/sway/workspace.c +++ b/sway/workspace.c @@ -6,13 +6,56 @@ #include "list.h" #include "log.h" #include "container.h" +#include "config.h" +#include "stringop.h" swayc_t *active_workspace = NULL; -int ws_num = 1; - char *workspace_next_name(void) { + sway_log(L_DEBUG, "Workspace: Generating new name"); + int i; int l = 1; + // Scan all workspace bindings to find the next available workspace name, + // if none are found/available then default to a number + struct sway_mode *mode = config->current_mode; + + for (i = 0; i < mode->bindings->length; ++i) { + struct sway_binding *binding = mode->bindings->items[i]; + const char* command = binding->command; + list_t *args = split_string(command, " "); + + if (strcmp("workspace", args->items[0]) == 0 && args->length > 1) { + sway_log(L_DEBUG, "Got valid workspace command for target: '%s'", args->items[1]); + char* target = malloc(strlen(args->items[1]) + 1); + strcpy(target, args->items[1]); + while (*target == ' ' || *target == '\t') + target++; + + // Make sure that the command references an actual workspace + // not a command about workspaces + if (strcmp(target, "next") == 0 || + strcmp(target, "prev") == 0 || + strcmp(target, "next_on_output") == 0 || + strcmp(target, "prev_on_output") == 0 || + strcmp(target, "number") == 0 || + strcmp(target, "back_and_forth") == 0 || + strcmp(target, "current") == 0) + continue; + + //Make sure that the workspace doesn't already exist + if (workspace_find_by_name(target)) { + continue; + } + + list_free(args); + + sway_log(L_DEBUG, "Workspace: Found free name %s", target); + return target; + } + } + // As a fall back, get the current number of active workspaces + // and return that + 1 for the next workspace's name + int ws_num = root_container.children->length; if (ws_num >= 10) { l = 2; } else if (ws_num >= 100) { |