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

View file

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