yet more focus fixings. RevertToPointerRoot could mess things up focusing a client and us ignoring the FocusIn of Pointer type. this is all handled now.
This commit is contained in:
parent
71ade2a9b9
commit
a6d9be4f66
2 changed files with 20 additions and 19 deletions
|
@ -225,16 +225,6 @@ void event_process(XEvent *e)
|
|||
case FocusIn:
|
||||
g_message("FocusIn on %lx mode %d detail %d", window,
|
||||
e->xfocus.mode, e->xfocus.detail);
|
||||
if (client == NULL) {
|
||||
/* says a client was not found for the event!
|
||||
this is important whether the event is a valid type for us or
|
||||
not! this makes the evil known as mozilla not DESTROY my
|
||||
precious wm!! YES ITS FIVE AM AND I AM NOT SANE RIGHT NOW. FOCUS
|
||||
EVENTS WILL DRIVE YOU MAD.
|
||||
*/
|
||||
e->xfocus.window = None;
|
||||
}
|
||||
|
||||
/* NotifyAncestor is not ignored in FocusIn like it is in FocusOut
|
||||
because of RevertToPointerRoot. If the focus ends up reverting to
|
||||
pointer root on a workspace change, then the FocusIn event that we
|
||||
|
@ -242,8 +232,15 @@ void event_process(XEvent *e)
|
|||
for FocusOut, so it is safely ignored there.
|
||||
*/
|
||||
if (e->xfocus.detail == NotifyInferior ||
|
||||
e->xfocus.detail > NotifyNonlinearVirtual) return;
|
||||
g_message("FocusIn on %lx", window);
|
||||
e->xfocus.detail > NotifyNonlinearVirtual || client == NULL) {
|
||||
/* says a client was not found for the event (or a valid FocusIn
|
||||
event was not found.
|
||||
*/
|
||||
e->xfocus.window = None;
|
||||
return;
|
||||
}
|
||||
|
||||
g_message("FocusIn on %lx", window);
|
||||
break;
|
||||
case FocusOut:
|
||||
g_message("FocusOut on %lx mode %d detail %d", window,
|
||||
|
|
|
@ -118,10 +118,17 @@ void focus_fallback(gboolean switching_desks)
|
|||
gboolean under = FALSE;
|
||||
Client *old = NULL;
|
||||
|
||||
old = focus_client;
|
||||
|
||||
/* unfocus any focused clients.. they can be focused by Pointer events
|
||||
and such, and then when I try focus them, I won't get a FocusIn event
|
||||
at all for them.
|
||||
*/
|
||||
focus_set_client(NULL);
|
||||
|
||||
if (switching_desks) {
|
||||
/* don't skip any windows when switching desktops */
|
||||
old = focus_client;
|
||||
focus_client = NULL;
|
||||
old = NULL;
|
||||
} else {
|
||||
if (!config_get("focusFollowsMouse", Config_Bool, &focus_follow))
|
||||
g_assert_not_reached();
|
||||
|
@ -131,14 +138,11 @@ void focus_fallback(gboolean switching_desks)
|
|||
|
||||
if (!under) {
|
||||
for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
|
||||
if (it->data != focus_client && client_normal(it->data)) {
|
||||
if (it->data != old && client_normal(it->data)) {
|
||||
/* if we're switching desktops, and we get the already focused
|
||||
window, then we wont get a FocusIn for it, so just restore
|
||||
the focus_client so that we know it is focused */
|
||||
if (it->data == old) {
|
||||
focus_client = old;
|
||||
break;
|
||||
} else if (client_focus(it->data))
|
||||
if (client_focus(it->data))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue