aboutsummaryrefslogtreecommitdiff
path: root/sway/workspace.c
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2015-12-18 18:52:14 -0500
committerDrew DeVault <sir@cmpwn.com>2015-12-18 18:52:51 -0500
commit7647762bab3b625bba6004de761454a2ae4edc5d (patch)
tree3c3f83675c8ca1612c13d147ecb52aaf19381f37 /sway/workspace.c
parent2ab4e5676e1dc0ddd4323a1cce6a3060ccf4f8c0 (diff)
Fix default workspace name generation
This fixes the issue where workspace 10 ends up being the default.
Diffstat (limited to 'sway/workspace.c')
-rw-r--r--sway/workspace.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/sway/workspace.c b/sway/workspace.c
index 761a5f4e..f7523b79 100644
--- a/sway/workspace.c
+++ b/sway/workspace.c
@@ -1,5 +1,7 @@
#include <stdlib.h>
#include <stdbool.h>
+#include <limits.h>
+#include <ctype.h>
#include <wlc/wlc.h>
#include <string.h>
#include <strings.h>
@@ -31,6 +33,8 @@ char *workspace_next_name(void) {
// if none are found/available then default to a number
struct sway_mode *mode = config->current_mode;
+ int order = INT_MAX;
+ char *target = NULL;
for (i = 0; i < mode->bindings->length; ++i) {
struct sway_binding *binding = mode->bindings->items[i];
char *cmdlist = strdup(binding->command);
@@ -45,35 +49,40 @@ char *workspace_next_name(void) {
if (strcmp("workspace", cmd) == 0 && name) {
sway_log(L_DEBUG, "Got valid workspace command for target: '%s'", name);
- char* target = strdup(name);
- while (*target == ' ' || *target == '\t')
- target++;
+ char *_target = strdup(name);
+ while (isspace(*_target))
+ _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)
+ 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)
{
- free(target);
+ free(_target);
continue;
}
// Make sure that the workspace doesn't already exist
- if (workspace_by_name(target)) {
- free(target);
+ if (workspace_by_name(_target)) {
+ free(_target);
continue;
}
- free(dup);
- sway_log(L_DEBUG, "Workspace: Found free name %s", target);
- return target;
+ if (binding->order < order) {
+ order = binding->order;
+ target = _target;
+ sway_log(L_DEBUG, "Workspace: Found free name %s", _target);
+ }
}
free(dup);
}
+ if (target != NULL) {
+ 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;