diff --git a/src/compton.c b/src/compton.c index 4e1bbde..cb6489e 100644 --- a/src/compton.c +++ b/src/compton.c @@ -344,7 +344,7 @@ void recheck_focus(session_t *ps) { // And we set the focus state here if (w) { - win_set_focused(ps, w, true); + win_set_focused(ps, w); return; } } @@ -864,7 +864,7 @@ void update_ewmh_active_win(session_t *ps) { // Mark the window focused. No need to unfocus the previous one. if (w) { - win_set_focused(ps, w, true); + win_set_focused(ps, w); } } diff --git a/src/win.c b/src/win.c index c4c8162..e88398e 100644 --- a/src/win.c +++ b/src/win.c @@ -1356,25 +1356,27 @@ static void win_on_focus_change(session_t *ps, struct managed_win *w) { #endif } +static void win_unset_focused(session_t *ps, struct managed_win *w) { + if (w == ps->active_win) { + ps->active_win = NULL; + } +} + /** * Set real focused state of a window. */ -void win_set_focused(session_t *ps, struct managed_win *w, bool focused) { +void win_set_focused(session_t *ps, struct managed_win *w) { // Unmapped windows will have their focused state reset on map - if (w->a.map_state == XCB_MAP_STATE_UNMAPPED) + if (w->a.map_state != XCB_MAP_STATE_VIEWABLE) { return; + } - if (win_is_focused_real(ps, w) == focused) + if (win_is_focused_real(ps, w)) { return; + } - if (focused) { - if (ps->active_win) - win_set_focused(ps, ps->active_win, false); - ps->active_win = w; - } else if (w == ps->active_win) - ps->active_win = NULL; - - assert(win_is_focused_real(ps, w) == focused); + ps->active_win = w; + assert(win_is_focused_real(ps, w)); win_on_focus_change(ps, w); } @@ -1598,10 +1600,7 @@ static void finish_destroy_win(session_t *ps, struct managed_win **_w) { log_trace("Trying to destroy (%#010x)", w->base.id); list_remove(&w->base.stack_neighbour); - if (w == ps->active_win) { - ps->active_win = NULL; - } - + win_unset_focused(ps, w); free_win_res(ps, w); // Drop w from all prev_trans to avoid accessing freed memory in @@ -1770,7 +1769,7 @@ void unmap_win(session_t *ps, struct managed_win **_w, bool destroy) { } // Set focus out - win_set_focused(ps, w, false); + win_unset_focused(ps, w); w->a.map_state = XCB_MAP_STATE_UNMAPPED; w->state = target_state; diff --git a/src/win.h b/src/win.h index 6d9f81f..b366801 100644 --- a/src/win.h +++ b/src/win.h @@ -335,7 +335,7 @@ void win_set_invert_color_force(session_t *ps, struct managed_win *w, switch_t v /** * Set real focused state of a window. */ -void win_set_focused(session_t *ps, struct managed_win *w, bool focused); +void win_set_focused(session_t *ps, struct managed_win *w); bool attr_pure win_should_fade(session_t *ps, const struct managed_win *w); void win_update_prop_shadow_raw(session_t *ps, struct managed_win *w); void win_update_prop_shadow(session_t *ps, struct managed_win *w);