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:
Dana Jansens 2003-03-30 22:58:04 +00:00
parent 71ade2a9b9
commit a6d9be4f66
2 changed files with 20 additions and 19 deletions

View file

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

View file

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