diff options
Diffstat (limited to 'sway/tree/workspace.c')
-rw-r--r-- | sway/tree/workspace.c | 29 |
1 files changed, 20 insertions, 9 deletions
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 | */ |
399 | static struct sway_workspace *workspace_output_prev_next_impl( | 401 | static 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 | ||
435 | struct sway_workspace *workspace_output_next(struct sway_workspace *current) { | 444 | struct 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 | ||
439 | struct sway_workspace *workspace_next(struct sway_workspace *current) { | 449 | struct 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 | ||
443 | struct sway_workspace *workspace_output_prev(struct sway_workspace *current) { | 453 | struct 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 | ||
447 | struct sway_workspace *workspace_prev(struct sway_workspace *current) { | 458 | struct sway_workspace *workspace_prev(struct sway_workspace *current) { |