all repos — openbox @ a6d9be4f664cefb144e0e7ebc9c49e04bb2714e1

openbox fork - make it a bit more like ryudo

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.
Dana Jansens danakj@orodu.net
commit

a6d9be4f664cefb144e0e7ebc9c49e04bb2714e1

parent

71ade2a9b913f5d13e02aa89e3c09729348c9f82

2 files changed, 20 insertions(+), 19 deletions(-)

jump to
M openbox/event.copenbox/event.c

@@ -225,16 +225,6 @@ break;

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 @@ want will be of type NotifyAncestor. This situation does not occur

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,
M openbox/focus.copenbox/focus.c

@@ -118,10 +118,17 @@ GList *it;

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

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