aboutsummaryrefslogtreecommitdiffstats
path: root/sway/tree/workspace.c
diff options
context:
space:
mode:
authorLibravatar Ronan Pigott <rpigott@berkeley.edu>2020-10-25 14:20:11 -0700
committerLibravatar Tudor Brindus <me@tbrindus.ca>2020-12-20 00:58:42 -0500
commitece6a1d408456ade74c88dee7d4b9e0491f0bdaf (patch)
tree09f5a40a02347c927a91ab66da6c794cfd787c97 /sway/tree/workspace.c
parentRevert "commands/move: maintain workspace_layout when moving" (diff)
downloadsway-ece6a1d408456ade74c88dee7d4b9e0491f0bdaf.tar.gz
sway-ece6a1d408456ade74c88dee7d4b9e0491f0bdaf.tar.zst
sway-ece6a1d408456ade74c88dee7d4b9e0491f0bdaf.zip
Change workspace_layout to match i3 behavior
In i3, the workspace_layout command does not affect the workspace layout. Instead, new workspace level containers are wrapped in the desired layout and the workspace layout always defaults to the output orientation.
Diffstat (limited to 'sway/tree/workspace.c')
-rw-r--r--sway/tree/workspace.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index ffcbe933..e40792ae 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -627,6 +627,21 @@ struct sway_container *workspace_find_container(struct sway_workspace *ws,
627 return NULL; 627 return NULL;
628} 628}
629 629
630static void set_workspace(struct sway_container *container, void *data) {
631 container->workspace = container->parent->workspace;
632}
633
634static void workspace_attach_tiling(struct sway_workspace *ws,
635 struct sway_container *con) {
636 list_add(ws->tiling, con);
637 con->workspace = ws;
638 container_for_each_child(con, set_workspace, NULL);
639 container_handle_fullscreen_reparent(con);
640 workspace_update_representation(ws);
641 node_set_dirty(&ws->node);
642 node_set_dirty(&con->node);
643}
644
630struct sway_container *workspace_wrap_children(struct sway_workspace *ws) { 645struct sway_container *workspace_wrap_children(struct sway_workspace *ws) {
631 struct sway_container *fs = ws->fullscreen; 646 struct sway_container *fs = ws->fullscreen;
632 struct sway_container *middle = container_create(NULL); 647 struct sway_container *middle = container_create(NULL);
@@ -636,7 +651,7 @@ struct sway_container *workspace_wrap_children(struct sway_workspace *ws) {
636 container_detach(child); 651 container_detach(child);
637 container_add_child(middle, child); 652 container_add_child(middle, child);
638 } 653 }
639 workspace_add_tiling(ws, middle); 654 workspace_attach_tiling(ws, middle);
640 ws->fullscreen = fs; 655 ws->fullscreen = fs;
641 return middle; 656 return middle;
642} 657}
@@ -668,15 +683,14 @@ void workspace_detach(struct sway_workspace *workspace) {
668 node_set_dirty(&output->node); 683 node_set_dirty(&output->node);
669} 684}
670 685
671static void set_workspace(struct sway_container *container, void *data) { 686struct sway_container *workspace_add_tiling(struct sway_workspace *workspace,
672 container->workspace = container->parent->workspace;
673}
674
675void workspace_add_tiling(struct sway_workspace *workspace,
676 struct sway_container *con) { 687 struct sway_container *con) {
677 if (con->workspace) { 688 if (con->workspace) {
678 container_detach(con); 689 container_detach(con);
679 } 690 }
691 if (config->default_layout != L_NONE) {
692 con = container_split(con, config->default_layout);
693 }
680 list_add(workspace->tiling, con); 694 list_add(workspace->tiling, con);
681 con->workspace = workspace; 695 con->workspace = workspace;
682 container_for_each_child(con, set_workspace, NULL); 696 container_for_each_child(con, set_workspace, NULL);
@@ -684,6 +698,7 @@ void workspace_add_tiling(struct sway_workspace *workspace,
684 workspace_update_representation(workspace); 698 workspace_update_representation(workspace);
685 node_set_dirty(&workspace->node); 699 node_set_dirty(&workspace->node);
686 node_set_dirty(&con->node); 700 node_set_dirty(&con->node);
701 return con;
687} 702}
688 703
689void workspace_add_floating(struct sway_workspace *workspace, 704void workspace_add_floating(struct sway_workspace *workspace,
@@ -699,13 +714,13 @@ void workspace_add_floating(struct sway_workspace *workspace,
699 node_set_dirty(&con->node); 714 node_set_dirty(&con->node);
700} 715}
701 716
702void workspace_insert_tiling(struct sway_workspace *workspace, 717struct sway_container *workspace_insert_tiling(struct sway_workspace *workspace,
703 struct sway_container *con, int index) { 718 struct sway_container *con, int index) {
704 if (con->workspace) { 719 if (con->workspace) {
705 container_detach(con); 720 container_detach(con);
706 } 721 }
707 if (workspace->layout == L_STACKED || workspace->layout == L_TABBED) { 722 if (config->default_layout != L_NONE) {
708 con = container_split(con, workspace->layout); 723 con = container_split(con, config->default_layout);
709 } 724 }
710 list_insert(workspace->tiling, index, con); 725 list_insert(workspace->tiling, index, con);
711 con->workspace = workspace; 726 con->workspace = workspace;
@@ -714,6 +729,7 @@ void workspace_insert_tiling(struct sway_workspace *workspace,
714 workspace_update_representation(workspace); 729 workspace_update_representation(workspace);
715 node_set_dirty(&workspace->node); 730 node_set_dirty(&workspace->node);
716 node_set_dirty(&con->node); 731 node_set_dirty(&con->node);
732 return con;
717} 733}
718 734
719void workspace_add_gaps(struct sway_workspace *ws) { 735void workspace_add_gaps(struct sway_workspace *ws) {