From 356063b6c084a7c2d4e3e654fe48ec79a102294b Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Wed, 1 Aug 2018 16:03:37 +0100 Subject: commands: fix layout implementation (also better name for previous split layout) --- sway/tree/workspace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index cc225e79..250d5ba7 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -59,7 +59,7 @@ struct sway_container *workspace_create(struct sway_container *output, workspace->width = output->width; workspace->height = output->height; workspace->name = !name ? NULL : strdup(name); - workspace->prev_layout = L_NONE; + workspace->prev_split_layout = L_NONE; workspace->layout = container_get_default_layout(output); struct sway_workspace *swayws = calloc(1, sizeof(struct sway_workspace)); -- cgit v1.2.3 From 85ae121caad02265b95ecea66fa864607575eb31 Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Sun, 5 Aug 2018 00:05:48 +0100 Subject: commands: complete workspace implementation Allow optional --no-auto-back-and-forth flag, as well as refactoring some logic --- sway/tree/workspace.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 250d5ba7..5e20429b 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -250,20 +250,35 @@ struct sway_container *workspace_by_name(const char *name) { current_workspace = container_parent(focus, C_WORKSPACE); current_output = container_parent(focus, C_OUTPUT); } - if (strcmp(name, "prev") == 0) { - return workspace_prev(current_workspace); - } else if (strcmp(name, "prev_on_output") == 0) { - return workspace_output_prev(current_output); - } else if (strcmp(name, "next") == 0) { - return workspace_next(current_workspace); - } else if (strcmp(name, "next_on_output") == 0) { - return workspace_output_next(current_output); - } else if (strcmp(name, "current") == 0) { - return current_workspace; + + char *name_cpy = strdup(name); + char *first_word = strtok(name_cpy, " "); + if (first_word == NULL) { + first_word = name_cpy; + } + + struct sway_container *ws = NULL; + if (strcmp(first_word, "prev") == 0) { + ws = workspace_prev(current_workspace); + } else if (strcmp(first_word, "prev_on_output") == 0) { + ws = workspace_output_prev(current_output); + } else if (strcmp(first_word, "next") == 0) { + ws = workspace_next(current_workspace); + } else if (strcmp(first_word, "next_on_output") == 0) { + ws = workspace_output_next(current_output); + } else if (strcmp(first_word, "current") == 0) { + ws = current_workspace; + } else if (strcasecmp(first_word, "back_and_forth") == 0) { + if (prev_workspace_name) { + ws = container_find(&root_container, _workspace_by_name, + (void *)prev_workspace_name); + } } else { - return container_find(&root_container, _workspace_by_name, + ws = container_find(&root_container, _workspace_by_name, (void *)name); } + free(name_cpy); + return ws; } /** @@ -364,7 +379,8 @@ struct sway_container *workspace_prev(struct sway_container *current) { return workspace_prev_next_impl(current, false); } -bool workspace_switch(struct sway_container *workspace) { +bool workspace_switch(struct sway_container *workspace, + bool no_auto_back_and_forth) { if (!workspace) { return false; } @@ -379,7 +395,7 @@ bool workspace_switch(struct sway_container *workspace) { active_ws = container_parent(focus, C_WORKSPACE); } - if (config->auto_back_and_forth + if (!no_auto_back_and_forth && config->auto_back_and_forth && active_ws == workspace && prev_workspace_name) { struct sway_container *new_ws = workspace_by_name(prev_workspace_name); -- cgit v1.2.3 From 667b8dcb67d8c3f15b52f59d228bb3146a5cdb30 Mon Sep 17 00:00:00 2001 From: Ian Fan Date: Mon, 6 Aug 2018 10:43:09 +0100 Subject: commands: check for special workspaces in workspace & move commands --- sway/tree/workspace.c | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 5e20429b..3fcad631 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -251,34 +251,23 @@ struct sway_container *workspace_by_name(const char *name) { current_output = container_parent(focus, C_OUTPUT); } - char *name_cpy = strdup(name); - char *first_word = strtok(name_cpy, " "); - if (first_word == NULL) { - first_word = name_cpy; - } - - struct sway_container *ws = NULL; - if (strcmp(first_word, "prev") == 0) { - ws = workspace_prev(current_workspace); - } else if (strcmp(first_word, "prev_on_output") == 0) { - ws = workspace_output_prev(current_output); - } else if (strcmp(first_word, "next") == 0) { - ws = workspace_next(current_workspace); - } else if (strcmp(first_word, "next_on_output") == 0) { - ws = workspace_output_next(current_output); - } else if (strcmp(first_word, "current") == 0) { - ws = current_workspace; - } else if (strcasecmp(first_word, "back_and_forth") == 0) { - if (prev_workspace_name) { - ws = container_find(&root_container, _workspace_by_name, - (void *)prev_workspace_name); - } + if (strcmp(name, "prev") == 0) { + return workspace_prev(current_workspace); + } else if (strcmp(name, "prev_on_output") == 0) { + return workspace_output_prev(current_output); + } else if (strcmp(name, "next") == 0) { + return workspace_next(current_workspace); + } else if (strcmp(name, "next_on_output") == 0) { + return workspace_output_next(current_output); + } else if (strcmp(name, "current") == 0) { + return current_workspace; + } else if (strcasecmp(name, "back_and_forth") == 0) { + return prev_workspace_name ? container_find(&root_container, + _workspace_by_name, (void *)prev_workspace_name) : NULL; } else { - ws = container_find(&root_container, _workspace_by_name, + return container_find(&root_container, _workspace_by_name, (void *)name); } - free(name_cpy); - return ws; } /** -- cgit v1.2.3 From 50f3a7ff5cf2f30b6644dc578723b60ab3f0d26d Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 7 Aug 2018 23:27:56 +1000 Subject: Fix infinite loop when focusing sticky containers via workspace command In a multi-output setup, if a sticky container is on one output and focus is on the other output, and you run (eg) `workspace 1` to focus the workspace containing the sticky container, an infinite loop would occur. It would loop infinitely because it would remove the sticky container from the workspace, add it back to the same workspace, and then decrement the iterator variable. The fix just wraps the loop in a workspace comparison. --- sway/tree/workspace.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 3fcad631..395c6c10 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -411,17 +411,20 @@ bool workspace_switch(struct sway_container *workspace, struct sway_container *floating = next_output_prev_ws->sway_workspace->floating; bool has_sticky = false; - for (int i = 0; i < floating->children->length; ++i) { - struct sway_container *floater = floating->children->items[i]; - if (floater->is_sticky) { - has_sticky = true; - container_remove_child(floater); - container_add_child(workspace->sway_workspace->floating, floater); - if (floater == focus) { - seat_set_focus(seat, NULL); - seat_set_focus(seat, floater); + if (workspace != next_output_prev_ws) { + for (int i = 0; i < floating->children->length; ++i) { + struct sway_container *floater = floating->children->items[i]; + if (floater->is_sticky) { + has_sticky = true; + container_remove_child(floater); + container_add_child(workspace->sway_workspace->floating, + floater); + if (floater == focus) { + seat_set_focus(seat, NULL); + seat_set_focus(seat, floater); + } + --i; } - --i; } } -- cgit v1.2.3 From 5653fc754b09ae5344f42f9e3df71cd4420b7d61 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 8 Aug 2018 10:04:11 +1000 Subject: Deny moving a sticky container to workspace if it's the same output Rationale: Sticky containers are always assigned to the visible workspace. The basic idea here is to check the destination's output (move.c:190). But if the command was `move container to workspace x` then a workspace might have been created for it. We could destroy the workspace in this case, but that results in unnecessary IPC events. To avoid this, the logic for `move container to workspace x` has been adjusted. It now delays creating the workspace until the end, and uses `workspace_get_initial_output` to determine and check the output before creating it. --- sway/tree/workspace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'sway/tree/workspace.c') diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 395c6c10..b8bec044 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -18,7 +18,7 @@ #include "log.h" #include "util.h" -static struct sway_container *get_workspace_initial_output(const char *name) { +struct sway_container *workspace_get_initial_output(const char *name) { struct sway_container *parent; // Search for workspace<->output pair int e = config->workspace_outputs->length; @@ -48,7 +48,7 @@ static struct sway_container *get_workspace_initial_output(const char *name) { struct sway_container *workspace_create(struct sway_container *output, const char *name) { if (output == NULL) { - output = get_workspace_initial_output(name); + output = workspace_get_initial_output(name); } wlr_log(WLR_DEBUG, "Added workspace %s for output %s", name, output->name); -- cgit v1.2.3