From 6728696ec8f92f8e9c7591fe4d242dd90da977cb Mon Sep 17 00:00:00 2001 From: Orestis Floros Date: Thu, 11 Oct 2018 12:05:31 +0300 Subject: [PATCH] output_push_sticky_windows: Make a bit easier to understand --- include/output.h | 9 ++++++++- src/output.c | 28 +++++++++++++++++----------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/include/output.h b/include/output.h index 31084da1..a2ad97b0 100644 --- a/include/output.h +++ b/include/output.h @@ -40,5 +40,12 @@ Output *get_output_for_con(Con *con); * Iterates over all outputs and pushes sticky windows to the currently visible * workspace on that output. * + * old_focus is used to determine if a sticky window is going to be focused. + * old_focus might be different than the currently focused container because the + * caller might need to temporarily change the focus and then call + * output_push_sticky_windows. For example, workspace_show needs to set focus to + * one of its descendants first, then call output_push_sticky_windows that + * should focus a sticky window if it was the focused in the previous workspace. + * */ -void output_push_sticky_windows(Con *to_focus); +void output_push_sticky_windows(Con *old_focus); diff --git a/src/output.c b/src/output.c index 19a7c4af..ebba5c77 100644 --- a/src/output.c +++ b/src/output.c @@ -72,8 +72,15 @@ Output *get_output_for_con(Con *con) { * Iterates over all outputs and pushes sticky windows to the currently visible * workspace on that output. * + * old_focus is used to determine if a sticky window is going to be focused. + * old_focus might be different than the currently focused container because the + * caller might need to temporarily change the focus and then call + * output_push_sticky_windows. For example, workspace_show needs to set focus to + * one of its descendants first, then call output_push_sticky_windows that + * should focus a sticky window if it was the focused in the previous workspace. + * */ -void output_push_sticky_windows(Con *to_focus) { +void output_push_sticky_windows(Con *old_focus) { Con *output; TAILQ_FOREACH(output, &(croot->focus_head), focused) { Con *workspace, *visible_ws = NULL; @@ -95,18 +102,17 @@ void output_push_sticky_windows(Con *to_focus) { child != TAILQ_END(&(current_ws->focus_head));) { Con *current = child; child = TAILQ_NEXT(child, focused); - if (current->type != CT_FLOATING_CON) + if (current->type != CT_FLOATING_CON || !con_is_sticky(current)) { continue; + } - if (con_is_sticky(current)) { - bool ignore_focus = (to_focus == NULL) || (current != to_focus->parent); - con_move_to_workspace(current, visible_ws, true, false, ignore_focus); - if (!ignore_focus) { - Con *current_ws = con_get_workspace(focused); - con_activate(con_descend_focused(current)); - /* Pushing sticky windows shouldn't change the focused workspace. */ - con_activate(con_descend_focused(current_ws)); - } + bool ignore_focus = (old_focus == NULL) || (current != old_focus->parent); + con_move_to_workspace(current, visible_ws, true, false, ignore_focus); + if (!ignore_focus) { + Con *current_ws = con_get_workspace(focused); + con_activate(con_descend_focused(current)); + /* Pushing sticky windows shouldn't change the focused workspace. */ + con_activate(con_descend_focused(current_ws)); } } } -- 2.39.2