diff --git a/include/workspace.h b/include/workspace.h index a731068d..7343b055 100644 --- a/include/workspace.h +++ b/include/workspace.h @@ -5,6 +5,8 @@ #include "list.h" #include "layout.h" +extern char *prev_workspace_name; + char *workspace_next_name(void); swayc_t *workspace_create(const char*); swayc_t *workspace_by_name(const char*); diff --git a/sway/commands.c b/sway/commands.c index 9a90fe5f..1825be4f 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -800,26 +800,36 @@ static bool cmd_workspace(struct sway_config *config, int argc, char **argv) { if (argc == 1) { // Handle workspace next/prev - if (strcmp(argv[0], "next") == 0) { + if (strcasecmp(argv[0], "next") == 0) { workspace_switch(workspace_next()); return true; } - if (strcmp(argv[0], "prev") == 0) { + if (strcasecmp(argv[0], "prev") == 0) { workspace_switch(workspace_prev()); return true; } // Handle workspace output_next/prev - if (strcmp(argv[0], "next_on_output") == 0) { + if (strcasecmp(argv[0], "next_on_output") == 0) { workspace_switch(workspace_output_next()); return true; } - if (strcmp(argv[0], "prev_on_output") == 0) { + if (strcasecmp(argv[0], "prev_on_output") == 0) { workspace_switch(workspace_output_prev()); return true; } + 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)); + } + } + return true; + } swayc_t *workspace = workspace_by_name(argv[0]); if (!workspace) { diff --git a/sway/workspace.c b/sway/workspace.c index 252526ce..0f36e35a 100644 --- a/sway/workspace.c +++ b/sway/workspace.c @@ -13,6 +13,8 @@ #include "focus.h" #include "util.h" +char *prev_workspace_name; + char *workspace_next_name(void) { sway_log(L_DEBUG, "Workspace: Generating new name"); int i; @@ -180,6 +182,11 @@ void workspace_switch(swayc_t *workspace) { if (!workspace) { return; } + if (!prev_workspace_name || strcmp(prev_workspace_name, swayc_active_workspace()->name) != 0) { + prev_workspace_name = malloc(strlen(swayc_active_workspace()->name) + 1); + strcpy(prev_workspace_name, swayc_active_workspace()->name); + } + sway_log(L_DEBUG, "Switching to workspace %p:%s", workspace, workspace->name); set_focused_container(get_focused_view(workspace)); arrange_windows(workspace, -1, -1);