From d4e682690a2628b4973e08d231e5af96336eb8a0 Mon Sep 17 00:00:00 2001 From: Reginald Kennedy Date: Sat, 29 Sep 2012 02:17:02 +0800 Subject: [PATCH] Fix focus fallback behavior when iconified windows exist in the ws. --- spectrwm.c | 71 ++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/spectrwm.c b/spectrwm.c index 648387c..8e48ef5 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -3622,37 +3622,70 @@ get_focus_prev(struct ws_win *win) if (winfocus == NULL || winfocus == win) { switch (focus_close) { case SWM_STACK_BOTTOM: - winfocus = TAILQ_FIRST(wl); + TAILQ_FOREACH(winfocus, wl, entry) + if (!winfocus->iconic && winfocus != cur_focus) + break; break; case SWM_STACK_TOP: - winfocus = TAILQ_LAST(wl, ws_win_list); + TAILQ_FOREACH_REVERSE(winfocus, wl, ws_win_list, entry) + if (!winfocus->iconic && winfocus != cur_focus) + break; break; case SWM_STACK_ABOVE: - if ((winfocus = TAILQ_NEXT(cur_focus, entry)) == NULL) { - if (focus_close_wrap) - winfocus = TAILQ_FIRST(wl); - else - winfocus = TAILQ_PREV(cur_focus, - ws_win_list, entry); + winfocus = TAILQ_NEXT(cur_focus, entry); + while (winfocus && winfocus->iconic) + winfocus = TAILQ_NEXT(winfocus, entry); + + if (winfocus == NULL) { + if (focus_close_wrap) { + TAILQ_FOREACH(winfocus, wl, entry) + if (!winfocus->iconic && + winfocus != cur_focus) + break; + } else { + TAILQ_FOREACH_REVERSE(winfocus, wl, + ws_win_list, entry) + if (!winfocus->iconic && + winfocus != cur_focus) + break; + } } break; case SWM_STACK_BELOW: - if ((winfocus = TAILQ_PREV(cur_focus, ws_win_list, - entry)) == NULL) { - if (focus_close_wrap) - winfocus = TAILQ_LAST(wl, ws_win_list); - else - winfocus = TAILQ_NEXT(cur_focus, entry); + winfocus = TAILQ_PREV(cur_focus, ws_win_list, entry); + while (winfocus && winfocus->iconic) + winfocus = TAILQ_PREV(winfocus, ws_win_list, + entry); + + if (winfocus == NULL) { + if (focus_close_wrap) { + TAILQ_FOREACH_REVERSE(winfocus, wl, + ws_win_list, entry) + if (!winfocus->iconic && + winfocus != cur_focus) + break; + } else { + TAILQ_FOREACH(winfocus, wl, entry) + if (!winfocus->iconic && + winfocus != cur_focus) + break; + } } break; } } done: - if (winfocus == NULL) { - if (focus_default == SWM_STACK_TOP) - winfocus = TAILQ_LAST(wl, ws_win_list); - else - winfocus = TAILQ_FIRST(wl); + if (winfocus == NULL || + (winfocus && (winfocus->iconic || winfocus == cur_focus))) { + if (focus_default == SWM_STACK_TOP) { + TAILQ_FOREACH_REVERSE(winfocus, wl, ws_win_list, entry) + if (!winfocus->iconic && winfocus != cur_focus) + break; + } else { + TAILQ_FOREACH(winfocus, wl, entry) + if (!winfocus->iconic && winfocus != cur_focus) + break; + } } kill_refs(win); -- 1.7.10.4