all repos — openbox @ 9d7608789c81d950e0f8528e24e684daa2d81790

openbox fork - make it a bit more like ryudo

another little focus cleanup/rearrangement, for focus going to windows that
are no longer there.
Dana Jansens danakj@orodu.net
commit

9d7608789c81d950e0f8528e24e684daa2d81790

parent

53e75c5be435b8af86ba2de3dedb59ad4f74e6d9

2 files changed, 25 insertions(+), 3 deletions(-)

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

@@ -525,7 +525,8 @@

/* update the list hints */ client_set_list(); - ob_debug("Managed window 0x%lx (%s)\n", window, self->class); + ob_debug("Managed window 0x%lx plate 0x%x (%s)\n", + window, self->frame->plate, self->class); return; }

@@ -567,7 +568,8 @@ {

guint j; GSList *it; - ob_debug("Unmanaging window: %lx (%s) (%s)\n", self->window, + ob_debug("Unmanaging window: 0x%x plate 0x%x (%s) (%s)\n", + self->window, self->frame->plate, self->class, self->title ? self->title : ""); g_assert(self != NULL);
M openbox/event.copenbox/event.c

@@ -315,7 +315,7 @@ /* It was on a client, was it a valid one?

It's possible to get a FocusIn event for a client that was managed but has disappeared. Don't even parse those FocusIn events. */ - { + if (in_client_only) { ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window); if (!w || !WINDOW_IS_CLIENT(w)) return FALSE;

@@ -518,6 +518,26 @@ focus_left_screen = FALSE;

if (!focus_left_screen) focus_fallback(TRUE); + } + } + else if (!client) + { + XEvent ce; + + ob_debug_type(OB_DEBUG_FOCUS, + "Focus went to a window that is already gone\n"); + + /* If you send focus to a window and then it disappears, you can + get the FocusIn FocusOut for it, after it is unmanaged. + */ + if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client, + NULL)) + { + XPutBackEvent(ob_display, &ce); + ob_debug_type(OB_DEBUG_FOCUS, + " but another FocusIn is coming\n"); + } else { + focus_fallback(TRUE); } } else if (client != focus_client) {