diff options
author | Richard Grenville <pyxlcy@gmail.com> | 2012-11-27 00:02:18 +0800 |
---|---|---|
committer | Richard Grenville <pyxlcy@gmail.com> | 2012-11-27 08:41:55 +0800 |
commit | 722252851570be312d369767cce119eac63db63c (patch) | |
tree | a1bc1cbb07e758e73c999f1f360e49c7674bbe0a | |
parent | f126bf72f869a647db9e7e434b72b269eeffa48e (diff) | |
download | tdebase-722252851570be312d369767cce119eac63db63c.tar.gz tdebase-722252851570be312d369767cce119eac63db63c.zip |
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().
-rw-r--r-- | compton.c | 13 | ||||
-rw-r--r-- | compton.h | 7 |
2 files changed, 16 insertions, 4 deletions
@@ -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); @@ -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 <code>win</code> of current active window. Used by + /// EWMH <code>_NET_ACTIVE_WINDOW</code> 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 === |