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:
|
case FocusIn:
|
||||||
g_message("FocusIn on %lx mode %d detail %d", window,
|
g_message("FocusIn on %lx mode %d detail %d", window,
|
||||||
e->xfocus.mode, e->xfocus.detail);
|
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
|
/* NotifyAncestor is not ignored in FocusIn like it is in FocusOut
|
||||||
because of RevertToPointerRoot. If the focus ends up reverting to
|
because of RevertToPointerRoot. If the focus ends up reverting to
|
||||||
pointer root on a workspace change, then the FocusIn event that we
|
pointer root on a workspace change, then the FocusIn event that we
|
||||||
|
@ -242,7 +232,14 @@ void event_process(XEvent *e)
|
||||||
for FocusOut, so it is safely ignored there.
|
for FocusOut, so it is safely ignored there.
|
||||||
*/
|
*/
|
||||||
if (e->xfocus.detail == NotifyInferior ||
|
if (e->xfocus.detail == NotifyInferior ||
|
||||||
e->xfocus.detail > NotifyNonlinearVirtual) return;
|
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);
|
g_message("FocusIn on %lx", window);
|
||||||
break;
|
break;
|
||||||
case FocusOut:
|
case FocusOut:
|
||||||
|
|
|
@ -118,10 +118,17 @@ void focus_fallback(gboolean switching_desks)
|
||||||
gboolean under = FALSE;
|
gboolean under = FALSE;
|
||||||
Client *old = NULL;
|
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) {
|
if (switching_desks) {
|
||||||
/* don't skip any windows when switching desktops */
|
/* don't skip any windows when switching desktops */
|
||||||
old = focus_client;
|
old = NULL;
|
||||||
focus_client = NULL;
|
|
||||||
} else {
|
} else {
|
||||||
if (!config_get("focusFollowsMouse", Config_Bool, &focus_follow))
|
if (!config_get("focusFollowsMouse", Config_Bool, &focus_follow))
|
||||||
g_assert_not_reached();
|
g_assert_not_reached();
|
||||||
|
@ -131,14 +138,11 @@ void focus_fallback(gboolean switching_desks)
|
||||||
|
|
||||||
if (!under) {
|
if (!under) {
|
||||||
for (it = focus_order[screen_desktop]; it != NULL; it = it->next) {
|
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
|
/* if we're switching desktops, and we get the already focused
|
||||||
window, then we wont get a FocusIn for it, so just restore
|
window, then we wont get a FocusIn for it, so just restore
|
||||||
the focus_client so that we know it is focused */
|
the focus_client so that we know it is focused */
|
||||||
if (it->data == old) {
|
if (client_focus(it->data))
|
||||||
focus_client = old;
|
|
||||||
break;
|
|
||||||
} else if (client_focus(it->data))
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue