another little focus cleanup/rearrangement, for focus going to windows that

are no longer there.
This commit is contained in:
Dana Jansens 2007-05-14 01:06:42 +00:00
parent 53e75c5be4
commit 9d7608789c
2 changed files with 25 additions and 3 deletions

View file

@ -525,7 +525,8 @@ void client_manage(Window window)
/* 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 @@ void client_unmanage(ObClient *self)
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);

View file

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