aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/workspace.c
diff options
context:
space:
mode:
authorLibravatar Drew DeVault <sir@cmpwn.com>2019-02-15 21:01:54 -0500
committerLibravatar Brian Ashworth <bosrsf04@gmail.com>2019-02-17 11:50:07 -0500
commit487c83f0de9ca2a7650ad636eed6fd694ddcb82e (patch)
tree1d679e8eb33c62bd60c14a4be4f3d5c8d89082fe /sway/tree/workspace.c
parentRemove refs to unimplemented debuglog command (diff)
downloadsway-487c83f0de9ca2a7650ad636eed6fd694ddcb82e.tar.gz
sway-487c83f0de9ca2a7650ad636eed6fd694ddcb82e.tar.zst
sway-487c83f0de9ca2a7650ad636eed6fd694ddcb82e.zip
Add workspace {prev,next}_on_output --create
This creates the next workspace if you hit the end.
Diffstat (limited to 'sway/tree/workspace.c')
-rw-r--r--sway/tree/workspace.c29
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 */
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) {