From c6ff1f67f169cb2d58c77673844d4e8e010b1dc8 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Tue, 18 Sep 2018 21:53:02 +1000 Subject: [PATCH] Fix double iteration of scratchpad containers root_for_each_container and root_find_container were using incorrect logic to determine if a container was hidden in the scratchpad. Containers will have a NULL parent if they are a direct child of a workspace. Containers will have a NULL workspace if they are hidden in the scratchpad. The incorrect check meant that root_for_each_container would run the callback on scratchpad containers twice. This meant that executing a command such as `[class="$something"] scratchpad show` would cause the command to run twice, resulting in the container being shown and hidden again which is effectively a no op. Fixes #2655. --- sway/tree/root.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sway/tree/root.c b/sway/tree/root.c index ecc04ddbb..d6f67bd76 100644 --- a/sway/tree/root.c +++ b/sway/tree/root.c @@ -265,10 +265,10 @@ void root_for_each_container(void (*f)(struct sway_container *con, void *data), // Scratchpad for (int i = 0; i < root->scratchpad->length; ++i) { struct sway_container *container = root->scratchpad->items[i]; - // If the container has a parent then it's visible on a workspace + // If the container has a workspace then it's visible on a workspace // and will have been iterated in the previous for loop. So we only // iterate the hidden scratchpad containers here. - if (!container->parent) { + if (!container->workspace) { f(container, data); container_for_each_child(container, f, data); } @@ -311,7 +311,7 @@ struct sway_container *root_find_container( // Scratchpad for (int i = 0; i < root->scratchpad->length; ++i) { struct sway_container *container = root->scratchpad->items[i]; - if (!container->parent) { + if (!container->workspace) { if (test(container, data)) { return container; }