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().
This commit is contained in:
Richard Grenville 2012-11-27 00:02:18 +08:00
parent 9ca20e7e32
commit 0f851b17a2
2 changed files with 16 additions and 4 deletions

View File

@ -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);

View File

@ -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 ===