/* 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;
}
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);
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;
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);