summaryrefslogtreecommitdiff
path: root/openbox/event.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbox/event.c')
-rw-r--r--openbox/event.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/openbox/event.c b/openbox/event.c
index c8b7e6dc..99fa1bf9 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -315,7 +315,7 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only)
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;
@@ -520,6 +520,26 @@ static void event_process(const XEvent *ec, gpointer data)
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) {
focus_left_screen = FALSE;
frame_adjust_focus(client->frame, TRUE);