From 0f851b17a2650d4511a762e7bf49e50e3f88d192 Mon Sep 17 00:00:00 2001 From: Richard Grenville Date: Tue, 27 Nov 2012 00:02:18 +0800 Subject: [PATCH] Bug fix: --use-ewmh-active-win causes wrong focus state in Awesome - Fix a bug that causes wrong focus detection result in Awesome and maybe other window managers, when --use-ewmh-active-win is enabled and _NET_ACTIVE_WINDOW changes before the newly-focused window is mapped. - Fix a typo that causes more than one window to stay focused after a window destruction with --use-ewmh-active-win. - Fix a bug that find_clientwin() incorrectly returns a window when window ID 0 is passed to it. - Check for window ID 0 in update_ewmh_active_win(). --- src/compton.c | 13 +++++++++++-- src/compton.h | 7 +++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/compton.c b/src/compton.c index 6e2784f9..045c536c 100644 --- a/src/compton.c +++ b/src/compton.c @@ -849,6 +849,9 @@ determine_evmask(session_t *ps, Window wid, win_evmode_t mode) { */ static win * find_win(session_t *ps, Window id) { + if (!id) + return NULL; + win *w; for (w = ps->list; w; w = w->next) { @@ -867,6 +870,9 @@ find_win(session_t *ps, Window id) { */ static win * find_toplevel(session_t *ps, Window id) { + if (!id) + return NULL; + win *w; for (w = ps->list; w; w = w->next) { @@ -1775,6 +1781,9 @@ map_win(session_t *ps, Window id) { if (!w || InputOnly == w->a.class) return; w->focused = false; + if (ps->o.use_ewmh_active_win && w == ps->active_win) + w->focused = true; + w->a.map_state = IsViewable; // Call XSelectInput() before reading properties so that no property @@ -2484,7 +2493,7 @@ finish_destroy_win(session_t *ps, Window id) { *prev = w->next; // Clear active_win if it's pointing to the destroyed window - if (ps->active_win) + if (w == ps->active_win) ps->active_win = NULL; free_win_res(ps, w); @@ -3024,7 +3033,7 @@ update_ewmh_active_win(session_t *ps) { win *w = NULL; free_winprop(&prop); - if (!(w = find_toplevel(ps, wid))) + if (wid && !(w = find_toplevel(ps, wid))) if (!(w = find_win(ps, wid))) w = find_toplevel2(ps, wid); diff --git a/src/compton.h b/src/compton.h index ed325006..de4d84e5 100644 --- a/src/compton.h +++ b/src/compton.h @@ -378,8 +378,11 @@ typedef struct { // === Window related === /// Linked list of all windows. struct _win *list; - /// Current active window. Used by EWMH _NET_ACTIVE_WINDOW focus - /// detection. + /// Pointer to win of current active window. Used by + /// EWMH _NET_ACTIVE_WINDOW focus detection. In theory, + /// it's more reliable to store the window ID directly here, just in + /// case the WM does something extraordinary, but caching the pointer + /// means another layer of complexity. struct _win *active_win; // === Shadow/dimming related ===