aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sway/tree/workspace.h6
-rw-r--r--sway/commands/workspace.c13
-rw-r--r--sway/tree/workspace.c29
3 files changed, 32 insertions, 16 deletions
diff --git a/include/sway/tree/workspace.h b/include/sway/tree/workspace.h
index 7abfbff1..41b59796 100644
--- a/include/sway/tree/workspace.h
+++ b/include/sway/tree/workspace.h
@@ -67,11 +67,13 @@ struct sway_workspace *workspace_by_number(const char* name);
67 67
68struct sway_workspace *workspace_by_name(const char*); 68struct sway_workspace *workspace_by_name(const char*);
69 69
70struct sway_workspace *workspace_output_next(struct sway_workspace *current); 70struct sway_workspace *workspace_output_next(
71 struct sway_workspace *current, bool create);
71 72
72struct sway_workspace *workspace_next(struct sway_workspace *current); 73struct sway_workspace *workspace_next(struct sway_workspace *current);
73 74
74struct sway_workspace *workspace_output_prev(struct sway_workspace *current); 75struct sway_workspace *workspace_output_prev(
76 struct sway_workspace *current, bool create);
75 77
76struct sway_workspace *workspace_prev(struct sway_workspace *current); 78struct sway_workspace *workspace_prev(struct sway_workspace *current);
77 79
diff --git a/sway/commands/workspace.c b/sway/commands/workspace.c
index 65a3f407..5fde8129 100644
--- a/sway/commands/workspace.c
+++ b/sway/commands/workspace.c
@@ -181,7 +181,9 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
181 ++argv; 181 ++argv;
182 } 182 }
183 183
184 184 bool create = argc > 1 && strcasecmp(argv[1], "--create") == 0;
185 struct sway_seat *seat = config->handler_context.seat;
186 struct sway_workspace *current = seat_get_focused_workspace(seat);
185 struct sway_workspace *ws = NULL; 187 struct sway_workspace *ws = NULL;
186 if (strcasecmp(argv[0], "number") == 0) { 188 if (strcasecmp(argv[0], "number") == 0) {
187 if (argc < 2) { 189 if (argc < 2) {
@@ -199,12 +201,13 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
199 } 201 }
200 } else if (strcasecmp(argv[0], "next") == 0 || 202 } else if (strcasecmp(argv[0], "next") == 0 ||
201 strcasecmp(argv[0], "prev") == 0 || 203 strcasecmp(argv[0], "prev") == 0 ||
202 strcasecmp(argv[0], "next_on_output") == 0 ||
203 strcasecmp(argv[0], "prev_on_output") == 0 ||
204 strcasecmp(argv[0], "current") == 0) { 204 strcasecmp(argv[0], "current") == 0) {
205 ws = workspace_by_name(argv[0]); 205 ws = workspace_by_name(argv[0]);
206 } else if (strcasecmp(argv[0], "next_on_output") == 0) {
207 ws = workspace_output_next(current, create);
208 } else if (strcasecmp(argv[0], "prev_on_output") == 0) {
209 ws = workspace_output_prev(current, create);
206 } else if (strcasecmp(argv[0], "back_and_forth") == 0) { 210 } else if (strcasecmp(argv[0], "back_and_forth") == 0) {
207 struct sway_seat *seat = config->handler_context.seat;
208 if (!seat->prev_workspace_name) { 211 if (!seat->prev_workspace_name) {
209 return cmd_results_new(CMD_INVALID, 212 return cmd_results_new(CMD_INVALID,
210 "There is no previous workspace"); 213 "There is no previous workspace");
@@ -220,7 +223,7 @@ struct cmd_results *cmd_workspace(int argc, char **argv) {
220 free(name); 223 free(name);
221 } 224 }
222 workspace_switch(ws, no_auto_back_and_forth); 225 workspace_switch(ws, no_auto_back_and_forth);
223 seat_consider_warp_to_focus(config->handler_context.seat); 226 seat_consider_warp_to_focus(seat);
224 } 227 }
225 return cmd_results_new(CMD_SUCCESS, NULL); 228 return cmd_results_new(CMD_SUCCESS, NULL);
226} 229}
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index cda6caf7..68f1de50 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -230,8 +230,10 @@ static void workspace_name_from_binding(const struct sway_binding * binding,
230 // not a command about workspaces 230 // not a command about workspaces
231 if (strcmp(_target, "next") == 0 || 231 if (strcmp(_target, "next") == 0 ||
232 strcmp(_target, "prev") == 0 || 232 strcmp(_target, "prev") == 0 ||
233 strcmp(_target, "next_on_output") == 0 || 233 strncmp(_target, "next_on_output",
234 strcmp(_target, "prev_on_output") == 0 || 234 strlen("next_on_output")) == 0 ||
235 strncmp(_target, "prev_on_output",
236 strlen("next_on_output")) == 0 ||
235 strcmp(_target, "number") == 0 || 237 strcmp(_target, "number") == 0 ||
236 strcmp(_target, "back_and_forth") == 0 || 238 strcmp(_target, "back_and_forth") == 0 ||
237 strcmp(_target, "current") == 0) { 239 strcmp(_target, "current") == 0) {
@@ -372,11 +374,11 @@ struct sway_workspace *workspace_by_name(const char *name) {
372 if (strcmp(name, "prev") == 0) { 374 if (strcmp(name, "prev") == 0) {
373 return workspace_prev(current); 375 return workspace_prev(current);
374 } else if (strcmp(name, "prev_on_output") == 0) { 376 } else if (strcmp(name, "prev_on_output") == 0) {
375 return workspace_output_prev(current); 377 return workspace_output_prev(current, false);
376 } else if (strcmp(name, "next") == 0) { 378 } else if (strcmp(name, "next") == 0) {
377 return workspace_next(current); 379 return workspace_next(current);
378 } else if (strcmp(name, "next_on_output") == 0) { 380 } else if (strcmp(name, "next_on_output") == 0) {
379 return workspace_output_next(current); 381 return workspace_output_next(current, false);
380 } else if (strcmp(name, "current") == 0) { 382 } else if (strcmp(name, "current") == 0) {
381 return current; 383 return current;
382 } else if (strcasecmp(name, "back_and_forth") == 0) { 384 } else if (strcasecmp(name, "back_and_forth") == 0) {
@@ -397,11 +399,18 @@ struct sway_workspace *workspace_by_name(const char *name) {
397 * otherwise the next one is returned. 399 * otherwise the next one is returned.
398 */ 400 */
399static struct sway_workspace *workspace_output_prev_next_impl( 401static struct sway_workspace *workspace_output_prev_next_impl(
400 struct sway_output *output, int dir) { 402 struct sway_output *output, int dir, bool create) {
401 struct sway_seat *seat = input_manager_current_seat(); 403 struct sway_seat *seat = input_manager_current_seat();
402 struct sway_workspace *workspace = seat_get_focused_workspace(seat); 404 struct sway_workspace *workspace = seat_get_focused_workspace(seat);
403 405
404 int index = list_find(output->workspaces, workspace); 406 int index = list_find(output->workspaces, workspace);
407 if (!workspace_is_empty(workspace) && create &&
408 (index + dir < 0 || index + dir == output->workspaces->length)) {
409 struct sway_output *output = workspace->output;
410 char *next = workspace_next_name(output->wlr_output->name);
411 workspace_create(output, next);
412 free(next);
413 }
405 size_t new_index = wrap(index + dir, output->workspaces->length); 414 size_t new_index = wrap(index + dir, output->workspaces->length);
406 return output->workspaces->items[new_index]; 415 return output->workspaces->items[new_index];
407} 416}
@@ -432,16 +441,18 @@ static struct sway_workspace *workspace_prev_next_impl(
432 } 441 }
433} 442}
434 443
435struct sway_workspace *workspace_output_next(struct sway_workspace *current) { 444struct sway_workspace *workspace_output_next(
436 return workspace_output_prev_next_impl(current->output, 1); 445 struct sway_workspace *current, bool create) {
446 return workspace_output_prev_next_impl(current->output, 1, create);
437} 447}
438 448
439struct sway_workspace *workspace_next(struct sway_workspace *current) { 449struct sway_workspace *workspace_next(struct sway_workspace *current) {
440 return workspace_prev_next_impl(current, 1); 450 return workspace_prev_next_impl(current, 1);
441} 451}
442 452
443struct sway_workspace *workspace_output_prev(struct sway_workspace *current) { 453struct sway_workspace *workspace_output_prev(
444 return workspace_output_prev_next_impl(current->output, -1); 454 struct sway_workspace *current, bool create) {
455 return workspace_output_prev_next_impl(current->output, -1, create);
445} 456}
446 457
447struct sway_workspace *workspace_prev(struct sway_workspace *current) { 458struct sway_workspace *workspace_prev(struct sway_workspace *current) {