aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway/commands.c7
-rw-r--r--sway/workspace.c21
2 files changed, 15 insertions, 13 deletions
diff --git a/sway/commands.c b/sway/commands.c
index 177c54ab..6e74a442 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -822,11 +822,8 @@ static bool cmd_workspace(struct sway_config *config, int argc, char **argv) {
}
if (strcasecmp(argv[0], "back_and_forth") == 0) {
if (prev_workspace_name) {
- if (workspace_by_name(prev_workspace_name)) {
- workspace_switch(workspace_by_name(prev_workspace_name));
- } else {
- workspace_switch(workspace_create(prev_workspace_name));
- }
+ swayc_t *ws = workspace_by_name(prev_workspace_name);
+ workspace_switch(ws ? ws : workspace_create(prev_workspace_name));
}
return true;
}
diff --git a/sway/workspace.c b/sway/workspace.c
index 866276d8..7eb422c4 100644
--- a/sway/workspace.c
+++ b/sway/workspace.c
@@ -13,7 +13,7 @@
#include "focus.h"
#include "util.h"
-char *prev_workspace_name = "";
+char *prev_workspace_name = NULL;
char *workspace_next_name(void) {
sway_log(L_DEBUG, "Workspace: Generating new name");
@@ -182,13 +182,18 @@ void workspace_switch(swayc_t *workspace) {
if (!workspace) {
return;
}
- if (strcmp(prev_workspace_name, swayc_active_workspace()->name) != 0 && swayc_active_workspace() != workspace) {
- prev_workspace_name = malloc(strlen(swayc_active_workspace()->name) + 1);
- strcpy(prev_workspace_name, swayc_active_workspace()->name);
- } else if (config->auto_back_and_forth && swayc_active_workspace() == workspace && strlen(prev_workspace_name) != 0) {
- workspace = workspace_by_name(prev_workspace_name) ? workspace_by_name(prev_workspace_name) : workspace_create(prev_workspace_name);
- prev_workspace_name = malloc(strlen(swayc_active_workspace()->name) + 1);
- strcpy(prev_workspace_name, swayc_active_workspace()->name);
+ swayc_t *active_ws = swayc_active_workspace();
+ if (config->auto_back_and_forth && active_ws == workspace && prev_workspace_name) {
+ swayc_t *new_ws = workspace_by_name(prev_workspace_name);
+ workspace = new_ws ? new_ws : workspace_create(prev_workspace_name);
+ }
+
+ if (!prev_workspace_name
+ || (strcmp(prev_workspace_name, active_ws->name)
+ && active_ws != workspace)) {
+ free(prev_workspace_name);
+ prev_workspace_name = malloc(strlen(active_ws->name)+1);
+ strcpy(prev_workspace_name, active_ws->name);
}
sway_log(L_DEBUG, "Switching to workspace %p:%s", workspace, workspace->name);