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:
parent
9ca20e7e32
commit
0f851b17a2
|
@ -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 ===
|
||||
|
|
Loading…
Reference in New Issue